2014-12-01 24 views
0

여러 레이어에서 두 가지 기능을 선택하여 선을 만듭니다. 선을 만들면 양식이 나타납니다. 이 양식에서는 선의 시작 및 끝 피쳐에서 데이터를 표시하려고합니다. 내가 현재 지점으로 정점을 검색하는 일을 해요 :QGIS - 라인에서 시작 및 끝 기능 검색

xf = pointFather.x() 
yf = pointFather.y() 

후 내가 함께 기능을 찾기 위해 가능한 각 계층에 볼 :

geom = feature.geometry() 
line = geom.asPolyline() 
pointFather = ligne[0] 
pointChild = ligne[-1] 

그때 내가 각 지점의 좌표를 얻을를 동일한 좌표, 방금 클릭 한 기능을 검색합니다!

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

편집 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 

답변

1

크리스,

암호).

각 계층의 모든 기능을 반복하지 않고 각 링크에 대해 공간 인덱스 (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는 후보자가 해당 될 수있는 기능의 작은 목록입니다.

이 내용을 조금 더 정리해야하지만 그 아이디어는

+0

대단히 감사합니다. –

+0

답변 해 주셔서 대단히 감사합니다. 편집 1에서 내 시도를 볼 수 있습니다. 나는 그것이 당신이 염두에 두었던 것과 정확히 일치하지 않습니다. 색인 생성은 모든 레이어에서 20 개 미만의 기능에 대해 1 초가 걸립니다. 그러한 오랜 시간을 설명 할 수있는 것은 무엇입니까? –

+0

@ChrisF, 일치 프로세스를 시작하기 전에 색인을 한 번만 만들어야하며 각 검색에서 색인을 사용하십시오. 아마도 검색 속도가 크게 빨라질 것입니다. – PCamargo