Đây là một hàm python QGIS nhỏ thực hiện điều này. Nó yêu cầu plugin rasterlang (kho lưu trữ phải được thêm vào QGIS bằng tay).
Nó mong đợi ba tham số bắt buộc: Lớp điểm, lớp raster (để xác định kích thước và độ phân giải của đầu ra) và tên tệp cho lớp đầu ra. Bạn cũng có thể cung cấp một đối số tùy chọn để xác định số mũ của hàm phân rã khoảng cách.
Các trọng số cho các điểm cần phải nằm trong cột thuộc tính đầu tiên của lớp điểm.
Các raster kết quả được tự động thêm vào khung vẽ.
Đây là một ví dụ về cách chạy tập lệnh. Các điểm có trọng lượng từ 20 đến 90 và lưới có kích thước 60 x 50 đơn vị bản đồ.
points = qgis.utils.iface.mapCanvas().layer(0)
raster = qgis.utils.iface.mapCanvas().layer(1)
huff(points,raster,"output.tiff",2)
from rasterlang.layers import layerAsArray
from rasterlang.layers import writeGeoTiff
import numpy as np
def huff(points, raster, outputfile, decay=1):
if points.type() != QgsMapLayer.VectorLayer:
print "Error: First argument is not a vector layer (but it has to be)"
return
if raster.type() != QgsMapLayer.RasterLayer:
print "Error: Second argument is not a raster layer (but it has to be)"
return
b = layerAsArray(raster)
e = raster.extent()
provider = points.dataProvider()
extent = [e.xMinimum(),e.yMinimum(),e.xMaximum(),e.yMaximum()]
xcols = np.size(layerAsArray(raster),1)
ycols = np.size(layerAsArray(raster),0)
xvec = np.linspace(extent[0], extent[2], xcols, endpoint=False)
xvec = xvec + (xvec[1]-xvec[0])/2
yvec = np.linspace(extent[3], extent[1], ycols, endpoint=False)
yvec = yvec + (yvec[1]-yvec[0])/2
coordArray = np.meshgrid(xvec,yvec)
gravity = b
point = QgsFeature()
provider.select( provider.attributeIndexes() )
while provider.nextFeature(point):
coord = point.geometry().asPoint()
weight = point.attributeMap()[0].toFloat()[0]
curGravity = weight * ( (coordArray[0]-coord[0])**2 + (coordArray[1]-coord[1])**2)**(-decay/2)
gravity = np.dstack((gravity, curGravity))
gravitySum = np.sum(gravity,2)
huff = np.max(gravity,2)/gravitySum
np.shape(huff)
writeGeoTiff(huff,extent,outputfile)
rlayer = QgsRasterLayer(outputfile)
QgsMapLayerRegistry.instance().addMapLayer(rlayer)
curGravity
? Đó là một sự lãng phí thời gian tính toán. Một bộ tính toán lãng phí khác liên quan đến việc bình thường hóa tất cả các lưới "trọng lực" trước khi tìm max: thay vào đó, hãy tìm max của chúng và chuẩn hóa nó bằng tổng.