Ось невелика функція QGIS python, яка реалізує це. Для цього потрібен плагін rasterlang (репозиторій потрібно додати до QGIS вручну).
Він очікує трьох обов’язкових параметрів: точковий шар, растровий шар (для визначення розміру та роздільної здатності виводу) та ім'я файлу для вихідного шару. Ви також можете надати необов'язковий аргумент для визначення показника функції занепаду відстані.
Ваги для очок повинні бути в першому стовпчику атрибутів шару точок.
Отриманий растр автоматично додається до полотна.
Ось приклад того, як запустити скрипт. Очки мають вагу між 20 і 90, а сітка розміром 60 на 50 карт.
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
? Це витрата часу на обчислення. Інший витрачений набір обчислень передбачає нормалізацію всіх сіт "гравітації" перед тим, як знайти максимум: натомість знайдіть їх макс і нормалізуйте це за сумою.