পাইথন ব্যবহার করে রাস্টার থেকে ল্যাট / লম্বায় উচ্চতা অর্জন করছেন?


10

আমি ভাবছিলাম যে কারও কাছে আরকজিআইএস ব্যবহার না করে একজন রাস্টার থেকে উচ্চতার ডেটা পাওয়ার কিছু অভিজ্ঞতা আছে , তবে অজগর হিসাবে তথ্য পাবেন listবা dict?

টিপলসের একটি তালিকা হিসাবে আমি আমার এক্সওয়াই ডেটা পেয়েছি:

xy34 =[perp_obj[j].CalcPnts(float(i.dist), orientation) for j in range (len(perp_obj))]

জাই-জোড়গুলির জন্য সংশ্লিষ্ট উচ্চতা পেতে আমি তালিকাটি লুপ করতে বা কোনও ফাংশন বা শ্রেণী-পদ্ধতিতে এটি পাস করতে চাই।

আমি বিষয়টি নিয়ে কিছু গবেষণা করেছি এবং জিডিএল এপিআই আশাব্যঞ্জক। কেউ কীভাবে আমাকে জিনিস, সমস্যা, নমুনা কোড সম্পর্কে যেতে পরামর্শ দিতে পারেন?


জিডিএল কোনও বিকল্প নয় কারণ আমি যে মেশিনে কাজ করছি তাতে সিস্টেম পাথ ভেরিয়েবল সম্পাদনা করতে পারি না!

কেউ কি আলাদা পদ্ধতি সম্পর্কে জানেন?


2
দুর্ভাগ্যক্রমে, পাইথনের রাস্টারের সাথে আপনার কিছু করার জন্য আপনার সিস্টেমে GDAL চালানোর দরকার আছে। "মেশিনে সিস্টেমের পাথ ভেরিয়েবল সম্পাদনা করতে পারে না" দিয়ে আপনি কি এই নির্দেশাবলী উল্লেখ করছেন ? আমি এই ইনস্টলেশন পদ্ধতিটি খুব দুর্বল বলে মনে করি এবং আমি এটি ব্যবহার করি না বা এটির প্রস্তাবও দিই না। আপনি যদি উইন্ডোজ ব্যবহার করছেন তবে জিডিএল / পাইথনটি সহজ উপায়ে ইনস্টল করুন ।
মাইক টি

হ্যাঁ, আমি আসলেই ছিলাম। আমি এখনই কর্মস্থলে নেই তবে আপনার পোস্ট করা লিঙ্কটি আমি চেক করব। প্রতিশ্রুতিবদ্ধ মনে হচ্ছে! আমার প্রশ্নে ফিরে আসার জন্য ধন্যবাদ!
লার্সভেগাস

আমি অনেক ওয়ার্ক কম্পিউটারে ক্রিস্টোফ গোহলক দ্বারা (উপরে সংযুক্ত) ইনস্টলারটি ব্যবহার করেছি এবং এটি সত্যিই সহজ। আপনাকে কেবল এটি নিশ্চিত করতে হবে যে আপনি পাইথনের সংস্করণ এবং 32 32 বা 64-বিট উইন্ডোজের সাথে মিলে। আপনি যখন সেখানে আছেন, আপনারও একই জায়গা থেকে নুমপি পাওয়া উচিত, যেহেতু এটি জিডিএল দ্বারা প্রয়োজনীয়, নীচের উত্তরে দেখানো হয়েছে।
মাইক টি

উত্তর:


15

@ অ্যারাগন এর উত্তরের চেয়ে জিডিএল ব্যবহার করার আরও প্রোগ্রামিক উপায় এখানে। আমি এটি পরীক্ষা করে দেখিনি, তবে এটি বেশিরভাগ বয়লার-প্লেট কোড যা আমার জন্য অতীতে কাজ করেছে। এটি নম্পি এবং জিডিএল বাইন্ডিংগুলির উপর নির্ভর করে তবে এটি প্রায় about

import osgeo.gdal as gdal
import osgeo.osr as osr
import numpy as np
from numpy import ma

def maFromGDAL(filename):
    dataset = gdal.Open(filename, gdal.GA_ReadOnly)

    if dataset is None:
        raise Exception()

    # Get the georeferencing metadata.
    # We don't need to know the CRS unless we want to specify coordinates
    # in a different CRS.
    #projection = dataset.GetProjection()
    geotransform = dataset.GetGeoTransform()

    # We need to know the geographic bounds and resolution of our dataset.
    if geotransform is None:
        dataset = None
        raise Exception()

    # Get the first band.
    band = dataset.GetRasterBand(1)
    # We need to nodata value for our MaskedArray later.
    nodata = band.GetNoDataValue()
    # Load the entire dataset into one numpy array.
    image = band.ReadAsArray(0, 0, band.XSize, band.YSize)
    # Close the dataset.
    dataset = None

    # Create a numpy MaskedArray from our regular numpy array.
    # If we want to be really clever, we could subclass MaskedArray to hold
    # our georeference metadata as well.
    # see here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html
    # For details.
    masked_image = ma.masked_values(image, nodata, copy=False)
    masked_image.fill_value = nodata

    return masked_image, geotransform

def pixelToMap(gt, pos):
    return (gt[0] + pos[0] * gt[1] + pos[1] * gt[2],
            gt[3] + pos[0] * gt[4] + pos[1] * gt[5])

# Reverses the operation of pixelToMap(), according to:
# https://en.wikipedia.org/wiki/World_file because GDAL's Affine GeoTransform
# uses the same values in the same order as an ESRI world file.
# See: http://www.gdal.org/gdal_datamodel.html
def mapToPixel(gt, pos):
    s = gt[0] * gt[4] - gt[3] * gt[1]
    x = (gt[4] * pos[0] - gt[1] * pos[1] + gt[1] * gt[5] - gt[4] * gt[2]) / s
    y = (-gt[3] * pos[0] + gt[0] * pos[1] + gt[3] * gt[2] - gt[0] * gt[5]) / s
    return (x, y)

def valueAtMapPos(image, gt, pos):
    pp = mapToPixel(gt, pos)
    x = int(pp[0])
    y = int(pp[1])

    if x < 0 or y < 0 or x >= image.shape[1] or y >= image.shape[0]:
        raise Exception()

    # Note how we reference the y column first. This is the way numpy arrays
    # work by default. But GDAL assumes x first.
    return image[y, x]

try:
    image, geotransform = maFromGDAL('myimage.tif')
    val = valueAtMapPos(image, geotransform, (434323.0, 2984745.0))
    print val
except:
    print('Something went wrong.')

1
আমার প্রশ্নের সম্পাদনা দেখুন ... যাইহোক পোস্ট করার জন্য ধন্যবাদ! আমি এটি upvated।
লার্সভেগাস

1
আহ! কমপক্ষে এটি এখানে উত্তরোত্তর জন্য। টিবিএইচ, গণিতগুলি mapToPixel()এবং pixelToMap()এর মধ্যে গুরুত্বপূর্ণ বিট, যতক্ষণ না আপনি একটি নমপি অ্যারে তৈরি করতে পারেন (বা নিয়মিত পাইথন একটি, তবে তারা সাধারণত এই ধরণের জিনিসটির পক্ষে দক্ষ না হন), এবং অ্যারের ভৌগলিক সীমানা বাক্সটি পাবেন।
মিরসিভিকিং

1
প্যারামিটারগুলিকে নিমপী অ্যারেতে পরিবর্তন করার বিষয়ে মন্তব্য (এবং কোড) এর জন্য +1। আমি আমার কোডে একটি বাগের জন্য সর্বত্র অনুসন্ধান করছিলাম এবং এই অদলবদলটি এটি ঠিক করেছে!
অ্যালডো

1
তারপরে আমি প্রস্তাব করছি আপনার ম্যাট্রিক্স ( gtউদাহরণে) ভুল। সিজিএল-তে ব্যবহৃত একটি অ্যাফাইন ম্যাট্রিক্স (দেখুন: gdal.org/gdal_datamodel.html ) সাধারণত অবিচ্ছিন্ন হয় (অন্যথায় আপনার কিছু মজাদার স্কেলিং মান চলছে)। সুতরাং যেখানে আমাদের রয়েছে g = p.Aআমরাও করতে পারি p = g.A^-1Numpy.linalg আমাদের উদ্দেশ্যগুলির জন্য কিছুটা ভারী ওজন - আমরা দুটি সহজ সমীকরণে সমস্ত কিছু হ্রাস করতে পারি।
মার্সিভিকিং

1
আমি নমপি লিনালগের চেয়ে সহজ বীজগণিত ব্যবহার করার জন্য কোডটি পুনরায় সম্পাদনা করেছি। গণিত যদি ভুল হয় তবে উইকিপিডিয়া পৃষ্ঠা ঠিক করুন।
MerseyViking

3

আমার উত্তর এখানে দেখুন ... এবং কিছু তথ্যের জন্য এখানে পড়ুন । নিম্নলিখিত তথ্য জিওটিপস থেকে নেওয়া হয়েছিল:

Gdallocationinfo এর সাহায্যে আমরা একটি পর্যায়ে উচ্চতা সম্পর্কে জিজ্ঞাসা করতে পারি:

$ gdallocationinfo gmted/all075.vrt -geoloc 87360 19679

উপরের কমান্ডের আউটপুটটির ফর্ম রয়েছে:

Report:
   Location: (87360P,19679L)
Band 1:
   Value: 1418

এর অর্থ, প্রদত্ত জিওলোকেশন এ উন্নয়নের মান 1418।


আমি খুঁজে পেয়েছি যে আমি জিডিএএল ব্যবহার করতে পারছি না কারণ আমি যে মেশিনটিতে কাজ করছি তার মধ্যে আমার সিস্টেম ভেরিয়েবল সম্পাদনা করতে সক্ষম নই। যদিও ইনপুট জন্য ধন্যবাদ।
লার্সভেগাস

0

উদাহরণস্বরূপ দেখুন এই কোডটি যা জিডিএল (এবং পাইথনের উপর ভিত্তি করে তৈরি হয়েছে (কোনও অদ্ভুত প্রয়োজন নেই): https://github.com/geometalab/retrieve-height-service


এটি দুর্ভাগ্যজনক যে কোডটি ওপেন সোর্স লাইসেন্সবিহীন বলে মনে হচ্ছে না।
বেন ক্রোয়েল

এখন এটি আছে :-)।
স্টিফান

-1

প্রদত্ত পাইথন কোড প্রদত্ত এক্স, ওয়াই কর্ডের উপর ভিত্তি করে একটি রাস্টার কোষের মান ডেটা বের করে। এটি এই উত্স উত্স থেকে একটি উদাহরণ একটি সামান্য পরিবর্তিত সংস্করণ । এটি ভিত্তিক GDALএবং numpyযা মানক পাইথন বিতরণের অংশ নয়। পাইথন এক্সটেনশন প্যাকেজগুলির জন্য ইনস্টলেশন ও দ্রুত এবং সহজ ব্যবহারের জন্য আনফিশিয়াল উইন্ডোজ বাইনারিগুলি নির্দেশ করার জন্য @ মাইক টুউজকে ধন্যবাদ ।

import os, sys, time, gdal
from gdalconst import *


# coordinates to get pixel values for
xValues = [122588.008]
yValues = [484475.146]

# set directory
os.chdir(r'D:\\temp\\AHN2_060')

# register all of the drivers
gdal.AllRegister()
# open the image
ds = gdal.Open('i25gn1_131.img', GA_ReadOnly)

if ds is None:
    print 'Could not open image'
    sys.exit(1)

# get image size
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount

# get georeference info
transform = ds.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5]

# loop through the coordinates
for xValue,yValue in zip(xValues,yValues):
    # get x,y
    x = xValue
    y = yValue

    # compute pixel offset
    xOffset = int((x - xOrigin) / pixelWidth)
    yOffset = int((y - yOrigin) / pixelHeight)
    # create a string to print out
    s = "%s %s %s %s " % (x, y, xOffset, yOffset)

    # loop through the bands
    for i in xrange(1,bands):
        band = ds.GetRasterBand(i) # 1-based index
        # read data and add the value to the string
        data = band.ReadAsArray(xOffset, yOffset, 1, 1)
        value = data[0,0]
        s = "%s%s " % (s, value) 
    # print out the data string
    print s
    # figure out how long the script took to run

দেখে মনে হচ্ছে এটি কেবল ম্যাসেরভিাইকিংয়ের উপরের অফারগুলির থেকে একটি কম জেনেরিক, কম নমনীয় সংস্করণ?
WileyB
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.