【发布时间】:2017-06-21 07:51:34
【问题描述】:
【问题讨论】:
标签: geospatial qgis
【问题讨论】:
标签: geospatial qgis
应该有几种方法可以做到这一点。最简单的可能是this question的答案,然后使用this question的答案。
但是,你应该可以用一点 python 来做到这一点。我写了一个只使用一层的小脚本(一个点层,它找到一定半径内的点的平均值,它平均一个名为“成本”的字段):
# get selected feature
layer = iface.activeLayer()
features = layer.selectedFeatures()
# Buffer the feature 10 layer units
buffer = features[0].geometry().buffer(10,-1)
# Will hold features intersecting buffer
inBuffer = []
# get selected features
for feature in layer.getFeatures():
if (feature.geometry().intersects(buffer)):
inBuffer.append(feature)
# for calculating the average
total = 0
number = 0
# Sum the features that intersect the buffer of the selection:
field = layer.fieldNameIndex('cost')
for feature in inBuffer:
total += (feature['cost'])
number += 1
#Get the average
average = float(total / number)
print (average)
这仅采用第一个选择的特征(features[0])并将搜索半径应用于该特征,如果您只选择活动层中的特征,则此限制无关紧要
上面的代码可以被压缩一点,但我想我会再把它分解一下。特别是因为我的 python 相当有限。
要根据第一层中的选择找到第二层的平均值,您可以通过抓取所有层来稍微修改:
mapcanvas = iface.mapCanvas()
layers = mapcanvas.layers()
然后在适当的位置使用layers[0]、layers[1](或layers[i])代替层,例如:
features = layer.selectedFeatures() 到 features = layers[0].selectedFeatures()
对于源特征,并且
for feature in layer.getFeatures(): 到 for feature in layers[1].getFeatures()
和
field = layer.fieldNameIndex('fieldname') 到 field = layers[1].fieldNameIndex('fieldname')
对于目标特征(被平均的那个)。
希望我发布的代码很容易应用。我可能会确保两个层都使用相同的 SRS 以避免交叉路口出现任何问题,并记住缓冲区单元位于该 SRS 的单元中。
【讨论】: