ในฐานะนักธรณีวิทยาฉันมักใช้เทคนิคนี้เพื่อสร้างส่วนทางธรณีวิทยาใน Python บริสุทธิ์ ฉันนำเสนอโซลูชันที่สมบูรณ์แบบในPython: การใช้เวกเตอร์และเลเยอร์แรสเตอร์ในมุมมองทางธรณีวิทยาโดยไม่ต้องใช้ซอฟต์แวร์ GIS (ภาษาฝรั่งเศส)
ฉันนำเสนอบทสรุปเป็นภาษาอังกฤษที่นี่:
- เพื่อแสดงวิธีแยกค่าระดับความสูงของ DEM
- วิธีการปฏิบัติต่อค่าเหล่านี้
หากคุณเปิด DEM ด้วยโมดูล GDAL / OGR Python:
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 คุณจะได้รับค่าระดับความสูงภายใต้จุด ด้วย 3 แถบแรสเตอร์ที่มีจุด xy เหมือนกันคุณจะได้รับ 3 ค่า (R, G, B) ดังนั้นคุณสามารถสร้างฟังก์ชั่นที่อนุญาตให้รับค่าของ rasters หลาย ๆ อันภายใต้จุด 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, ค่าระยะทางของรายการในแบบ 3 มิติด้วยmatplotlibและVisvis (ค่า x, y, z)
ภาพตัดขวาง (x, ระดับความสูงจากระยะทางปัจจุบัน (รายการ dista)) ด้วยmatplotlib :