পাইথন জিডাল ব্যবহার করে জিওটিফের কাছ থেকে স্থানাঙ্ক এবং প্রাসঙ্গিক পিক্সেল মানগুলি পান এবং এগুলিকে অসাধারণ অ্যারে হিসাবে সংরক্ষণ করুন


10

আমি কীভাবে কোনও জিওটিফ ফাইল থেকে সেই স্থানাঙ্কগুলিতে প্রকৃত পিক্সেল মানগুলির সাথে প্রকৃত পিক্সেল মানগুলি পেতে পারি এবং তারপরে এগুলিকে একটি অলস অ্যারেতে সংরক্ষণ করতে পারি? আমার কাছে arsenci020l.tif ফাইল রয়েছে এবং এর স্থানাঙ্কগুলি মিটারে রয়েছে। নীচে আমি তাতে দৌড়ে গেডালিনফোর সংক্ষিপ্ত আউটপুট রয়েছে।

~$ gdalinfo arsenci020l.tif 
Driver: GTiff/GeoTIFF
Files: arsenci020l.tif
       arsenci020l.tfw
Size is 10366, 7273
Coordinate System is:
PROJCS["Lambert Azimuthal Equal Area projection with arbitrary plane grid; projection center 100.0 degrees W, 45.0 degrees N",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Lambert_Azimuthal_Equal_Area"],
    PARAMETER["latitude_of_center",45],
    PARAMETER["longitude_of_center",-100],
    PARAMETER["false_easting",0],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]]]
Origin = (-6086629.000000000000000,4488761.000000000000000)
Pixel Size = (1000.000000000000000,-1000.000000000000000)
...

টিফ থেকে ল্যাট / লম্বা স্থানাঙ্কগুলি অর্জন সম্পর্কে (এখানে একটি জিওটিআইএফএফ ফাইল থেকে অক্ষাংশ এবং দ্রাঘিমাংশ অর্জন) এবং উত্তরটি কেবল শীর্ষ বাম এক্স এবং ওয়াই পিক্সেল স্থানাঙ্কগুলি কীভাবে পাবেন তা দেখানো হয়েছিল। আমার সমস্ত প্রজেক্টড পিক্সেল স্থানাঙ্কগুলি পাওয়ার পাশাপাশি পিক্সেলের মানগুলি পাওয়া এবং সেগুলি একটি অদ্ভুত অ্যারেতে সংরক্ষণ করতে হবে। আমি এটা কিভাবে করবো?


আপনি 10366 want 7273 = 75 মিলিয়ন পয়েন্টের চেয়ে বেশি চান?
মাইক টি

@ মাইকিটি আমার মনে হয়, আমি যে সমস্যার সমাধান করতে চাইছি তার কাছে কীভাবে যেতে হবে তার আরও ভাল সমাধান সম্পর্কে আমি সত্যিই জানি না: আমাকে এই ডাটাसेट থেকে মার্কিন ব্লকের প্রতিটি সেন্ট্রয়েডের নিকটতম পিক্সেল স্থানাঙ্ক খুঁজে বের করতে হবে এবং তারপরে এটি নির্ধারণ করতে হবে সেই ব্লকের সাথে সম্পর্কিত পিক্সেলের মানটি around চারপাশে অনুসন্ধান করে আমি বুঝতে পেরেছিলাম যে সিকেডিট্রি কোয়েরি আমাকে নিকটবর্তী প্রতিবেশী অনুসন্ধানে সহায়তা করবে the অ্যালগরিদমের জন্য পাইথন ফাংশনটি একটি "গাছ" কে নামী অ্যারে হিসাবে জিজ্ঞাসা করার জন্য জিজ্ঞাসা করে I "গাছ" তৈরি করার জন্য এই ডেটাসেট থেকে সমস্ত পিক্সেল স্থানাঙ্কের মধ্যে, আমার সেগুলি কোনও না কোনওভাবে সংরক্ষণ করা দরকার you আপনার যদি আরও ভাল সমাধান হয় তবে দয়া করে আমাকে জানান!
ইরাকমান

উত্তর:


7

মন্তব্য হিসাবে যোগ করবে, তবে কিছুটা দীর্ঘ - যদি আপনি পাইথনের মধ্যে gdal / ogr ব্যবহার করতে চান - তবে এরকম কিছু কাজ করতে পারে (আমার কাছে থাকা অন্য কোডগুলি থেকে একত্রে হ্যাক হয়েছিল - পরীক্ষা করা হয়নি!) এটিও ধরে নিয়েছে যে নিকটতমটি খুঁজে না পাওয়ার চেয়ে বহুভুজ সেন্ট্রয়েডে রাস্টার পিক্সেল, আপনি কেবল সেন্ট্রয়েডের জাইয়ের রাস্টারকে জিজ্ঞাসা করেন। গতি বাণিজ্য কী হতে পারে আমার কোনও ধারণা নেই ...

from osgeo import gdal,ogr

fc='PathtoYourVector'
rast='pathToYourRaster'

def GetCentroidValue(fc,rast):
    #open vector layer
    drv=ogr.GetDriverByName('ESRI Shapefile') #assuming shapefile?
    ds=drv.Open(fc,True) #open for editing
    lyr=ds.GetLayer(0)

    #open raster layer
    src_ds=gdal.Open(rast) 
    gt=src_ds.GetGeoTransform()
    rb=src_ds.GetRasterBand(1)
    gdal.UseExceptions() #so it doesn't print to screen everytime point is outside grid

    for feat in lyr:
        geom=feat.GetGeometryRef()
        mx=geom.Centroid().GetX()
        my=geom.Centroid().GetY()

        px = int((mx - gt[0]) / gt[1]) #x pixel
        py = int((my - gt[3]) / gt[5]) #y pixel
        try: #in case raster isnt full extent
            structval=rb.ReadRaster(px,py,1,1,buf_type=gdal.GDT_Float32) #Assumes 32 bit int- 'float'
            intval = struct.unpack('f' , structval) #assume float
            val=intval[0]
        except:
            val=-9999 #or some value to indicate a fail

       feat.SetField('YOURFIELD',val)
       lyr.SetFeature(feat)

    src_ds=None
    ds=None

GetCentroidValue(fc,rast)

14

এটি আপনাকে যেতে হবে। রাস্টার মান ব্যবহার করে পড়া হয় rasterio , এবং পিক্সেল কেন্দ্র কোঅর্ডিনেটগুলি দিয়ে Eastings / Northings রূপান্তরিত হয় অ্যাফিন , যা ব্যবহার করে অক্ষাংশ / দ্রাঘিমাংশ রূপান্তরিত হয় pyproj । বেশিরভাগ অ্যারে ইনপুট রাস্টার হিসাবে একই আকার আছে।

import rasterio
import numpy as np
from affine import Affine
from pyproj import Proj, transform

fname = '/path/to/your/raster.tif'

# Read raster
with rasterio.open(fname) as r:
    T0 = r.transform  # upper-left pixel corner affine transform
    p1 = Proj(r.crs)
    A = r.read()  # pixel values

# All rows and columns
cols, rows = np.meshgrid(np.arange(A.shape[2]), np.arange(A.shape[1]))

# Get affine transform for pixel centres
T1 = T0 * Affine.translation(0.5, 0.5)
# Function to convert pixel row/column index (from 0) to easting/northing at centre
rc2en = lambda r, c: (c, r) * T1

# All eastings and northings (there is probably a faster way to do this)
eastings, northings = np.vectorize(rc2en, otypes=[np.float, np.float])(rows, cols)

# Project all longitudes, latitudes
p2 = Proj(proj='latlong',datum='WGS84')
longs, lats = transform(p1, p2, eastings, northings)

1
এটি ব্যবহার করার সময়, আমি "AttributeError: 'DatasetReader' অবজেক্টটির" T0 = r.affine "রেখার জন্য 'অ্যাফাইন' নেই
বার্তাটি

@ মিমটিছাস আপাতদৃষ্টিতে affineকেবল একটি উপনাম transform, এবং উপনামটি রাস্টেরিওর সাম্প্রতিকতম সংস্করণ থেকে সরানো হয়েছে। আমি উত্তরটি সম্পাদনা করেছি তবে মনে হচ্ছে এখানে নতুন থাকায় এটি পিয়ার-রিভিউ করা দরকার। :)
অটোমোসলেট

1
দেখে মনে হয় যে সূচকগুলি ভুল A.shape, যার মাত্র দুটি মাত্রা রয়েছে।
26:38
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.