একজন ভূতাত্ত্বিক হিসাবে, আমি প্রায়শই বিশুদ্ধ পাইথনে ভূতাত্ত্বিক ক্রস বিভাগ তৈরি করতে এই কৌশলটি ব্যবহার করি। আমি পাইথনে একটি সম্পূর্ণ সমাধান উপস্থাপন করেছি : জিআইএস সফ্টওয়্যার ছাড়াই ভৌগলিক দৃষ্টিকোণে ভেক্টর এবং রাস্টার স্তর ব্যবহার করে (ফরাসী ভাষায়)
আমি এখানে ইংরেজিতে একটি সংক্ষিপ্তসার উপস্থাপন করছি:
- কীভাবে কোনও ডেমের উচ্চতা মানগুলি বের করতে হয় তা আপনাকে দেখানোর জন্য
- এই মানগুলি কীভাবে আচরণ করবেন
আপনি যদি জিডিএল / ওজিআর পাইথন মডিউল সহ কোনও ডেম খুলেন:
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)
ফলস্বরূপ, আপনার কাছে ব্যান্ডের সংখ্যা এবং ভূ-ট্রান্সফর্ম পরামিতি রয়েছে। আপনি যদি একটি জাই পয়েন্টের অধীনে রাস্টারটির মানটি বের করতে চান:
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]])
এটি একটি ডেম হিসাবে, আপনি পয়েন্টের নীচে উচ্চতার মান পাবেন। একই এক্স পয়েন্ট সহ 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)
এবং এক্স (ক ভূতাত্ত্বিক মানচিত্রের এছাড়াও আরজিবি মান) ফলাফল, Y, Z, সঙ্গে তালিকা 3D মধ্যে দূরত্ব মান matplotlib এবং Visvis (X, Y, Z মান)
ক্রস বিভাগে (এক্স, currentdistance থেকে টিলা (dista তালিকা)) সঙ্গে matplotlib :