Co staram się zrobić: pętlę przez punkt shapefile i wybrać każdy punkt, który wchodzi do wielokąta.
Poniższy kod został zainspirowany przykładem zapytania przestrzennego znalezionego w książce:
mitte_path = r"D:\PythonTesting\SelectByLocation\mitte.shp"
punkte_path = r"D:\PythonTesting\SelectByLocation\punkte.shp"
polygon = QgsVectorLayer(mitte_path, 'Mitte', 'ogr')
points = QgsVectorLayer(punkte_path, 'Berlin Punkte', 'ogr')
QgsMapLayerRegistry.instance().addMapLayer(polygon)
QgsMapLayerRegistry.instance().addMapLayer(points)
polyFeatures = polygon.getFeatures()
pointsCount = 0
for poly_feat in polyFeatures:
polyGeom = poly_feat.geometry()
pointFeatures = points.getFeatures(QgsFeatureRequest().setFilterRect(polyGeom.boundingBox()))
for point_feat in pointFeatures:
points.select(point_feat.id())
pointsCount += 1
print 'Total:',pointsCount
Działa to i wybiera zestawy danych, ale problem polega na tym, że wybiera przez obwiednię , stąd oczywiście zwracanie punktów, które mnie nie interesują:
Jak mogę zajmować się tylko zwracaniem punktów w obrębie wielokąta bez korzystania z qgis: selectbylocation ?
Próbowałem użyć metod Within () i intersects () , ale ponieważ nie zmuszałem ich do pracy, skorzystałem z powyższego kodu. Ale może w końcu są kluczem.
źródło
Możesz użyć algorytmu „Ray Casting” , który nieco dostosowałem do użycia z PyQGIS:
Zastosowano w tej sytuacji:
wynik w konsoli Python był następujący:
Zadziałało.
Uwaga do edycji:
Kod z bardziej zwięzłą propozycją genu :
źródło
if geo_pol.contains(geo_point) == True:
ponieważ jest to ukryte wif geo_pol.contains(geo_point)
(zawsze Prawda)Z kilkoma radami od współpracownika w końcu udało mi się to zrobić za pomocą funkcji Within ().
Ogólna logika
Oto kod:
Działa to również z intersects () zamiast w ciągu () . Podczas korzystania z punktów nie ma znaczenia, którego byś użył, ponieważ oba zwrócą ten sam wynik. Jednak podczas sprawdzania linii / wielokątów może mieć to istotną różnicę: funkcja inside () zwraca obiekty, które są całkowicie wewnątrz, natomiast przecina () ponownie stroi obiekty, które są całkowicie wewnątrz i które są częściowo wewnątrz (tj. Które przecinają się z obiektem, ponieważ nazwa wskazuje).
źródło