我通过从不同的图层中选择两个特征来创建直线。当我创建一条线时,会弹出一个表单。在这个表单中,我想要显示来自线的起点和终点的数据。我当前正在做的是将顶点检索为点:
geom = feature.geometry ()
line = geom.asPolyline ()
pointFather = ligne[0]
pointChild = ligne[-1]
然后我得到每个点的坐标:
xf = pointFather.x()
yf = pointFather.y()
然后我查看每个可能的层,以找到具有相同坐标的要素,只是为了检索我刚刚单击的要素!
for layer in layerList:
provider = layer.dataProvider()
iter = provider.getFeatures()
for feature in iter:
geom = feature.geometry().asPoint()
if geom.x() == xf and geom.y() == yf:
直接检索开始和结束特征肯定更容易做一些事情,不是吗?
EDIT 1 :
这是我在PCamargo之后尝试的第一个答案:
def retrieve_feature_from_xy(geom,point,layerList):
for layer in layerList:
index = QgsSpatialIndex()
iter = layer.getFeatures()
for feat in iter:
index.insertFeature(feat)
ids = index.intersects(geom.boundingBox())
request = QgsFeatureRequest()
request.setFilterFids(ids)
iter = layer.getFeatures(request)
for feat in iter:
geom2 = feat.geometry().asPoint()
if geom2.x() == point.x() and geom2.y() == point.y():
return feat
EDIT 2 :
这是我在PCamargo第二条评论之后的尝试:
def retrieve_feature_from_xy2(geom,point,layerList):
allfeatures = {}
indexes=[]
ids=[]
for layer in layerList:
index = QgsSpatialIndex()
iter = layer.getFeatures()
for feat in iter:
index.insertFeature(feat)
allfeatures[feat.id()]=feat
indexes.append(index)
for index in indexes:
intersect_ids = index.intersects(geom.boundingBox())
ids.append(intersect_ids)
for id in ids:
for i in id:
feat=allfeatures[i]
geom2=feat.geometry().asPoint()
if geom2.x() == point.x() and geom2.y() == point.y():
return feat
编辑3个
这是我在PCamargo第三条评论之后的尝试:
def retrieve_feature_from_xy3(geom,point,layerList):
allfeatures = {}
indexes=[]
ids=[]
indexDict = {}
intersectsIdsDict = {}
for layer in layerList:
index = QgsSpatialIndex()
iter = layer.getFeatures()
for feat in iter:
index.insertFeature(feat)
allfeatures[layer,feat.id()]=feat
indexes.append(index)
indexDict[layer]=index
for layer, index in indexDict.items():
intersectsIds = index.intersects(geom.boundingBox())
intersectsIdsDict[layer]=intersectsIds
for layer, index in intersectsIdsDict.items():
for id in index:
feat = allfeatures[layer,id]
geom2=feat.geometry().asPoint()
if geom2.x() == point.x() and geom2.y() == point.y():
return feat
发布于 2014-12-02 03:37:45
克里斯,
您肯定可以改进相似坐标的外观(代码的第三部分)。
为每个链接创建空间索引(https://docs.qgis.org/2.2/en/docs/pyqgis_developer_cookbook/vector.html#using-spatial-index)并使用nearestNeighbor,而不是遍历每个图层中的所有要素。
它应该是这样的:
#You only need to create these indices once
indexes=[]
for layer in layerlist:
index = QgsSpatialIndex()
for feat in layer:
index.insertFeature(feat)
indexes.append(index)
现在我们有了索引,我们可以使用更快的地理搜索。
geom = feature.geometry ()
for index in indexes:
intersect_ids = index.intersects(geom.boundingBox())
intersect_ids是候选等效功能的较小列表,因此您只能将这些功能与您选择的功能进行比较。
您需要对此进行更多的组织,但这就是我们的想法
https://stackoverflow.com/questions/27230017
复制相似问题