दो बिंदुओं के बीच ऊंचाई अंतर प्राप्त करने के लिए पायथन लिपि [बंद]


10

मेरे पास कई धारा खंड 1000 किलोमीटर लंबे हैं। मुझे ऊपर से नीचे की ओर शुरू होने वाली दूरी 1 किमी के दो लगातार बिंदुओं के बीच ऊंचाई के अंतर को खोजने की आवश्यकता है। मैं डेम से ऊंचाई का अंतर कैसे प्राप्त कर सकता हूं? मेरे पास रेखापुंज प्रारूप में और सदिश प्रारूप में भी खंड हैं। बेहतर होगा कि मैं पायथन स्क्रिप्ट पर कुछ विचार करूं।


: एक बिंदु पर पदोन्नति हो रही gis.stackexchange.com/questions/29632/...
UnderDark

जवाबों:


24

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

मैं यहां एक सारांश अंग्रेजी में प्रस्तुत करता हूं:

  • आपको यह दिखाने के लिए कि DEM के उन्नयन मूल्यों को कैसे निकाला जाए
  • इन मूल्यों का इलाज कैसे करें

यदि आप GDAL / OGR पायथन मॉड्यूल के साथ DEM खोलते हैं:

from osgeo import gdal
# raster dem10m
file = 'dem10m.asc'
layer = gdal.Open(file)
gt =layer.GetGeoTransform()
bands = layer.RasterCount
print bands
1
print gt
(263104.72544800001, 10.002079999999999, 0.0, 155223.647811, 0.0, -10.002079999999999)

नतीजतन, आपके पास बैंड की संख्या और जियोट्रांसफॉर्म पैरामीटर हैं। यदि आप xy बिंदु के तहत रेखापुंज का मान निकालना चाहते हैं:

x,y  = (263220.5,155110.6)
# transform to raster point coordinates
rasterx = int((x - gt[0]) / gt[1])
rastery = int((y - gt[3]) / gt[5])
# only one band here
print layer.GetRasterBand(1).ReadAsArray(rasterx,rastery, 1, 1)
array([[222]]) 

जैसा कि यह एक डीईएम है, आपको बिंदु के तहत ऊंचाई मूल्य मिलता है। एक ही xy बिंदु के साथ 3 रेखापुंज बैंड के साथ आपको 3 मान (आर, जी, बी) मिलते हैं। तो आप एक ऐसा कार्य कर सकते हैं, जो एक एक्स पॉइंट के तहत कई चूहों के मूल्यों को प्राप्त करने की अनुमति देता है:

def Val_raster(x,y,layer,bands,gt):
    col=[]
    px = int((x - gt[0]) / gt[1])
    py =int((y - gt[3]) / gt[5])
    for j in range(bands):
        band = layer.GetRasterBand(j+1)
        data = band.ReadAsArray(px,py, 1, 1)
        col.append(data[0][0])
  return col

आवेदन

# with a DEM (1 band)
px1 = int((x - gt1[0]) / gt1[1])
py1 = int((y - gt1[3]) / gt1[5])
print Val_raster(x,y,layer, band,gt)
[222] # elevation
# with a geological map (3 bands)
px2 = int((x - gt2[0]) / gt2[1])
py2 = int((y - gt2[3]) / gt2[5])
print Val_raster(x,y,couche2, bandes2,gt2)
[253, 215, 118] # RGB color  

उसके बाद, आप लाइन प्रोफाइल को प्रोसेस करते हैं (जिसमें सेगमेंट हो सकते हैं):

# creation of an empty ogr linestring to handle all possible segments of a line with  Union (combining the segements)
profilogr = ogr.Geometry(ogr.wkbLineString)
# open the profile shapefile
source = ogr.Open('profilline.shp')
cshp = source.GetLayer()
# union the segments of the line
for element in cshp:
   geom =element.GetGeometryRef()
   profilogr = profilogr.Union(geom)

लाइन पर समान दूरी पर अंक बनाने के लिए, आप उपयोग कर सकते सुडौल लगाना साथ मॉड्यूल (आसान OGR से)

from shapely.wkb import loads
# transformation in Shapely geometry
profilshp = loads(profilogr.ExportToWkb())
# creation the equidistant points on the line with a step of 20m
lenght=profilshp.length
x = []
y = []
z = []
# distance of the topographic profile
dista = []
for currentdistance  in range(0,lenght,20):
     # creation of the point on the line
     point = profilshp.interpolate(currentdistance)
     xp,yp=point.x, point.y
     x.append(xp)
     y.append(yp)
     # extraction of the elevation value from the MNT
     z.append(Val_raster(xp,yp,layer, bands,gt)[0]
     dista.append(currentdistance)

और परिणाम, ( भूगोलिक मानचित्र के RGB मानों के साथ) x, y, z, सूचियों के दूरी मूल्यों के साथ matplotlib और Visvis (x, y, z मान) के साथ 3D में

यहां छवि विवरण दर्ज करें

क्रॉस सेक्शन (x, करंट से ऊंचाई (डिस्टे लिस्ट)) matplotlib के साथ : यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


3
एक महान पायथोनिक समाधान बनाने के लिए और महान दिखने वाले आंकड़े बनाने के लिए matplotlib का उपयोग करने के लिए।
Fezter

क्या यह संभव नहीं है?
Ja Geo

3
मुझे नहीं पता, मैं
जीन

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