असाइन करें और उनके बहुभुजों को सेंट्रोइड ले जाएं


9

मैं QGIS 1.8 लिस्बोआ का उपयोग कर रहा हूं। बहुभुज आकृति से सेंट्रोइड्स की गणना करने के बाद, यदि उनमें से कुछ बहुभुज की रूपरेखा के बाहर हैं, तो मैं उन्हें उन बहुभुज पर स्थानांतरित करना चाहूंगा, जो वे आए थे। मानदंड एकतरफा होना चाहिए क्योंकि मैं उन्हें बहुभुज की पहचान कोड के रूप में उपयोग किए जाने वाले निर्देशांक निकालने के लिए उपयोग करना चाहिए। इसलिए, प्रक्रिया को एक ही पॉलीगॉन के लिए हर बार एक ही बिंदु स्थान को आउटपुट करना चाहिए (न कि "यादृच्छिक बिंदुओं" फ़ंक्शन द्वारा दिए गए एक यादृच्छिक स्थिति, जो प्रत्येक बार चलने पर एक नया परिणाम देता है)।


1
दो सवालों की तरह लगता है। अगर मैं सही तरीके से समझूं, तो आप (ए) बहुभुज के अंदर यादृच्छिक बिंदुओं को जोड़ना चाहते हैं और (ख) उन्हें या बहुभुज को इस आधार पर एक अद्वितीय आईडी देते हैं। (ए) के लिए दिमाग में आने वाली सबसे सरल बात है क्यूजीआईएस में मौजूदा यादृच्छिक बिंदु क्षमताओं का उपयोग करना और फिर उस बिंदु को अपने बहुभुज के साथ क्लाउड को काटना।
lynxlynxlynx

एक ही बहुभुज के साथ अलग-अलग समय में "यादृच्छिक अंक" फ़ंक्शन का उपयोग करने से अलग-अलग परिणाम होते हैं (अर्थात, प्रत्येक बहुभुज से प्राप्त बिंदुओं की स्थिति फ़ंक्शन के प्रत्येक नए उपयोग पर अलग होती है), और मैं एक विधि बनाना चाहता हूं जो मुझे दे हमेशा बहुभुज के समान बिंदु जहां से मैं निर्देशांक निकाल सकता हूं कि मैं खुद पॉलीगॉन के लिए पहचान कोड के रूप में उपयोग करना चाहता हूं।
umbe1987

- fTools 'सच केन्द्रक' ज्यामिति उपकरण के तहत उपकरण का उपयोग docs.qgis.org/html/en/docs/user_manual/plugins/...
Mapperz

यह सिर्फ मुझे केन्द्रक प्रदान करता है, लेकिन यह पॉलीगॉन के बाहर भी झूठ बोल सकता है, जिससे मुझे बचना चाहिए। मुझे उन्हें उस बहुभुज पर ले जाने की आवश्यकता है, जो वे कम से कम दूरी की तरह एक फ़ंक्शन का उपयोग करके प्राप्त करते हैं (लेकिन मुझे दूरी में कोई दिलचस्पी नहीं है, मैं चाहता हूं कि इसे स्थानांतरित किया जाए)। एक अन्य ब्लॉग में किसी ने मुझसे पोस्टगिस के ST_PointOnSurface (लेकिन मैं क्यूजीआईएस का उपयोग कर रहा हूं) का उपयोग करने के लिए कहा।
umbe1987

2
क्या यह अब gis.stackexchange.com/questions/50029/… का डुप्लिकेट है ?
UnderDark

जवाबों:


7

आप Shapely python पुस्तकालय का उपयोग कर सकते हैं, जो representative_point()बहुभुज के भीतर झूठ बोलने की गारंटी देता है।

यहाँ एक पायथन स्क्रिप्ट है जिसे QGIS पायथन कंसोल में चलाया जा सकता है। बहुभुज परत जिसके लिए आप विशेषता बनाना चाहते हैं, का चयन किया जाना चाहिए। फ़ंक्शन उस विशेषता का नाम लेता है जिसे आप अपडेट करना चाहते हैं। विशेषता को आपकी परत में पहले से मौजूद होना चाहिए, इसे स्ट्रिंग प्रकार होना चाहिए, और यह लंबे समय तक (30 वर्ण) होना चाहिए।

यहां उन बिंदुओं का एक उदाहरण दिया गया है जो एल्गोरिथ्म में पाए गए हैं:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()

मैं इसका परीक्षण करने की कोशिश कर रहा हूं, ठीक वही लगता है जो मैं खोज रहा था। जैसे ही मैंने इसे चलाया मैं आपको बता दूँगा!
umbe1987

एक चीज जो मुझे नहीं मिली, वह यह है कि "स्ट्रिंग प्रकार होना चाहिए, और यह लंबे समय तक (30 वर्ण)" होना चाहिए। क्या यह पुस्तकालय बहुभुज shpfiles पर सीधे काम कर रहा है? यदि हां, तो क्या मुझे कम से कम 30 चरचरों के साथ एट टैब में एक नया स्ट्रिंग प्रकार फ़ील्ड बनाने वाला है, और यह अपडेट किया जाना है?
umbe1987

@ user9518: हां, जिस तरह से फंक्शन को इस समय लिखा जाता है, वैसा ही फीचर आपको टेबल में खुद बनाना होगा, और उसके बाद ही फंक्शन के लिए फील्ड का नाम पास करना होगा। यदि आवश्यक हो, तो आवश्यक फ़ील्ड बनाने के लिए स्क्रिप्ट को आसानी से अनुकूलित किया जा सकता है।
जेक

मुझे सिर्फ एक बात याद आती है। ऐसा लगता है कि अब मैं एक फ़ंक्शन (या एक वर्ग) को "डीफ़" लिखकर परिभाषित कर रहा हूं, लेकिन तब जब मैं स्क्रिप्ट लिखने में समाप्त होता हूं तो यह कुछ भी नहीं होता है। आखिरकार मेरी तालिका में परिणाम कैसे हो सकता है?
umbe1987

1
यह पूरी तरह से काम किया !!! मैं कल्पना करता हूं कि निर्देशांक परत की समन्वय प्रणाली के अनुसार लिखे गए हैं और अगर मुझे उन बिंदुओं के साथ एक निर्देशांक बनाने की आवश्यकता है, तो सही? यदि आप यहाँ होते तो मैं आपको कम से कम 3 बियर प्रदान करता! आपके प्रयासों के लिए बहुत बहुत धन्यवाद !!!
umbe1987

5

यदि यह अवतल है, तो थ्रॉल्स सेंट्रोइड उपकरण बहुभुज के बाहर केन्द्रक को रख सकता है।

ST_PointOnSurfaceनिश्चित रूप से वही करेंगे जो आप चाहते हैं। यदि आप अपने आकृति को PostGIS में लाने के लिए SPIT का उपयोग करके स्थापित कर चुके हैं तो QGIS के अंदर से कमांड का उपयोग कर सकते हैं और फिर क्वेरी को चलाने के लिए PgQuery प्लगइन का उपयोग कर सकते हैं।

वैकल्पिक रूप से, अगर PostGIS स्थापित करने में थोड़ा ज्यादा एक बंद उपयोग के लिए है, तो आप इस्तेमाल कर सकते हैं Spatialite QGIS के भीतर से। फिर आप अपने डेटा को स्पैटियालाइट में आयात करने के लिए QSpatiaLite प्लगइन का उपयोग कर सकते हैं और क्वेरी (SpatialLite सम्मान ST_PointOnSurface) चला सकते हैं।


2

जब मैं आपको सही समझता हूं, तो उपयोग करें: वेक्टर-> अनुसंधान उपकरण_> यादृच्छिक अंक। अब "स्तरीकृत नमूनाकरण डिजाइन (व्यक्तिगत बहुभुज)" के तहत इनपुट फ़ील्ड से मूल्य का उपयोग करें और एप्रीओरेट क्षेत्र का उपयोग करें, जो अंकों का संख्यात्मक मूल्य देता है, जिसे प्रत्येक अलग बहुभुज के लिए उत्पन्न किया जाना चाहिए।


"उपयुक्त क्षेत्र" से आपका क्या तात्पर्य है? मैं सेंट्रोइड का उपयोग करने के लिए सोच रहा था और फिर इसे बहुभुज के निकटतम भाग से जोड़ता हूं, जो इसे संदर्भित करता है, यदि यह (उदाहरण के लिए) रूपरेखा के बाहर देता है, तो उस बिंदु की न्यूनतम दूरी की गणना अपने निकटतम बहुभुज से करें। तब उद्देश्य उस बिंदु को निकालने के लिए होता है ताकि बहुभुज के विशिष्ट विशिष्ट पहचान कोड के रूप में उनका उपयोग किया जा सके।
umbe1987

मूल रूप से मैं जो करने की कोशिश कर रहा हूं वह है कि अपने रिश्तेदार बहुभुज को प्रत्येक सेंट्रोइड असाइन करें और इसे अपने बहुभुज के अंदर झूठ बोलने के लिए (या कम से कम इसकी सीमा रेखा को छूने के लिए) ले जाएं।
umbe1987

@ user9518: क्षमा करें, मैंने आपके प्रश्न को गलत समझा। मुझे लगा कि आप प्रत्येक पॉली के भीतर एक विशिष्ट संख्या में यादृच्छिक अंक चाहते हैं, जैसे 2 अंक fpr पाली 1, पॉली 2 के भीतर 10 अंक आदि इसलिए "उपयुक्त क्षेत्र" शब्द। बेशक, आप प्रत्येक पॉली के लिए केवल एक अंक उत्पन्न करने के लिए "अंकों की इस संख्या का उपयोग करें" के लिए 1 का चयन कर सकते हैं। यह बिंदु पाली के अंदर है या कम से कम इसकी सीमा रेखा को छूता है। लेकिन यह बिंदु अभी भी यादृच्छिक के अनुसार पाया जाता है, इसलिए जब आप इस प्रक्रिया को फिर से प्राप्त करते हैं तो आपको अन्य बिंदु मिलते हैं :-(
कर्ट

1

realcentroids प्लगइन, प्लगइन्स के माध्यम से स्थापित करने के लिए उपलब्ध> प्रबंधित करें और इंस्टॉल करें प्लगइन्स ने QGIS 2.2 में मेरे लिए काम किया है जो सेंट्रोइड जैसे बिंदु उत्पन्न करने के लिए, प्रत्येक बहुभुज के अंदर मजबूर होता है यदि अवतल (बिंदु किनारे के बहुत करीब होगा)। मैंने कर्ट द्वारा सुझाए गए रैंडम पॉइंट टूल की कोशिश की, और हालांकि मैंने प्रति पॉलीगॉन 1 अंक निर्दिष्ट किया, यह दो के बजाय उत्पन्न करता है। एक अतिरिक्त नुकसान यह है कि ज्यादातर मामलों में, अंक सेंट्रोइड का प्रतिनिधित्व नहीं करते हैं क्योंकि वे यादृच्छिक हैं।

http://www.agt.bme.hu/gis/qgis/realcentroid/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.