İki nokta arasındaki yükseklik farkını elde etmek için Python Script [kapalı]


10

1000 Km uzunluğunda birkaç akarsu segmentim var. Yukarıdan aşağıya doğru 1 Km uzaklıktaki iki ardışık nokta arasındaki yükseklik farkını bulmam gerekiyor. DEM'den yükseklik farkını nasıl alabilirim? Raster biçiminde ve ayrıca vektör biçiminde akış segmentleri var. Python betiği hakkında bir fikrim varsa daha iyi olurdu.


Yanıtlar:


24

Bir jeolog olarak bu tekniği saf Python'da jeolojik kesit oluşturmak için sık sık kullanıyorum. Python'da eksiksiz bir çözüm sundum: GIS yazılımı olmadan vektör ve raster katmanlarını jeolojik bir bakış açısıyla kullanma (Fransızca)

Burada İngilizce bir özet sunuyoruz:

  • size bir DEM'in yükseklik değerlerinin nasıl çıkarılacağını göstermek için
  • bu değerler nasıl tedavi edilir

GDAL / OGR Python modülüyle bir DEM açarsanız:

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)

Sonuç olarak, bant sayısı ve geotransform parametreleri vardır. Raster değerini xy noktasının altında çıkarmak istiyorsanız:

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]]) 

Bir DEM olduğu için, yükselme değerini noktanın altına alırsınız. Aynı xy noktasına sahip 3 tarama bandı ile 3 değer elde edersiniz (R, G, B). Böylece, bir xy noktası altında birden fazla raster değerini almaya izin veren bir işlev yapabilirsiniz:

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

uygulama

# 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  

Bundan sonra, çizgi profilini (segmentleri olabilir) işlersiniz:

# 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)

Hat üzerinde eşit mesafede noktalar oluşturmak için, ara değer ile Shapely modülünü kullanabilirsiniz ( ogr'dan daha kolay)

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)

ve listelerin x, y, z, mesafe değerleri ile sonuçları (jeolojik haritanın RGB değerleri ile) matplotlib ve Visvis ile 3B'de (x, y, z değerleri)

resim açıklamasını buraya girin

Kesitler (x, currentdistance gelen yükseklik (dista liste)) ile matplotlib : resim açıklamasını buraya girin

resim açıklamasını buraya girin


3
Mükemmel bir pitonik çözüm oluşturmak ve mükemmel görünümlü figürler oluşturmak için matplotlib kullanmak için +1.
Fezter

Arcpy ile bu mümkün değil mi?
Ja Geo

3
Bilmiyorum, ArcPy kullanmıyorum
gen

Rasterx'i iki kez yazdınız, rasterx, rastery olmalı
Metiu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.