Rgeos löscht zugehörige Werte, wenn sich Polygone schneiden


11

Ich versuche, zwei SpatialPolygonsDataFrames zu schneiden und als Ergebnis einen SpatialPolygonsDataFrame zu erhalten. Leider kann ich mit der gIntersectionFunktion von rgeos(die beeindruckend schnell arbeitet, um die Polygone zu schneiden) die zugehörigen Datenrahmen nicht abrufen. Betrachten Sie das folgende Beispiel:

> fracPoly <- gIntersection( toSingle, fromSingle )
> class(toSingle)
[1] "SpatialPolygonsDataFrame"
> class(fromSingle)
[1] "SpatialPolygonsDataFrame"
> class(fracPoly)
[1] "SpatialPolygons"

Ich kann eine Wrapper-Funktion schreiben, die die Übertragung von übernimmt data.frames, aber es wird ein kleiner Schmerz sein, alle Überprüfungen richtig durchzuführen, und vorher hatte ich gehofft, jemand könnte entweder bestätigen, dass es keinen besseren Weg gibt, oder mich auf eine andere Funktion (oder Option) hinweisen für gIntersection) was mir erlauben würde, das zugehörige beizubehalten data.frames.

Aktualisieren

Bei weiterer Überlegung kann dies ein sehr absichtliches Verhalten von sein gIntersection. Immerhin, von den beiden SPDFs, wessen Datenrahmen geben Sie weiter? Daher muss ich möglicherweise einen Wrapper schreiben, der die beiden zusammenführt.


1
Wie lädst du deine Polgyons - readShape * oder readOGR? Ich bekomme ein seltsames Verhalten mit gIntersection, abhängig davon, in welcher Bibliothek ich SPDFs geladen habe, denen ich nicht auf den Grund gegangen bin.
Simbamangu

@ Simbamangu Interessant. Ich benutze readShapePoly und füge dann einen data.frame zusammen ....
Ari B. Friedman

gIntersection SOLLTE die data.frames für die überlappenden Bereiche zusammenführen. Wenn ich in QGIS Vector | Geoprocessing | Intersect ausführe, besteht die Ausgabe aus einer Reihe von zusammengeführten Attributen für die Überlappung, und QGIS verwendet nicht dieselbe GEOS-Bibliothek für räumliche Operationen wie Dies?
Simbamangu

Nun, wenn es sollte, bin ich ratlos. Ich habe meinen Code bereits neu geschrieben, um die data.frames von Hand zusammenzuführen und wieder einzufügen, sodass ich vorerst keine Zeit mehr damit verbringen werde. Der Hinweis, dass das Lesen der Funktion im Shapefile von Bedeutung ist, ist jedoch hilfreich.
Ari B. Friedman

1
Dies ist eindeutig keine Antwort, aber ich habe nicht genug Punkte, um einen Kommentar zu hinterlassen ... Ari, ich habe mich gefragt, ob Sie Ihren Codeabschnitt freigeben würden, um die Variablen nach den Rgeos-Overlay-Funktionen zu extrahieren. Ich habe Probleme, meinen Kopf um einen guten Weg zu wickeln, um die ursprünglichen Polygon-IDs aus verschiedenen Rgeos-Operationen wie gUnion ...
jed.a.long

Antworten:


2

Für einige Projekte hatte ich das gleiche Bedürfnis. Viel mehr als das Beibehalten data.frame, mussten wir weiteren Code einrichten, um den Ausgabegeometrietyp zu verwalten, und mit einer Bereinigung fortfahren (z. B. saubere Geometriesammlungen), um einen vollständigen Schnittpunkt-Geoprozess zu erhalten. Falls Sie eine solche Aufgabe in R noch ausführen müssen , können Sie das RFigisGeo- Paket ausprobieren :

#install RFigisGeo
require(devtools) 
install_github("RFigisGeo", "openfigis")
require(RFigisGeo)

#compute intersection
result <- getIntersection(features1, features2)

Sowohl Ihre als auch die Antworten von @ berndv sehen so aus, als würden sie mein Problem lösen. Vielen Dank! Markieren Sie dieses, seit es zuerst kam.
Ari B. Friedman

10

Das Verhalten von gIntersection besteht darin, keine geschnittenen Daten von Entwurf zu übergeben:

Da es keine allgemeinen Übereinstimmungen zwischen geschnittenen räumlichen Objekten gibt, erfordern beliebige Operationen an Attributen Annahmen über unbekannte Benutzerabsichten. Aus diesem Grund sollten keine Datensteckplätze durchlaufen werden ...

... Das Design von gIntesection () ist beabsichtigt, da nur der Benutzer wissen kann, was mit Attributen von Entitäten zu tun ist, deren Geometrien geändert wurden. Unterschiedliche Benutzer können unterschiedliche Annahmen treffen, aber es gibt keine allgemeine Lösung, die über die IDs der sich überschneidenden Geometrien hinausgeht, wie dies im Mechanismus row.names () der Fall ist.

Zu meiner Überraschung verfügt das Rasterpaket über eine Schnittfunktion , die sich einfach schneidet und auch die Daten übergibt.

Das Rasterpaket verfügt über einige Funktionen, die rgeos erweitern, indem auch versucht wird, Attributdaten zu verarbeiten. In diesem Fall siehe raster :: intersect und die Liste der Funktionen hier :? "Raster-package" (Abschnitt XIV)

Die vollständigen Informationen dazu habe ich erhalten: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html


0

Für diejenigen (wie mich), für die die obigen Antworten nicht funktioniert haben, erklärt der Link hier, dass Sie genau dies mit dem Schnittpunkt des Rasters tun können.

Wie behalte ich alle Attributdaten bei, wenn zwei Polygone in R abgeschnitten werden?

Ich habe dies verwendet, um einen SpatialPointsDataFrame mit einem SpatialPolygons-Shapefile zuzuschneiden. Es wird eine beschnittene / abgeschnittene Version des SpatialPointsDataFrame erstellt, wobei die Originaldaten beibehalten werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.