आप गदल.डैटसेट या गदल का उपयोग कर सकते हैं। और रीड रीडस्टर विधि। देखें GDAL और OGR एपीआई ट्यूटोरियल और नीचे दिए गए उदाहरण। ReadRaster का उपयोग नहीं करता है / इसके लिए आवश्यक नहीं है, वापसी मान कच्चा बाइनरी डेटा है और मानक अजगर संरचना मॉड्यूल का उपयोग करके इसे अनपैक करने की आवश्यकता है ।
एक उदाहरण:
from osgeo import gdal,ogr
import struct
src_filename = '/tmp/test.tif'
shp_filename = '/tmp/test.shp'
src_ds=gdal.Open(src_filename)
gt=src_ds.GetGeoTransform()
rb=src_ds.GetRasterBand(1)
ds=ogr.Open(shp_filename)
lyr=ds.GetLayer()
for feat in lyr:
geom = feat.GetGeometryRef()
mx,my=geom.GetX(), geom.GetY() #coord in map units
#Convert from map to pixel coordinates.
#Only works for geotransforms with no rotation.
px = int((mx - gt[0]) / gt[1]) #x pixel
py = int((my - gt[3]) / gt[5]) #y pixel
structval=rb.ReadRaster(px,py,1,1,buf_type=gdal.GDT_UInt16) #Assumes 16 bit int aka 'short'
intval = struct.unpack('h' , structval) #use the 'short' format code (2 bytes) not int (4 bytes)
print intval[0] #intval is a tuple, length=1 as we only asked for 1 pixel value
वैकल्पिक रूप से, चूंकि आपने उपयोग नहीं करने का कारण दिया था, इसलिए उपयोग numpyकरने में पूरे सरणी को पढ़ने से बचने के लिए ReadAsArray(), नीचे एक उदाहरण है जो उपयोग करता है numpyऔर पूरे रेखापुंज को नहीं पढ़ता है।
from osgeo import gdal,ogr
import struct
src_filename = '/tmp/test.tif'
shp_filename = '/tmp/test.shp'
src_ds=gdal.Open(src_filename)
gt=src_ds.GetGeoTransform()
rb=src_ds.GetRasterBand(1)
ds=ogr.Open(shp_filename)
lyr=ds.GetLayer()
for feat in lyr:
geom = feat.GetGeometryRef()
mx,my=geom.GetX(), geom.GetY() #coord in map units
#Convert from map to pixel coordinates.
#Only works for geotransforms with no rotation.
px = int((mx - gt[0]) / gt[1]) #x pixel
py = int((my - gt[3]) / gt[5]) #y pixel
intval=rb.ReadAsArray(px,py,1,1)
print intval[0] #intval is a numpy array, length=1 as we only asked for 1 pixel value