गुरुत्वाकर्षण / हफ मॉडल उपकरण


26

मैं एक बिंदु-आधारित परत का उपयोग करके गुरुत्वाकर्षण मॉडल का अनुकरण करने का एक तरीका ढूंढ रहा हूं।

मेरे सभी बिंदुओं को एक z- मान दिया गया है और यह मान जितना अधिक होगा, उतना ही बड़ा उनका "प्रभाव क्षेत्र" है। यह प्रभाव केंद्र से दूरी के विपरीत आनुपातिक है।

यह एक विशिष्ट हफ़ मॉडल है, प्रत्येक बिंदु एक स्थानीय अधिकतम है और उनके बीच की घाटियाँ उनके बीच के प्रभाव क्षेत्र की सीमाओं को दर्शाती हैं।

मैंने Arcgis (IDW, लागत आवंटन, बहुपद प्रक्षेप) और QGIS (हीटमैप प्लगइन) से कई एल्गोरिदम की कोशिश की, लेकिन मुझे ऐसा कुछ भी नहीं मिला जो मेरी मदद कर सके। मुझे यह धागा भी मिला , लेकिन यह मेरे लिए बहुत उपयोगी नहीं है।

एक विकल्प के रूप में, मैं वोरोनोई आरेख उत्पन्न करने के एक तरीके से संतुष्ट हो सकता हूं यदि संबंधित बिंदु के जेड-मूल्य द्वारा प्रत्येक कोशिका के आकार को प्रभावित करने का एक तरीका है।

जवाबों:


13

यहाँ एक छोटा क्यूजीआईएस पायथन फ़ंक्शन है जो इसे लागू करता है। इसके लिए रैस्टरलैंग प्लगइन (रिपॉजिटरी को मैन्युअल रूप से QGIS में जोड़ना पड़ता है) की आवश्यकता होती है।

यह तीन अनिवार्य मापदंडों की अपेक्षा करता है: अंक परत, एक रेखापुंज परत (आउटपुट के आकार और संकल्प को निर्धारित करने के लिए), और आउटपुट परत के लिए एक फ़ाइल नाम। आप दूरी के क्षय समारोह के प्रतिपादक को निर्धारित करने के लिए एक वैकल्पिक तर्क भी प्रदान कर सकते हैं।

अंक के लिए भार अंक परत के पहले विशेषता कॉलम में होना चाहिए।

परिणामी रेखापुंज स्वचालित रूप से कैनवास में जोड़ा जाता है।

यहाँ स्क्रिप्ट चलाने का एक उदाहरण दिया गया है। अंक में 20 और 90 के बीच वजन होता है, और ग्रिड 60 आकार की 50 मानचित्र इकाइयों द्वारा होता है।

points = qgis.utils.iface.mapCanvas().layer(0)
raster = qgis.utils.iface.mapCanvas().layer(1)
huff(points,raster,"output.tiff",2)

from rasterlang.layers import layerAsArray
from rasterlang.layers import writeGeoTiff
import numpy as np

def huff(points, raster, outputfile, decay=1):
    if points.type() != QgsMapLayer.VectorLayer:
        print "Error: First argument is not a vector layer (but it has to be)"
        return
    if raster.type() != QgsMapLayer.RasterLayer:
        print "Error: Second argument is not a raster layer (but it has to be)"
        return
    b = layerAsArray(raster)
    e = raster.extent()
    provider = points.dataProvider()
    extent = [e.xMinimum(),e.yMinimum(),e.xMaximum(),e.yMaximum()]
    xcols = np.size(layerAsArray(raster),1)
    ycols = np.size(layerAsArray(raster),0)
    xvec = np.linspace(extent[0], extent[2], xcols, endpoint=False)
    xvec = xvec + (xvec[1]-xvec[0])/2
    yvec = np.linspace(extent[3], extent[1], ycols, endpoint=False)
    yvec = yvec + (yvec[1]-yvec[0])/2
    coordArray = np.meshgrid(xvec,yvec)
    gravity = b
    point = QgsFeature()
    provider.select( provider.attributeIndexes() )
    while provider.nextFeature(point):
      coord = point.geometry().asPoint()
      weight = point.attributeMap()[0].toFloat()[0]
      curGravity = weight * ( (coordArray[0]-coord[0])**2 + (coordArray[1]-coord[1])**2)**(-decay/2)
      gravity = np.dstack((gravity, curGravity))
    gravitySum = np.sum(gravity,2)
    huff = np.max(gravity,2)/gravitySum
    np.shape(huff) 
    writeGeoTiff(huff,extent,outputfile)
    rlayer = QgsRasterLayer(outputfile)
    QgsMapLayerRegistry.instance().addMapLayer(rlayer)

3
(+1) दृष्टिकोण अच्छा लग रहा है। लेकिन आप वर्गमूल को क्यों लेते हैं और फिर इसे कंप्यूटिंग में फिर से वर्ग लेते हैं curGravity? यह कम्प्यूटेशनल समय की बर्बादी है। गणनाओं के एक और बर्बाद सेट में अधिकतम खोजने से पहले सभी "गुरुत्व" ग्रिड को सामान्य करना शामिल है: इसके बजाय, उनके अधिकतम को ढूंढें और उस योग को सामान्य करें।
whuber

पूरे अंश को वर्ग नहीं करता है?
lynxlynxlynx

1
जेक, आपको अभी भी वर्गमूल की आवश्यकता नहीं है: बस इसके बारे में पूरी तरह से भूल जाओ और आधे का उपयोग करें। दूसरे शब्दों में, यदि z कम्प्यूटिंग (sqrt (z)) ^ p के बजाय समन्वित अंतरों के वर्गों का योग है, जो कि दो मामूली महंगा संचालन है, तो बस z ^ (p / 2) की गणना करें, जो (क्योंकि p / 2 एक पूर्वव्यापी संख्या है ) सिर्फ एक रेखापुंज ऑपरेशन है - और स्पष्ट कोड की ओर जाता है, भी। यह विचार तब सामने आता है जब आप गुरुत्वाकर्षण मॉडल लागू करते हैं क्योंकि वे मूल रूप से इरादा थे: यात्रा के समय। अब कोई भी वर्गाकार मूल सूत्र नहीं है, इसलिए आप यात्रा का समय बढ़ाकर पी पी / 2 पॉवर कर सकते हैं।
whuber

बहुत बहुत धन्यवाद, यह वही दिखता है जो मुझे चाहिए। बस एक समस्या है, मैं अजगर के लिए अभ्यस्त नहीं हूं और मैंने रैस्टरलैंग एक्सटेंशन का इस्तेमाल कभी नहीं किया। मैंने इसे अपने क्यूजीआईएस संस्करण पर स्थापित किया है, लेकिन मैं "सिंटैक्स त्रुटि" के साथ फंस गया हूं। क्या आपका फ़ंक्शन पहले से ही रैस्टरलैंग एक्सटेंशन में लागू है? यदि नहीं, तो मैं कैसे करूँ? मदद के लिये शुक्रिया! http://i.imgur.com/NhiAe9p.png
डेमियन

1
@ जेक: ठीक है, मुझे लगता है कि मैं समझना शुरू कर देता हूं कि कंसोल कैसे काम करता है। मैंने जैसा आपने कहा था और कोड को ठीक से समझा जा रहा है। अब मेरे पास एक और त्रुटि है जो एक अजगर पैकेज "shape_base.py" से संबंधित है। क्या मेरे QGIS में कुछ विशेषताओं का अभाव है? http://i.imgur.com/TT0i2Cl.png
डेमियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.