首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >QGIS -从线中检索起点要素和终点要素

QGIS -从线中检索起点要素和终点要素
EN

Stack Overflow用户
提问于 2014-12-01 22:00:57
回答 1查看 3.9K关注 0票数 1

我通过从不同的图层中选择两个特征来创建直线。当我创建一条线时,会弹出一个表单。在这个表单中,我想要显示来自线的起点和终点的数据。我当前正在做的是将顶点检索为点:

代码语言:javascript
复制
geom = feature.geometry ()
line = geom.asPolyline ()
pointFather = ligne[0]
pointChild = ligne[-1]

然后我得到每个点的坐标:

代码语言:javascript
复制
xf = pointFather.x()
yf = pointFather.y()

然后我查看每个可能的层,以找到具有相同坐标的要素,只是为了检索我刚刚单击的要素!

代码语言:javascript
复制
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之后尝试的第一个答案:

代码语言:javascript
复制
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第二条评论之后的尝试:

代码语言:javascript
复制
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第三条评论之后的尝试:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2014-12-02 03:37:45

克里斯,

您肯定可以改进相似坐标的外观(代码的第三部分)。

为每个链接创建空间索引(https://docs.qgis.org/2.2/en/docs/pyqgis_developer_cookbook/vector.html#using-spatial-index)并使用nearestNeighbor,而不是遍历每个图层中的所有要素。

它应该是这样的:

代码语言:javascript
复制
#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)

现在我们有了索引,我们可以使用更快的地理搜索。

代码语言:javascript
复制
geom = feature.geometry ()

for index in indexes:
    intersect_ids = index.intersects(geom.boundingBox())

intersect_ids是候选等效功能的较小列表,因此您只能将这些功能与您选择的功能进行比较。

您需要对此进行更多的组织,但这就是我们的想法

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27230017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档