ฉันมีแรสเตอร์ที่ฉันต้องการจะแก้ไขจุดด้วย ที่นี่ฉันอยู่ที่ไหน:
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)])
ถึงตอนนี้ฉันได้ลองใช้ฟังก์ชั่นinterp2d ของ SciPy แล้ว :
from scipy import interpolate
bilinterp = interpolate.interp2d(ax, ay, band_array, kind='linear')
แต่ฉันได้รับข้อผิดพลาดของหน่วยความจำในระบบ Windows 32 บิตที่มีแรสเตอร์ 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
ฉันจะยอมรับว่าฉันมีความมั่นใจ จำกัด ในฟังก์ชั่น SciPy นี้เนื่องจากพารามิเตอร์bounds_error
หรือfill_value
พารามิเตอร์ไม่ทำงานตามที่บันทึกไว้ ฉันไม่เห็นสาเหตุที่ฉันควรมีข้อผิดพลาดของหน่วยความจำเนื่องจากแรสเตอร์ของฉันคือ 317 × 301 และอัลกอริทึม bilinearไม่ควรยาก
มีใครเจออัลกอริธึมการแก้ไข bilinear ที่ดีโดยเฉพาะอย่างยิ่งใน Python ที่เหมาะกับ NumPy หรือไม่? คำแนะนำหรือคำแนะนำใด ๆ
(หมายเหตุ: อัลกอริทึมการแก้ไขเพื่อนบ้านที่ใกล้ที่สุดคือเค้กง่าย:
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]
... แต่ฉันชอบวิธีการแก้ไขสองทางมาก)
gt
นี้ต้องผกผันของเลียนแบบการแปลงค่าสัมประสิทธิ์ใน
MemoryError
เพราะ NumPy พยายามที่จะเข้าถึงเกินกว่าของคุณband_array
? คุณควรตรวจสอบและax
ay