두 점 사이의 고도 차이를 얻기위한 Python 스크립트 [닫기]


10

1000Km 길이의 여러 스트림 세그먼트가 있습니다. 상류에서 하류까지 거리 1Km의 두 연속 지점 사이의 고도 차이를 찾아야합니다. DEM에서 표고 차이를 얻으려면 어떻게해야합니까? 래스터 형식 및 벡터 형식의 스트림 세그먼트가 있습니다. 파이썬 스크립트에 대한 아이디어가 있다면 더 좋습니다.


답변:


24

지질학자인 저는이 기술을 순수한 파이썬에서 지질 학적 단면을 만들기 위해 종종 사용합니다. 파이썬 에서 완벽한 솔루션을 제시했습니다 .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)

선에 등거리 점을 생성하려면, 보간 ( ogr 보다 쉬운)으로 Shapely 모듈을 사용할 수 있습니다

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)

x, y, z, matplotlibVisvis (x, y, z 값)가있는 3D 목록의 거리 값이있는 결과 ( 지리학 적지도의 RGB 값 포함)

여기에 이미지 설명을 입력하십시오

matplotlib을 사용한 횡단면 (x, 현재 거리로부터의 고도 (dista 목록)) : 여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


3
훌륭한 파이 토닉 솔루션을 만들고 matplotlib을 사용하여 멋진 그림을 만드는 데 +1합니다.
Fezter

arcpy로 가능하지 않습니까?
Ja Geo

3
모르겠다, 나는 ArcPy를 사용하지 않는다
gene

rasterx를 두 번 입력했습니다. rasterx, rastery 여야합니다
Metiu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.