İşte bunu uygulayan küçük bir QGIS python işlevi. Rasterlang eklentisini gerektirir (havuz QGIS'e manuel olarak eklenmelidir).
Üç zorunlu parametre bekler: points katmanı, bir raster katmanı (çıktının boyutunu ve çözünürlüğünü belirlemek için) ve çıktı katmanı için bir dosya adı. Ayrıca mesafe bozulma fonksiyonunun üssünü belirlemek için isteğe bağlı bir argüman sağlayabilirsiniz.
Puanların ağırlıklarının, puan katmanının ilk özellik sütununda olması gerekir.
Elde edilen raster otomatik olarak tuvale eklenir.
İşte betiğin nasıl çalıştırılacağına bir örnek. Noktaların ağırlıkları 20 ile 90 arasındadır ve ızgara, boyut olarak 60 ila 50 harita birimidir.
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
? Bu hesaplamalı zaman kaybı. Bir başka boşa harcanmış hesaplama kümesi, max'ı bulmadan önce tüm "yerçekimi" ızgaralarının normalleştirilmesini içerir: bunun yerine, maksimum değerlerini bulun ve bunu toplamla normalleştirin.