Ich versuche, eine räumliche Verknüpfung zu erstellen, ähnlich wie im folgenden Beispiel: Gibt es eine Python-Option zum "Verknüpfen von Attributen nach Speicherort"? . Dieser Ansatz scheint jedoch wirklich ineffizient / langsam zu sein. Selbst das Ausführen mit bescheidenen 250 Punkten dauert fast 2 Minuten und schlägt bei Shapefiles mit> 1.000 Punkten vollständig fehl. Gibt es einen besseren Ansatz? Ich möchte dies vollständig in Python tun, ohne ArcGIS, QGIS usw. zu verwenden.
Es würde mich auch interessieren, ob es möglich ist, Attribute (dh Grundgesamtheit) aller Punkte, die in ein Polygon fallen, zu summieren und diese Menge mit dem Polygon-Shapefile zu verbinden.
Hier ist der Code, den ich konvertieren möchte. Ich erhalte eine Fehlermeldung in Zeile 9:
poly['properties']['score'] += point['properties']['score']
was sagt:
TypeError: Nicht unterstützte Operandentypen für + =: 'NoneType' und 'float'.
Wenn ich das "+ =" durch "=" ersetze, läuft es gut, aber das summiert nicht die Felder. Ich habe auch versucht, diese als ganze Zahlen zu machen, aber das schlägt auch fehl.
with fiona.open(poly_shp, 'r') as n:
with fiona.open(point_shp,'r') as s:
outSchema = {'geometry': 'Polygon','properties':{'region':'str','score':'float'}}
with fiona.open (out_shp, 'w', 'ESRI Shapefile', outSchema, crs) as output:
for point in s:
for poly in n:
if shape(point['geometry']).within(shape(poly['geometry'])):
poly['properties']['score']) += point['properties']['score'])
output.write({
'properties':{
'region':poly['properties']['NAME'],
'score':poly['properties']['score']},
'geometry':poly['geometry']})
quelle
Antworten:
Fiona gibt Python-Wörterbücher zurück und kann nicht
poly['properties']['score']) += point['properties']['score'])
mit einem Wörterbuch verwendet werden.Beispiel für das Summieren von Attributen unter Verwendung der von Mike T angegebenen Referenzen:
Jetzt können wir zwei Methoden mit oder ohne räumlichen Index verwenden:
1) ohne
2) mit einem R-Tree-Index (Sie können pyrtree oder rtree verwenden )
Ergebnis mit den beiden Lösungen:
Was ist der Unterschied ?
Nach:
Weitere Informationen finden Sie unter Verwenden der räumlichen Indexierung von Rtree mit OGR, Shapely, Fiona
quelle
Zusätzlich - Geopandas enthält nun optional
rtree
als Abhängigkeit das Github-RepoAnstatt dem obigen (sehr netten) Code zu folgen, können Sie einfach Folgendes tun:
Um diese schicke Funktionalität zu erhalten, müssen Sie zuerst die C-Bibliothek libspatialindex installieren
EDIT: Korrigierte Paketimporte
quelle
rtree
optional zu sein. Bedeutet das nicht, dass Siertree
neben derlibspatialindex
C-Bibliothek auch die Installation durchführen müssen ?rtree
wenn ich zum ersten Mal installiert hattelibspatialindex
... sie eine ziemlich große Version getan hat , da so ich habe sicher die Dinge ein wenig verändertVerwenden Sie Rtree als Index, um die viel schnelleren Verknüpfungen durchzuführen, und dann Shapely, um die räumlichen Prädikate zu erstellen , um festzustellen, ob sich ein Punkt tatsächlich innerhalb eines Polygons befindet. Bei richtiger Ausführung kann dies schneller sein als bei den meisten anderen GIS.
Beispiele finden Sie hier oder hier .
Im zweiten Teil Ihrer Frage zu 'SUM' verwenden Sie ein
dict
Objekt, um Populationen unter Verwendung einer Polygon-ID als Schlüssel zu akkumulieren. Mit PostGIS ist dies jedoch wesentlich einfacher.quelle
Diese Webseite zeigt, wie eine Begrenzungsrahmen-Point-in-Polygon-Suche vor der teureren räumlichen Abfrage von Shapely verwendet wird.
http://rexdouglass.com/fast-spatial-joins-in-python-with-a-spatial-index/
quelle