দুটি পয়েন্টের মধ্যে উচ্চতার পার্থক্য পাওয়ার জন্য পাইথন স্ক্রিপ্ট [বন্ধ]


10

আমার 1000 কিলোমিটার দীর্ঘ বেশ কয়েকটি স্ট্রিম বিভাগ রয়েছে। উজান থেকে ডাউন স্ট্রিম পর্যন্ত শুরু করে টানা দুই কিলোমিটার দূরত্বের মধ্যবর্তী উচ্চতার পার্থক্যটি আমার সন্ধান করতে হবে। আমি কীভাবে ডিইএম থেকে উচ্চতা পার্থক্য পেতে পারি? আমার কাছে রাস্টার ফর্ম্যাট এবং ভেক্টর ফর্ম্যাটে স্ট্রিম বিভাগ রয়েছে। পাইথনের স্ক্রিপ্ট সম্পর্কে কিছু ধারণা পেলে ভাল হত।


: একটি সময়ে টিলা পেয়ে gis.stackexchange.com/questions/29632/...
underdark

উত্তর:


24

একজন ভূতাত্ত্বিক হিসাবে, আমি প্রায়শই বিশুদ্ধ পাইথনে ভূতাত্ত্বিক ক্রস বিভাগ তৈরি করতে এই কৌশলটি ব্যবহার করি। আমি পাইথনে একটি সম্পূর্ণ সমাধান উপস্থাপন করেছি : জিআইএস সফ্টওয়্যার ছাড়াই ভৌগলিক দৃষ্টিকোণে ভেক্টর এবং রাস্টার স্তর ব্যবহার করে (ফরাসী ভাষায়)

আমি এখানে ইংরেজিতে একটি সংক্ষিপ্তসার উপস্থাপন করছি:

  • কীভাবে কোনও ডেমের উচ্চতা মানগুলি বের করতে হয় তা আপনাকে দেখানোর জন্য
  • এই মানগুলি কীভাবে আচরণ করবেন

আপনি যদি জিডিএল / ওজিআর পাইথন মডিউল সহ কোনও ডেম খুলেন:

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 : এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


3
একটি দুর্দান্ত পাইথোনিক সমাধান তৈরি করার জন্য এবং দুর্দান্ত চেহারা দেখানোর জন্য ম্যাটপ্লটলিব ব্যবহারের জন্য +1।
Fezter

আরকি দিয়ে কি এটি সম্ভব নয়?
জা জিও

3
আমি জানি না, আমি আরপিপি
জেন

আপনি দুবার রাস্টার টাইপ করেছেন, এটি রাস্টারেক্স, রাস্ট্রি হওয়া উচিত
মেটিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.