Mehr

Konvertieren von riesigen Multipolygonen in Polygone


Ich habe ein Shapefile mit einigen riesigen Multipolygonen mit 100.000 Teilen. Was wäre der einfachste Weg, sie in einzelne Polygone aufzuteilen? Ich suche nach etwas wie der QGIS-Funktion "Multipart to Singlepart", aber die Datei ist zu groß für QGIS. Ich vermute, dass es wahrscheinlich bereits ein Python-Modul gibt, das dies für mich tun kann. Irgendwelche Tipps?


Shapefiles haben keinen Typ MultiPolygon (type = Polygon), unterstützen sie aber trotzdem (alle Ringe werden in einem Polygon gespeichert = Liste der Polygone, siehe GDAL: ESRI Shapefile)

Mit Fiona und Shapely ist es einfacher:

fiona aus shapely.geometry importieren Shape, Mapping importieren # die ursprüngliche MultiPolygon-Datei mit fiona.open('multipolygons.shp') als Quelle öffnen: # die neue Datei erstellen: Treiber und crs sind gleich # für das Schema der Geometrietyp ist stattdessen "Polygon" output_schema = dict(source.schema) # eine unabhängige Kopie erstellen output_schema['geometry'] = "Polygon" with fiona.open('output.shp', 'w', driver=source.driver, crs =source.crs, schema=output_schema) als Ausgabe: # die Eingabedatei für multi in source lesen: # jedes Polygon-Feature für poly in shape(multi['geometry']) extrahieren: # das Polygon-Feature schreiben output.write({ 'Eigenschaften': multi['Eigenschaften'], 'Geometrie': Mapping(Poly)})

von der GDAL-Mailingliste mit Python

import os from osgeo import ogr def multipoly2poly(in_lyr, out_lyr): für in_feat in in_lyr: geom = in_feat.GetGeometryRef() if geom.GetGeometryName() == 'MULTIPOLYGON': für geom_part in geom: addPolygonToWk_part. , out_lyr) else: addPolygon(geom.ExportToWkb(), out_lyr) def addPolygon(simplePolygon, out_lyr): featureDefn = out_lyr.GetLayerDefn() polygon = ogr.CreateGeometryFromWkb(simplePolygon) out_feat = ogr.DefnFeature(feature) polygon) out_lyr.CreateFeature(out_feat) print 'Polygon hinzugefügt.' from osgeo import gdal gdal.UseExceptions() driver = ogr.GetDriverByName('ESRI Shapefile') in_ds = driver.Open('data/multipoly.shp', 0) in_lyr = in_ds.GetLayer() outputhp = 'data/poly. shp' if os.path.exists(outputshp): driver.DeleteDataSource(outputshp) out_ds = driver.CreateDataSource(outputshp) out_lyr = out_ds.CreateLayer('poly', geom_type=ogr.wkbPolygon) multipoly2poly(in_lyr, out_lyr)

Ogr2ogr große gdb-Datei zu SQLite-Warnung: "organizePolygons() hat ein Polygon mit mehr als 100 Teilen erhalten"

Ich versuche, eine .gdb-Datei (könnte auch jedes andere Format, geojson, gpkg usw.) in eine Spatialite-DB zu schreiben, aber es dauert eine Weile und ich erhalte eine Warnung.

Ich weiß, dass SQLite niedrige Standardeinstellungen für Transaktionen und Speicher hat, weshalb ich die Optionen -gt unlimited und --config OGR_SQLITE_CACHE 1024 hinzugefügt habe, aber sie haben keinen Einfluss auf die Geschwindigkeit des Befehls. Wenn diese beiden Optionen entfernt wurden, dauert es genauso lange.

Gibt es einen Befehl in ogr2ogr, mit dem ich diesen Vorgang beschleunigen kann, oder sollte ich vielleicht zu Geopandas wechseln und eine formschöne Funktion verwenden, um das Problem zu lösen?

Danke jede Hilfe wird geschätzt!

Eine Antwort

Der Fehler bedeutet, dass Ihre Quelldaten ein Polygon mit mehr als 100 Teilen enthalten. Ich glaube, dass Teile in diesem Zusammenhang Ringe bedeuten, sowohl äußere als auch innere. Eine ziemlich gute Erklärung finden Sie unter https://gdal.org/doxygen/classOGRGeometryFactory.html#a9ce97d39ca2e0dd88f415227e71b7fd5

Organisieren Sie Polygone basierend auf Geometrien. Analysieren Sie eine Gruppe von Ringen (die als einfache Polygone übergeben werden) und konvertieren Sie sie basierend auf einer geometrischen Analyse in ein Polygon mit inneren Ringen (oder ein MultiPolygon, wenn es sich um mehr als ein Polygon handelt), das der OGC Simple Feature-Spezifikation entspricht. Alle Eingabegeometrien müssen OGRPolygon/OGRCurvePolygon mit nur einem gültigen äußeren Ring (mindestens 4 Punkte) und keinen inneren Ringen sein. Die übergebenen Geometrien fallen in die Verantwortung der Methode, aber das papoPolygons "pointer array" bleibt im Besitz des Aufrufers. Zur schnelleren Berechnung wird ein Polygon als innerhalb eines anderen Polygons betrachtet, wenn ein einzelner Punkt seines äußeren Rings in den anderen eingeschlossen ist. (Es sei denn, die Konfigurationsoption 'OGR_DEBUG_ORGANIZE_POLYGONS' ist auf TRUE gesetzt. In diesem Fall wird ein langsamerer Algorithmus verwendet, der genaue topologische Beziehungen testet, wenn GEOS verfügbar ist.) In Fällen, in denen eine große Anzahl von Polygonen an diese Funktion übergeben wird, kann die Standardverarbeitung processing wirklich langsam sein. Sie können die Verarbeitung überspringen, indem Sie METHOD=SKIP zur Optionsliste hinzufügen (das Ergebnis der Funktion ist ein Multi-Polygon mit allen Polygonen als Polygone der obersten Ebene) oder nur Polygone gegen den Uhrzeigersinn analysieren lassen, indem Sie METHOD=ONLY_CCW zur Optionsliste hinzufügen, wenn Sie können davon ausgehen, dass der Umriss von Löchern gegen den Uhrzeigersinn definiert ist (dies ist die Konvention beispielsweise in Shapefiles, Personal-Geodatabases oder File-Geodatabases). Für FileGDB kann in den meisten Fällen, aber nicht immer, eine schnellere Methode als ONLY_CCW verwendet werden. Es ist CCW_INNER_JUST_AFTER_CW_OUTER. Bei der Verwendung wird davon ausgegangen, dass Innenringe gegen den Uhrzeigersinn orientiert sind und unmittelbar dem Außenring (im Uhrzeigersinn orientiert) folgen, zu dem sie gehören. Wenn diese Annahme nicht erfüllt ist, könnte ein Innenring mit dem falschen Außenring verbunden werden, daher muss diese Methode mit Vorsicht angewendet werden. Wenn die Konfigurationsoption OGR_ORGANIZE_POLYGONS definiert ist, überschreibt ihr Wert den Wert der Option METHOD von papszOptions (nützlich, um das Verhalten des Shapefile-Treibers zu ändern).

Ich bin mir nicht sicher, ob ich richtig verstanden habe, wie man steuert, welche Methode zur Analyse der Ringe verwendet wird, aber ich würde es mit diesem Befehl versuchen:

Schreiben Sie eine E-Mail an gdal-dev list, wenn dieser Befehl keinen Unterschied macht oder einen Fehler auslöst.


Alle Geodaten werden mit einem Koordinatenreferenzsystem (kurz CRS) geliefert, das beschreibt, wie die Daten auf der Erdoberfläche dargestellt werden. Eine detaillierte Definition von CRS würde den Rahmen dieses Beitrags sprengen, hier werden wir nur sehen, wie man CRS-Informationen von sf-Objekten erhält und wie man sie in ein neues Referenzsystem umwandelt.

CRS werden in sf durch ihren epsg-Code definiert, zum Beispiel hat das klassische GPS/WGS84-CRS den 4326-Code, lassen Sie uns dies untersuchen:

Bei der Arbeit mit Geodaten ist es wichtig sicherzustellen, dass die CRS angemessen sind, zum Beispiel sind Berechnungsbereiche oder Entfernungen in projizierten CRS sinnvoller als in geografischen CRS. Auch bei räumlichen Operationen an mehreren räumlichen Objekten müssen alle CRS identisch sein.


Einfache Funktionen

Es gibt eine Menge Pakete für R, mit denen Sie mit Shapefiles und räumlichen Daten interagieren können. Hier konzentrieren wir uns auf ein modernes Paket zum Lesen und Umwandeln von Geodaten in ein aufgeräumtes Format. Einfache Funktionen oder einfacher Funktionszugriff bezieht sich auf einen formalen Standard, der beschreibt, wie Objekte in der realen Welt in Computern dargestellt werden können, wobei der Schwerpunkt auf der räumlich Geometrie dieser Objekte. Außerdem wird beschrieben, wie solche Objekte in Datenbanken gespeichert und aus ihnen abgerufen werden können und welche geometrischen Operationen dafür definiert werden sollten.

Der Standard ist in räumlichen Datenbanken (wie PostGIS), kommerziellen GIS (wie ESRI ArcGIS) weit verbreitet und bildet die Vektordatenbasis für Bibliotheken wie GDAL. Eine Untermenge einfacher Features bildet den GeoJSON-Standard.

R verfügt über gut unterstützte Klassen zum Speichern von räumlichen Daten ( sp ) und als Schnittstellen zu den oben genannten Umgebungen ( rgdal , rgeos ), aber bisher fehlte eine vollständige Implementierung einfacher Funktionen, was Konvertierungen manchmal verworren, ineffizient oder unvollständig macht. Das sf-Paket versucht, diese Lücke zu füllen.


Ytdjtkui

Warum ist es eine schlechte Idee, einen Auftragskiller zu engagieren, um die meisten korrupten Politiker zu eliminieren?

Endlich erzeugte Matrixgruppen, deren Eigenwerte alle algebraisch sind

Welchen Exploit versuchen diese User Agents zu nutzen?

Testdaten für maschinelles Lernen

Wie man die "Sie verlieben"-Trope verhindert prevent

Was ist erforderlich, um GPS-Signale in Innenräumen verfügbar zu machen?

Verbindet die Idaho Potato Commission Kartoffelschalen mit gesunder Ernährung?

Konvertieren Sie Sekunden in Minuten

Autoscheinwerfer in einer Welt ohne Strom

Wie kann man sekundäre und tertiäre Charaktere kompakt erklären, ohne auf Stereotypen zurückzugreifen?

Welche Farbe zeigt am häufigsten an, dass das Eingabefeld deaktiviert ist?

Gibt es eine hemisphärenneutrale Möglichkeit, eine Jahreszeit anzugeben?

Wissensbasierte Authentifizierung mit domänengesteuertem Design in C#

Mobbing-Chef hat eine Hetzkampagne gestartet und mich arbeitslos gemacht

OP Amp verstärkt Audiosignal nicht

Prozessorgeschwindigkeit auf 0,4 GHz begrenzt

Entsperren Sie mein Telefon! Februar 2018

Wie zeigt man einem Vermieter, was wir an Ersparnissen haben?

Was bedeutet das gleiche-ish?

Was ist die schnellste ganzzahlige Faktorisierung, um RSA zu brechen?

Wie beende ich BASH während der Schleife mit dem Modulus-Operator?

Mathematica-Befehl, der es ermöglicht, meine Absichten zu lesen

Machen Sie Kreaturen mit einer Geschwindigkeit von 0 Fuß, fliegen Sie 30 Fuß. (schweben) jemals den Boden berührt?

Wie nennt man jemanden, der viele Fragen stellt?

Räumliche Überlagerungen: Vereinigung zwischen Multiline und Multipolygon mit Geopandas

Finden Sie Paare von Near-Features mit Geopandas, Fiona, GDAL usw. from Geometriesammlung zu Polygongeometrie mit PythonUnterschied zwischen Linien und Polygonen mithilfe von GeopandasGeopandas Dissolve versus PostGIS Postgresql aggregierte Gruppeby DissolveKnown Intersecting Polygons, die false für .intersects() in geopandas zurückgeben countryBuffer mit Dissolve - Geopandas - unary_union multipolygonOverlay Union Geopandas verbessern die LeistungWarum ist Union in ArcMap viel schneller als andere Ansätze?Wie erstelle ich ein Shapefile [Polygontyp] aus einem Geodataframe, der von einem Oracle Spatial-Cursor mit Geometriespalte type=cx_Oracle.LOB zurückgegeben wird?

Ich versuche, mein Multipolygon auf der Multilinie mit GeoPandas zu überlagern (anwenden), aber es scheint, als ob die GeoPandas-Überlagerungsfunktion nur mit (Multi)Polygon funktioniert. Gibt es eine Möglichkeit, das mit Multiline und Multipolygon mit GeoPandas zu machen. Hier ist mein Code:

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Ja, ich denke, ich kann das dp

Ich versuche, mein Multipolygon auf der Multilinie mit GeoPandas zu überlagern (anwenden), aber es scheint, als ob die GeoPandas-Überlagerungsfunktion nur mit (Multi)Polygon funktioniert. Gibt es eine Möglichkeit, das mit Multiline und Multipolygon mit GeoPandas zu machen. Hier ist mein Code:

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Ja, ich denke, ich kann das dp

Ich versuche, mein Multipolygon auf der Multilinie mit GeoPandas zu überlagern (anwenden), aber es scheint, als ob die GeoPandas-Überlagerungsfunktion nur mit (Multi)Polygon funktioniert. Gibt es eine Möglichkeit, das mit Multiline und Multipolygon mit GeoPandas zu machen. Hier ist mein Code:

Ich versuche, mein Multipolygon auf der Multilinie mit GeoPandas zu überlagern (anwenden), aber es scheint, als ob die GeoPandas-Überlagerungsfunktion nur mit (Multi)Polygon funktioniert. Gibt es eine Möglichkeit, das mit Multiline und Multipolygon mit GeoPandas zu machen. Hier ist mein Code:

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Ja, ich denke, ich kann das dp

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Ja, ich denke, ich kann das dp

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Welche Ausgabe erwarten Sie beim Überlagern von Polygonen mit Linien? Linien mit Polygonattributen teilen?

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Ja genau das möchte ich machen, Linien mit Polygonattributen zu teilen

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Können Sie einige Mustergeometrien mit formschönen Objekten hartcodieren?

Ja, ich denke, ich kann das dp

Ja, ich denke, ich kann das dp


3. Arbeiten mit Rasterdaten¶

Im Gegensatz zu Vektordaten (geometrische Objekte: wie Punkte, Linien, Polygone) sind Rasterdaten eine Matrix von Werten von „Pixeln“ (auch „Zellen“ genannt). Jede Zelle stellt einen kleinen Bereich dar und enthält einen Wert, der einige Informationen darstellt:

Rasterdaten sind wie digitale Bilddaten, die Sie auf Ihrem Computer betrachten, mit der Ausnahme, dass jetzt jedes Pixel einen räumlichen Bereich darstellt. Die „Auflösung“ eines Rasters ist der Bereich, den jedes Pixel darstellt. Ein Raster mit einer Auflösung von 1 Meter bedeutet, dass jedes Pixel eine Fläche von 1 m x 1 m auf dem Boden darstellt. Wenn wir jedoch „hohe Auflösung“ sagen, meinen wir oft einen niedrigen Auflösungswert für jedes Pixel, d. h. eine Auflösung von 1 Meter ist höher als eine Auflösung von 8 Metern, wie das folgende Bild zeigt:

Wie bei Vektordaten gibt es verschiedene Dateiformate zum Speichern von Rasterdaten. Am gebräuchlichsten ist GeoTIFF ( .tif ), bei dem es sich im Wesentlichen um eine Bilddatei mit eingebetteten Georeferenzierungsinformationen handelt. Rasterdaten werden für eine Vielzahl von Problemen verwendet, gängige Beispiele sind Satellitenbilder und digitale Höhenmodelle. Diese Dinge gehen etwas außerhalb des Rahmens dieses Kurses, aber schauen wir uns unten kurz einige Rasterdaten an. Das Kernpaket für die Arbeit mit Rasterdaten in Python ist rasterio.

Ich habe eine Satellitenbild-Rasterdatei eines Teils von UBC in meinem Datenordner, die ich aus dem Abacus Data Network heruntergeladen habe. Laden wir es mit rasterio ein:

Wir können damit beginnen, Dinge wie die Breite und Höhe (in Pixel/Zellen) des Rasters zu untersuchen:

Rasterdaten weisen häufig „Bänder“ auf, die unterschiedliche Informationen darstellen (z. B. weist ein Farbbild normalerweise rote, grüne und blaue Bänder auf). Dieses spezielle Satellitenbild hat 4 Bänder (in der Reihenfolge: Rot, Blau, Grün, Infrarot):

Wir könnten das erste Band als numpy-Array importieren mit:

Aber bevor Sie weitere Daten importieren, ist es hilfreich, nur das Bild zu sehen. Zuerst werde ich mein Raster „herunterrechnen“ (die Auflösung durch Erhöhen der Zellengröße reduzieren), um die Größe der Daten zu reduzieren und die Dinge etwas zu beschleunigen:

Da unsere Daten nur numpy Array(s) sind, können wir sie mit der matplotlib-Funktion plt.imshow() plotten:

Natürlich sieht es auf allen Kanälen realistischer aus:

rasterio bietet viele erweiterte Funktionen zum Bearbeiten und Plotten von Rasterdaten, wenn Sie dies benötigen. Sehen Sie sich die Dokumentation an.


Testgetriebene Entwicklung (TDD)

Nachdem ich die Referenzimplementierung (die pointsWithinPolygon-Funktion von Turf.js) und unsere beiden Eingaben für die Funktion identifiziert hatte, schrieb ich als nächstes ein kleines TypeScript-Modul, das in Node.js ausgeführt und Turf.js aufgerufen und die Ergebnisse ausgedruckt wurde. Ich habe diese in Geojson-Dateien in tests/fixtures/natural-earth/ gespeichert. Jetzt gibt es 6 Testfälle, die wir später vergleichen werden. Einfache und komplexe Polygone und 3 Größen von Punktsammlungen (10, 100 und 1.000).

Hier ist ein Auszug aus einem der Unit-Tests in Rust. Beachten Sie die Musterübereinstimmung am Ende:


Hfrhyu

Gibt es eine Art Relais, das nur beim Schalten Strom verbraucht?

Gibt es stichhaltige Beweise dafür, dass das Peer-Review-System für Zuschüsse deutlich besser abschneidet als das Zufallsprinzip?

Kann der „Machtangriff“ des Großen Waffenmeisters auf Angriffe des Zaubers „Spirituelle Waffe“ angewendet werden?

Hat Deadpool die gesamte X-Force gerettet?

Wie ausfallsicher ist nr als Stoppbytes?

Wie kann ich mit einem Makro die Lücke zwischen links und rechts von cdot verringern?

Ist der folgende Code schlecht geformter NDR oder wohlgeformt?

Wie verwende ich das neue nichtlineare Finite Element in Mathematica 12 für diese Gleichung?

Warum klingt es manchmal gut, eine Vorschlagsnote als Einleitung zu einer Note in einer Melodie zu spielen?

Welche Topologie ist mit den Algebren für die Ultrafiltermonade verbunden?

Wie oft kommt Rochade in Großmeisterspielen vor?

Warum wurde DOSKEY nicht in COMMAND.COM integriert?

Warum müssen wir das Builder-Entwurfsmuster verwenden, wenn wir dasselbe mit Settern tun können?

Was ist die Bedeutung von "befestigte Infraction Zurückhaltung"?

Warum wurde Sam nicht Lord of Horn Hill?

AppleTVs erstellen ein gesprächiges alternatives WLAN-Netzwerk

Frage zur Entprellung - Verzögerung des Zustandswechsels

Wie würden Sie diesen seltsamen metallischen Apparat nennen, mit dem Sie Menschen heben können?

Was ist ein Bruch-Matching?

Warum ist es schneller, etwas aufzuwärmen, als es zu kochen?

Wie reagiert man auf feindseliges Verhalten eines Senior-Entwicklers?

Kann man vom Zentrum der Boötes-Leere etwas sehen? Wie dunkel wäre es?

Finden Sie schnell alle Polygone, die sich mit zwei oder mehr Polygonen in Shapely überschneiden

Unicorn Meta Zoo #1: Warum ein weiterer Podcast?Wie finde ich die Schnittpunkte von überlappenden Pufferzonen in einem einzelnen Shapefile?Finde und listen Sie alle Polygone auf, die sich mit einem anderen Polygon überlappenWie konvertiert man kleine überlappende Polygon-Features in den inneren Ring in QGISShapely (Geos) stürzt ab unary_unionAuflösen von Polygonen basierend auf Attributen mit Python (shapely, fiona)?Summieren von Attributwerten für Bereiche, in denen sich mehrere Polygone mit QGIS überlappen?ArcGIS findet alle Polygone, die sich mit mehr als einem Polygon aus einem anderen Layer schneidenClipping-Algorithmus, der einen Layer ohne überlappende Polygone aus N PolygoneMultipolygon aus Scratch Layer erstelltWann erkennt Shapelys “polygonize_full” ein Dangle?Kann mit GeoPandas keine Polygone finden, die sich innerhalb eines großen Polygons befinden

Ich habe eine Reihe von Polygonen (in Shapely), mit denen ich alle Schnittpunkte finden möchte, die aus Überlappungen von zwei oder mehr Polygonen bestehen. Ich habe auf der Grundlage des Codes in dieser Antwort gearbeitet. Ich habe bisher einen Code, der in der folgenden if 1:-Anweisung funktioniert, aber die Ausführung dauert sehr lange. Der Code, der in der if 0:-Anweisung enthalten ist, wird schnell ausgeführt, erzeugt jedoch eine Ausgabe mit einigen Fehlern. Unten finden Sie ein Beispiel für den Fehler.

Unten stellt das Orange alle Formen dar, die ich überprüfen möchte, ob sie (durch unäre Vereinigung in Shapely) durch zwei oder mehr Überlappungen erzeugt werden, das Cyan steht für die Ausgabe der funktionierenden if-Anweisung (wenn 1 im obigen Code) , und das Rosa stellt die falsch ausgewählten Polygone durch die if-Anweisung dar, die nicht funktioniert (wenn 0 im obigen Code). Die oberen linken Ecken der Textfelder in den Bildern stellen den ausgewählten Punkt dar, und wie Sie im zweiten Bild sehen können, enthält der rosa Bereich nur ein Polygon aus den STEREO_OBSERVATIONS (das ist der Satz von Polygonen, die auf Überlappung überprüft werden). Daher sollte es nicht ausgewählt werden. Im Gegensatz dazu hat das links benachbarte Cyan-Quadrat zum rosafarbenen Quadrat, das im dritten Bild hervorgehoben ist, zwei Polygone von STEREO_OBSERVATIONS und wird als solches durch das Cyan-Ergebnis korrekt ausgewählt. Die Schichtung der Polygonschichten wird im ersten Bild gezeigt.

Wie kann die STRtree-Struktur am besten abgefragt werden, um auf Schnittpunkte oder Überlappungen zu prüfen? Ich habe versucht, den Schwerpunkt im Code zu verwenden, aber das scheint nicht die richtige Ausgabe zu erzeugen.

Abb. 1 (Legende/Schichtung)

Abb. 2. (Falsche Auswahl durch schnellen Algorithmus [wenn 0 im Code] in Pink)

Abb. 3. (Korrekte Auswahl durch langsamen Algorithmus [wenn 1 im Code]


R als GIS für Ökonomen

Mit räumlicher Verknüpfung meinen wir räumliche Operationen, die alle der folgenden Elemente umfassen:

  • Überlagern einer räumlichen Ebene (Zielebene) auf eine andere räumliche Ebene (Quellebene)
  • für jede der Beobachtungen in der Zielschicht
    • identifizieren, mit welchen Objekten in der Quellschicht es geografisch (oder eine andere topologische Beziehung) schneidet
    • Extrahieren von Werten, die den sich überschneidenden Objekten in der Quellebene zugeordnet sind (und ggf.
    • Weisen Sie den extrahierten Wert dem Objekt in der Zielebene zu

    Für Ökonomen ist dies wahrscheinlich die häufigste Motivation für den Einsatz von GIS-Software, wobei das Endziel darin besteht, die räumlich verbundenen Variablen als Kovariaten in die Regressionsanalyse einzubeziehen.

    Wir können räumliche Verknüpfungen nach dem Typ der zugrunde liegenden räumlichen Objekte in vier Kategorien einteilen:

    • Vektor-Vektor: Vektordaten (Ziel) gegen Vektordaten (Quelle)
    • vector-raster: Vektordaten (Ziel) gegen Rasterdaten (Quelle)
    • raster-vector: Rasterdaten (Ziel) gegen Vektordaten (Quelle)
    • raster-raster: Rasterdaten (Ziel) gegen Rasterdaten (Quelle)

    Unter den vier liegt unser Fokus hier auf dem ersten Fall. Der zweite Fall wird in Kapitel 5 behandelt. Den dritten und vierten Fall werden wir in diesem Kurs nicht behandeln, da es sich bei unseren Zieldaten fast immer um Vektordaten handelt (z. B. Stadt- oder Hoffelder als Punkte, politische Grenzen wie Polygone usw.).

    Kategorie 1 kann je nach Art des räumlichen Objekts (Punkt, Linie und Polygon) weiter in verschiedene Unterkategorien unterteilt werden. Hier ignorieren wir alle räumlichen Verbindungen, die Linien beinhalten. Dies liegt daran, dass durch Linien dargestellte Objekte in der ökonometrischen Analyse selten Beobachtungseinheiten sind und auch nicht die Quelldaten, aus denen wir Werte extrahieren. 64 Hier ist die Liste der Arten von räumlichen Verknüpfungen, die wir lernen werden.

    1. Punkte (Ziel) gegen Polygone (Quelle)
    2. Polygone (Ziel) gegen Punkte (Quelle)
    3. Polygone (Ziel) gegen Polygone (Quelle)

    3.3.1 Fall 1: Punkte (Ziel) vs. Polygone (Quelle)

    Fall 1 findet für jede der Beobachtungen (Punkte) in den Zieldaten, welches Polygon in der Quelldatei es schneidet, und weist dann dem Punkt 65 den dem Polygon zugeordneten Wert zu. Um dies zu erreichen, können wir die Funktion st_join() verwenden, deren Syntax wie folgt lautet:

    Ähnlich wie bei der räumlichen Unterordnung ist die topologische Standardbeziehung st_intersects() 66 .

    Wir verwenden die Kansas-Bewässerungsbrunnendaten (Punkte) und Kansas County-Grenzdaten (Polygone) für eine Demonstration. Unser Ziel ist es, die Maispreisinformationen auf Bezirksebene aus den Daten des Bezirks Kansas den Bohrlöchern zuzuordnen. Lassen Sie mich zunächst eine gefälschte Maispreisvariable auf Bezirksebene erstellen und den Bezirksdaten von Kansas hinzufügen.

    Hier ist die Karte der Kansas Countys, farblich differenziert nach dem Preis für gefälschten Mais (Abbildung 3.16):

    Abbildung 3.16: Karte des Preises für gefälschten Mais auf Kreisebene

    Für diesen speziellen Kontext erledigt der folgende Code die Aufgabe:

    Sie können aus Abbildung 3.17 unten sehen, dass alle Brunnen innerhalb derselben Grafschaft den gleichen Maispreiswert haben.

    Abbildung 3.17: Karte der Wells, farblich differenziert nach Maispreis

    3.3.2 Fall 2: Polygone (Ziel) vs. Punkte (Quelle)

    Fall 2: Finden Sie für jede der Beobachtungen (Polygone) in den Zieldaten, welche Beobachtungen (Punkte) in der Quelldatei schneidet, und weisen Sie dann dem Polygon die den Punkten zugeordneten Werte zu. Wir verwenden dieselbe Funktion: st_join() 67 .

    Angenommen, Sie interessieren sich jetzt für eine Analyse auf Kreisebene und möchten das gesamte Grundwasserpumpen auf Kreisebene durchführen. Die Zieldatei ist KS_counties und die Quelldatei ist KS_wells .

    Wie Sie im resultierenden Datensatz sehen können, umfassen alle einzigartigen Polygon-Punkt-Schnittkombinationen die Beobachtungen. Für jedes der Polygone haben Sie so viele Beobachtungen wie die Anzahl der Brunnen, die das Polygon schneiden. Sobald Sie die beiden Layer verbunden haben, finden Sie Statistiken nach Polygon (hier nach Landkreis). Da wir eine Grundwasserentnahme nach Landkreisen wünschen, wird dies wie folgt erledigt.

    Natürlich ist es genauso einfach, andere Arten von Statistiken zu erhalten, indem Sie einfach den Abschnittsumfassen() ändern.

    Dieser zweistufige Prozess kann jedoch tatsächlich in einem Schritt mit aggregat() durchgeführt werden, in dem Sie wie folgt angeben, wie Sie mit der Option FUN aggregieren möchten:

    Beachten Sie, dass die Funktion mean() auf alle Spalten in KS_wells angewendet wurde, einschließlich der Site-ID-Nummer. Daher möchten Sie möglicherweise Variablen auswählen, die Sie verknüpfen möchten, bevor Sie die Funktion aggregieren () wie folgt anwenden:

    3.3.3 Fall 3: Polygone (Ziel) vs. Polygone (Quelle)

    In diesem Fall gibt st_join(target_sf, source_sf) alle eindeutigen sich überschneidenden Polygon-Polygon-Kombinationen mit den angehängten Informationen des Polygons aus source_sf zurück.

    Wir werden 2018 in Iowa Mais-Acres auf Bezirksebene von USDA NASS 68 und Hydrologic Units 69 verwenden. Unser Ziel hier ist es, Mais-Acre nach HUC-Einheiten basierend auf den Daten zu Mais-Acre auf Bezirksebene zu finden 70 .

    Wir importieren zuerst die Iowa-Mais-Acre-Daten:

    Hier ist die Karte der Grafschaften von Iowa, die nach Maisfeldern farblich differenziert sind (Abbildung 3.18):

    Abbildung 3.18: Karte der Grafschaften von Iowa, farblich differenziert nach Maisanbauflächen

    Importieren Sie nun die HUC-Einheitendaten:

    Hier ist die Karte der HUC-Einheiten (Abbildung 3.19):

    Abbildung 3.19: Karte der HUC-Einheiten, die die Staatsgrenze von Iowa schneidena

    Hier ist eine Karte von Iowa Countys mit HUC-Einheiten darüber (Abbildung 3.20):

    Abbildung 3.20: Karte der HUC-Einheiten, die den Landkreisen in Iowas . überlagert sind

    Räumliches Verbinden wird Folgendes erzeugen.

    Jede der sich überschneidenden HUC-Grafschaft-Kombinationen wird zu einer Beobachtung, deren resultierende Geometrie der Geometrie der HUC-Einheit entspricht. Um dies zu sehen, werfen wir einen Blick auf eine der HUC-Einheiten.

    Die HUC-Einheit mit HUC_CODE ==10170203 schneidet sich mit vier Countys.

    Abbildung 3.21 zeigt die Karte der vier Beobachtungen.

    Abbildung 3.21: Karte der HUC-Einheit

    Alle vier Beobachtungen haben also die identische Geometrie, die der HUC-Einheit entspricht, was bedeutet, dass st_join() keine Informationen über die Art der Schnittmenge der HUC-Einheit und der vier Landkreise hinterlassen hat. Denken Sie auch hier daran, dass die Standardoption st_intersects() ist, die überprüft, ob sich räumliche Objekte überschneiden oder nicht, mehr nicht. Wenn Sie nur den einfachen Durchschnitt der Mais-Acre berechnen und den Grad der räumlichen Überschneidungen ignorieren, ist dies in Ordnung. Wenn Sie jedoch den flächengewichteten Durchschnitt berechnen möchten, verfügen Sie nicht über ausreichende Informationen. Unten sehen Sie, wie Sie den flächengewichteten Durchschnitt ermitteln.

    Beachten Sie, dass wir in Kapitel 1.4 keine Attributwerte der Eisenbahnen extrahiert haben. Wir haben gerade die Fahrlänge der Eisenbahnen berechnet, was bedeutet, dass die Geometrie der Eisenbahnen selbst von Interesse war und nicht die mit der Eisenbahn verbundenen Werte.↩︎

    Ein praktisches Beispiel für diesen Fall in Aktion sehen Sie in Demonstration 1 von Kapitel 1.↩︎

    Obwohl es unwahrscheinlich ist, dass Sie die topologische Beziehung ändern müssen, können Sie dies mit der Join-Option tun.↩︎

    Ein praktisches Beispiel für diesen Fall in Aktion sehen Sie in Demonstration 2 von Kapitel 1.↩︎

    Siehe Kapitel 9.1 zum Herunterladen von Quick Stats-Daten aus R.

    Sehen Sie hier für eine Erklärung, was sie sind. Sie müssen nicht wirklich wissen, was HUC-Einheiten sind, um zu verstehen, was in diesem Abschnitt gemacht wird.↩︎

    Ja, es kommt zu erheblichen Messfehlern, da die Quellpolygone (Mais-Acre nach Landkreis) im Verhältnis zu den Zielpolygonen (HUC-Einheiten) groß sind. Dies dient jedoch als gute Veranschaulichung einer Polygon-Polygon-Verknüpfung


    Schau das Video: Neelix - You Extended Mix Official Music Video (Oktober 2021).