QGIS में पॉलीलाइन के साथ यादृच्छिक बिंदु बनाना?


11

मैं QGIS में पॉलीलाइन शेपफाइल के साथ यादृच्छिक बिंदु बनाने की कोशिश कर रहा हूं। असल में, 'रिसर्च टूल्स' में 'रैंडम पॉइंट्स' टूल की तरह लेकिन पॉलीगन्स के बजाय पॉलीइन्स के लिए।

मैंने लाइन फाइल को बहुभुज आकार के रूप में परिवर्तित करने की कोशिश की है, लेकिन यह कुछ क्षेत्रों में बहुभुज से भर जाता है, जबकि अन्य क्षेत्र लंबी लाइन के प्रकार के बहुभुज बने रहते हैं।

मैं QGIS के लिए बहुत नया हूं, और वास्तव में पायथन कोड से परिचित नहीं हूं।


यदि आप R में जाने के इच्छुक हैं, तो स्पैस्टेट पैकेज में लाइनों पर यादृच्छिक बिंदु बनाने के लिए उपकरण हैं।
मीका

कोड के लिए धन्यवाद। मैं सोच रहा था कि क्या कोई मुझे इसे संशोधित करने में मदद कर सकता है ताकि यह एक यादृच्छिक शुरुआत के साथ नियमित अंतराल पर लाइन में अंक रखे? इसकी बहुत सराहना की जाएगी। मुझे अजगर के बारे में कोई जानकारी नहीं है।

जवाबों:


14

यह कोड QGIS के सबसे अंतिम देव निर्माण पर काम करेगा।

from qgis.utils import iface
from qgis.core import *
from PyQt4.QtCore import QVariant
import random

def createRandomPoints(count):       
    # Create a new memory layer to store the points.
    vl = QgsVectorLayer("Point", "distance nodes", "memory") 
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = iface.mapCanvas().currentLayer()

    # For each selected object
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        length = geom.length()
        feats = []
        # Loop until we reach the needed count of points.
        for i in xrange(0,count):
            # Get the random distance along the line.
            distance = random.uniform(0, length)
            # Work out the location of the point at that distance.
            point = geom.interpolate(distance)

            # Create the new feature.
            fet = QgsFeature()
            fet.setAttributeMap( { 0 : distance } )
            fet.setGeometry(point)
            feats.append(fet)

        pr.addFeatures(feats)
        vl.updateExtents()  

    QgsMapLayerRegistry.instance().addMapLayer(vl)

मुझे पता है कि आपने कहा था कि आप पायथन कोड से बहुत परिचित नहीं हैं, लेकिन आपको यह बहुत आसान चलाने में सक्षम होना चाहिए। उपरोक्त कोड को एक फ़ाइल में कॉपी करें (मेरा कहा जाता है locate.py) और इसे अपने में रखें ~/.qgis/pythonयदि आप विंडोज 7 पर हैं C:\Users\{your user name}\.qgis\python\या विंडोज एक्सपी में हैंC:\Documents and Settings\{your user name}\.qgis\python\

एक बार जब फ़ाइल अजगर फ़ोल्डर में होती है तो QGIS खोलें और कुछ लाइन ऑब्जेक्ट का चयन करें।
परत चयन

फिर पायथन कंसोल को खोलें और निम्न कोड चलाएँ:

import locate.py 
locate.createRandomPoints(10)

पायथन कंसोल

परिणाम कुछ इस तरह दिखना चाहिए

परिणाम

यदि आप इसे फिर से चलाना चाहते हैं तो बस कुछ और पंक्तियों का चयन करें और locate.createRandomPoints(10)फिर से पायथन कंसोल में चलाएं ।

नोट: Find.createRandomPoints (10) 10 यहाँ प्रति पंक्ति उत्पन्न करने के लिए अंकों की संख्या है


आपकी सभी मदद का धन्यवाद! मुझे यकीन नहीं है कि कोड को बचाने के लिए क्या प्रारूप है - मैं इसे एक py एक्सटेंशन वाली फाइल कैसे बना सकता हूं? क्षमा करें यदि ये बहुत बुनियादी प्रश्न हैं।
Cec.g

टेक्स्ट को एक सामान्य टेक्स्ट फ़ाइल में कॉपी करें और इसे एक्सटेंशन के रूप में .py के साथ सेव करें।
नाथन डब्ल्यू

मैंने कोशिश की थी कि लेकिन यह इस त्रुटि के साथ आता है: ImportError: कोई भी मॉड्यूल जिसका नाम Find.py
Cec.g

यह फ़ाइल पथ है: C: \ Users \ Cecily \ .qgis \ python
Cec.g

क्या आपने import locateपायथन कंसोल में .py की कोई आवश्यकता नहीं है।
नाथन डब्ल्यू

3

आप पॉलीलाइन (न्यूनतम) बफर कर सकते हैं और फिर परिणामी बहुभुजों पर नमूना चला सकते हैं। यदि आपके पास कोई अन्य सीमित कारक हैं, उदाहरण के लिए, यह अपने आप ठीक काम कर सकता है। न्यूनतम अंतराल पर रिक्ति, घनत्व या सोमेसुच।

अधिक जटिल मामलों के लिए, मैं एक बहुत सघन यादृच्छिक नमूना बनाऊंगा और फिर एक दूसरे चरण में उचित (जो भी हो सकता है) अंक चुनें। ऐसा ही कुछ घनीभूत उपकरण के साथ किया जा सकता है, लेकिन तब सभी बिंदु पॉलीलाइन पर होंगे।

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