Tôi có một raster mà tôi muốn thực hiện một số phép nội suy điểm. Đây là nơi tôi đang ở:
from osgeo import gdal
from numpy import array
# Read raster
source = gdal.Open('my_raster.tif')
nx, ny = source.RasterXSize, source.RasterYSize
gt = source.GetGeoTransform()
band_array = source.GetRasterBand(1).ReadAsArray()
# Close raster
source = None
# Compute mid-point grid spacings
ax = array([gt[0] + ix*gt[1] + gt[1]/2.0 for ix in range(nx)])
ay = array([gt[3] + iy*gt[5] + gt[5]/2.0 for iy in range(ny)])
Cho đến nay, tôi đã thử chức năng interp2d của SciPy :
from scipy import interpolate
bilinterp = interpolate.interp2d(ax, ay, band_array, kind='linear')
tuy nhiên tôi gặp lỗi bộ nhớ trên hệ thống Windows 32 bit của mình với raster 317 × 301:
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "C:\Python25\Lib\site-packages\scipy\interpolate\interpolate.py", line 125, in __init__
self.tck = fitpack.bisplrep(self.x, self.y, self.z, kx=kx, ky=ky, s=0.)
File "C:\Python25\Lib\site-packages\scipy\interpolate\fitpack.py", line 873, in bisplrep
tx,ty,nxest,nyest,wrk,lwrk1,lwrk2)
MemoryError
Tôi sẽ thừa nhận, tôi đã hạn chế niềm tin vào chức năng SciPy này, vì bounds_error
hoặc fill_value
các tham số không hoạt động như tài liệu. Tôi không thấy lý do tại sao tôi nên có lỗi bộ nhớ, vì raster của tôi là 317 × 301 và thuật toán song tuyến không khó.
Có ai bắt gặp một thuật toán nội suy song tuyến tốt, tốt nhất là bằng Python, có thể được điều chỉnh bằng NumPy không? Bất kỳ gợi ý hoặc lời khuyên?
(Lưu ý: thuật toán nội suy lân cận gần nhất là bánh dễ:
from numpy import argmin, NAN
def nearest_neighbor(px, py, no_data=NAN):
'''Nearest Neighbor point at (px, py) on band_array
example: nearest_neighbor(2790501.920, 6338905.159)'''
ix = int(round((px - (gt[0] + gt[1]/2.0))/gt[1]))
iy = int(round((py - (gt[3] + gt[5]/2.0))/gt[5]))
if (ix < 0) or (iy < 0) or (ix > nx - 1) or (iy > ny - 1):
return no_data
else:
return band_array[iy, ix]
... nhưng tôi rất thích các phương pháp nội suy song tuyến tính)
gt
.
MemoryError
bởi vì NumPy cố gắng truy cập ngoài của bạnband_array
? Bạn nên kiểm traax
vàay
.