2点間の標高差を取得するPythonスクリプト[終了]


10

1000 Kmの長さのストリームセグメントがいくつかあります。上流から下流までの距離1 Kmの2つの連続するポイント間の標高差を見つける必要があります。DEMから標高差を取得するにはどうすればよいですか?ラスター形式とベクター形式のストリームセグメントがあります。Pythonスクリプトについて何か考えがあればもっと良いでしょう。


回答:


24

地質学者として、私はこの技法をよく使用して、純粋なPythonで地質断面図を作成します。私はPythonで完全なソリューションを提示しました:GISソフトウェアを使用せずに地質学的観点でのベクターレイヤーとラスターレイヤーの使用(フランス語)

ここでは英語で要約を示します。

  • DEMの標高値を抽出する方法を示す
  • これらの値の扱い方

GDAL / OGR Pythonモジュールで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]]) 

これはDEMなので、ポイントの下の標高値を取得します。同じxyポイントを持つ3つのラスターバンドを使用すると、3つの値(R、G、B)が得られます。したがって、xyポイントの下にある複数のラスターの値を取得できる関数を作成できます。

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)

線上に等距離の点を生成するには、補間を使用してShapelyモジュールを使用できます(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を使用した 3D (x、y、z値)

ここに画像の説明を入力してください

matplotlibを使用した断面(x、currentdistanceからの標高(ディスタリスト)): ここに画像の説明を入力してください

ここに画像の説明を入力してください


3
+1は、優れたpythonicソリューションを作成するため、およびmatplotlibを使用して見栄えの良い図を作成するためです。
Fezter

これはarcpyで可能ではありませんか?
Ja Geo

3
わかりません、ArcPyを使用していません
gene

rasterxを2回入力しました。rasterx、rasteryである必要があります
Metiu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.