Mehr

Effiziente Arcpy-Methode von Punkten in Polygonen


Da ich mit Mapinfo und Manifold vertraut bin, bin ich häufig mit dem ArcGIS SQL-Toolset frustriert. In diesen beiden früheren Programmen ist es trivial, eine Abfrage zu schreiben, die beispielsweise fragt, wie viele Punkte in jedes Polygon fallen. Dies kann mithilfe von where-Klauseln gefiltert werden, z.B. alle Punkte vom Typ a innerhalb jedes Polygons und dann alle Punkte vom Typ b innerhalb jedes Polygons. Da das Abfrageergebnis eine speicherinterne Tabelle ist, ist es schnell und verbraucht sehr wenig Speicherplatz.

Im Gegensatz dazu scheint Spatial Join in ArcGIS ziemlich langsam zu sein, möglicherweise aufgrund von Festplatten-E/A, verbraucht mehr Speicherplatz als nötig, und ich persönlich finde es umständlich.

Ich weiß, dass es Alternativen gibt, zum Beispiel Hawths Tools, aber ich habe versucht, etwas in arcpy zu machen. Mein erster Gedanke war, jede Geometrie sowohl im Polygonsatz als auch im Punktsatz zu durchlaufen und zu testen, ob der Punkt im Polygon enthalten ist. Damit könnte dann alles Mögliche berechnet werden. Ich habe einen Test geschrieben, der nur alle Punkte für ein Polygon durchlaufen hat:

import arcpy arcpy.env.workspace = r"path	oworkspace" print "Start" geom = arcpy.Point(530000,180000) cursor = arcpy.SearchCursor("FCName") für Rowid im Cursor: poly = rowid.Shape wenn poly.contains(geom): print rowid.OBJECTID

Dies dauert jedoch für jedes Polygon einige Sekunden, daher denke ich, dass dies bei einer Datasetgröße von 4.000 Polygonen nicht besonders schnell funktionieren wird.

Hat jemand eine Idee, um dies effizienter zu machen, oder eine Funktion, die mir fehlt?


Würde die Verwendung des Intersect-Tools für Sie funktionieren? Jeder Punkt in der resultierenden Feature-Class hätte auch die Attribute des Polygons, in dem er enthalten ist, und Sie könnten ein Skript schreiben, das diese Punkte durchläuft und alle Statistiken berechnet, die Sie für jede Polygon-ID benötigen (Min., Max., Mittel, Summe, zählen usw.).


Können Sie das Spatial-Join-Tool aus Ihrem arcpy-Skript aufrufen? Vielleicht schreiben Sie eine Wrapper-Methode, um zu handhaben, wohin die Ausgabe geht, und sie danach zu löschen. Das wird wahrscheinlich schneller sein, als Features direkt in arcpy zu durchlaufen.

Ansonsten fürchte ich, dass arcpy langsam ist. Sie könnten ctypes verwenden, um eine DLL aufzurufen, die die Point-in-Polygon-Funktion für Sie übernimmt, aber das ist viel mehr Implementierungsarbeit, und Sie haben immer noch den Aufwand für das Lesen von Features an erster Stelle.


Ich bin wie du. Ich muss ArcPy verwenden und in der aktuellen Umgebung, in der ich arbeite, ist die Verwendung von SpatialJoin oder anderen ArcGIS-Werkzeugen umständlich.

Aufgrund anderer Einschränkungen kann ich diese Bibliothek nicht verwenden. Schauen Sie sich Shapely an, das Sie mit easy_install herunterladen können, glaube ich.

Es verfügt über eine Reihe von schnellen Methoden, um die gängigsten und grundlegendsten Funktionen auszuführen. Kombinieren Sie dies mit shplib und Sie haben eine schnelle und leichte Alternative.


Dies ist ein alter Beitrag, daher war dieser zu diesem Zeitpunkt nicht verfügbar, aber das Datenzugriffsmodul (v10.1) ist superschnell und die Verwendung von Geometrieobjekten ermöglicht es Ihnen, diese Art von Abfrage schneller als mit der Standard-Toolbox durchzuführen. Es basiert auf NUMPY-Arrays und ist daher so leistungsstark und schnell.

http://resources.arcgis.com/en/help/main/10.1/index.html#/SearchCursor/018w00000011000000/ http://resources.arcgis.com/en/help/main/10.1/index.html#/ /018z00000070000000


Schau das Video: Thiessen polygon method on Arc GIS. Estimation of average rainfall (Oktober 2021).