이것을 구현하는 약간의 QGIS python 함수가 있습니다. rasterlang 플러그인 이 필요합니다 (저장소는 QGIS에 수동으로 추가해야합니다).
포인트 레이어, 래스터 레이어 (출력의 크기와 해상도를 결정하기 위해) 및 출력 레이어의 파일 이름이라는 세 가지 필수 매개 변수가 필요합니다. 거리 감쇄 함수의 지수를 결정하기 위해 선택적 인수를 제공 할 수도 있습니다.
포인트의 가중치는 포인트 레이어의 첫 번째 속성 열에 있어야합니다.
결과 래스터가 캔버스에 자동으로 추가됩니다.
다음은 스크립트를 실행하는 방법에 대한 예입니다. 포인트의 가중치는 20에서 90 사이이며 그리드의 크기는 60 x 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
합니까? 그것은 계산 시간을 낭비합니다. 또 다른 낭비되는 계산 세트에는 최대 값을 찾기 전에 모든 "중력"그리드를 정규화하는 것이 포함됩니다. 대신 최대 값을 찾아 합계로 정규화합니다.