여러 레이어에서 두 가지 기능을 선택하여 선을 만듭니다. 선을 만들면 양식이 나타납니다. 이 양식에서는 선의 시작 및 끝 피쳐에서 데이터를 표시하려고합니다. 내가 현재 지점으로 정점을 검색하는 일을 해요 :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에서 내 시도를 볼 수 있습니다. 나는 그것이 당신이 염두에 두었던 것과 정확히 일치하지 않습니다. 색인 생성은 모든 레이어에서 20 개 미만의 기능에 대해 1 초가 걸립니다. 그러한 오랜 시간을 설명 할 수있는 것은 무엇입니까? –
@ChrisF, 일치 프로세스를 시작하기 전에 색인을 한 번만 만들어야하며 각 검색에서 색인을 사용하십시오. 아마도 검색 속도가 크게 빨라질 것입니다. – PCamargo