Ich habe ein Linien-Shapefile, das ein Straßennetz darstellt. Ich möchte diese Daten rastern, wobei die resultierenden Werte im Raster die Gesamtlänge der Linien anzeigen, die in die Rasterzelle fallen.
Die Daten befinden sich in der British National Grid-Projektion, sodass die Einheiten Meter sind.
Idealerweise möchte ich diese Operation mit ausführen R
, und ich vermute, dass die rasterize
Funktion aus dem raster
Paket dazu beitragen würde. Ich kann einfach nicht herausfinden, welche Funktion angewendet werden soll.
raster
r
line
rasterization
JPD
quelle
quelle
vignette('over', package = 'sp')
könnte helfen.Antworten:
Nach einer kürzlich gestellten Frage möchten Sie möglicherweise die Funktionen des rgeos- Pakets nutzen, um Ihr Problem zu lösen. Aus Gründen der Reproduzierbarkeit habe ich ein Shapefile der tansanischen Straßen von DIVA-GIS heruntergeladen und in mein aktuelles Arbeitsverzeichnis gestellt. Für die anstehenden Aufgaben benötigen Sie drei Pakete:
Folglich sollten Ihre ersten Zeilen von could so aussehen:
Danach müssen Sie die Shapefile-Daten importieren. Beachten Sie, dass DIVA-GIS-Shapefiles in EPSG: 4326 verteilt sind. Daher projiziere ich das Shapefile in EPSG: 21037 (UTM 37S), um Meter statt Grad zu verarbeiten.
Für die anschließende Rasterung benötigen Sie eine Rastervorlage, die die räumliche Ausdehnung Ihres Shapefiles abdeckt. Die Rastervorlage besteht standardmäßig aus 10 Zeilen und 10 Spalten, wodurch zu lange Rechenzeiten vermieden werden.
Nachdem Sie die Vorlage eingerichtet haben, durchlaufen Sie alle Zellen des Rasters (das derzeit nur aus NA-Werten besteht). Durch Zuweisen eines Werts von '1' zu der aktuellen Zelle und anschließende Ausführung
rasterToPolygons
wird im resultierenden Shapefile 'tmp_shp' automatisch die Ausdehnung des aktuell verarbeiteten Pixels gespeichert.gIntersects
Erkennt, ob sich diese Ausdehnung mit Straßen überschneidet. Wenn nicht, gibt die Funktion den Wert '0' zurück. Andernfalls wird das Straßen-Shapefile von der aktuellen Zelle abgeschnitten und die Gesamtlänge von "SpatialLines" in dieser Zelle wird mit berechnetgLength
.Zuletzt können Sie die berechneten Längen (die in Kilometer umgerechnet werden) in die Rastervorlage einfügen und Ihre Ergebnisse visuell überprüfen.
quelle
sapply()
aufpbsapply()
das Cluster-Argument gewechselt und es verwendetcl = detectCores()-1
. Jetzt kann ich dieses Beispiel parallel ausführen!Das Folgende ist aus der Lösung von Jeffrey Evans modifiziert. Diese Lösung ist viel schneller, da keine Rasterung verwendet wird
quelle
raster::intersect()
vorher nicht gesehen , gefällt mir, dass es im Gegensatz zu den Attributen der geschnittenen Features kombiniertrgeos::gIntersection()
.Sie benötigen keine for-Schleife. Schneiden Sie einfach alles auf einmal und fügen Sie dann mit der Funktion "SpatialLinesLengths" in sp den neuen Liniensegmenten Linienlängen hinzu. Mithilfe der Raster-Package-Rasterize-Funktion mit dem Argument fun = sum können Sie dann ein Raster mit der Summe der Zeilenlängen erstellen, die jede Zelle schneiden. Unter Verwendung der obigen Antwort und der zugehörigen Daten handelt es sich hier um Code, der die gleichen Ergebnisse generiert.
quelle
SpatialLinesLengths
. Schätze, es ist nie zu spät zu lernen, danke (:rasterize
dauert allerdings ziemlich lange (7-mal länger als der obere Ansatz auf meinem Computer).rasterize()
Funktion alle Linien enthält, die eine bestimmte Zelle berühren . Dies führt in einigen Fällen dazu, dass Liniensegmentlängen zweimal gezählt werden: einmal in der Zelle, die sie haben sollen, und einmal in der angrenzenden Zelle, die der Linienendpunkt gerade berührt.Hier ist noch ein anderer Ansatz. Es weicht von den bereits mit dem
spatstat
Paket gegebenen ab . Soweit ich das beurteilen kann, verfügt dieses Paket über eine eigene Version von räumlichen Objekten (z. B. imim
Vergleich zuraster
Objekten), aber dasmaptools
Paket ermöglicht die Konvertierung zwischenspatstat
Objekten und räumlichen Standardobjekten.Dieser Ansatz stammt aus diesem R-sig-Geo-Beitrag .
Das langsamste Bit konvertiert die Straßen von
SpatialLines
in ein Liniensegmentmuster (dhspatstat::psp
). Sobald dies erledigt ist, sind die tatsächlichen Längenberechnungsteile ziemlich schnell, sogar für viel höhere Auflösungen. Zum Beispiel auf meinem alten 2009 MacBook:quelle
Lassen Sie mich Ihnen die Paket- Ader mit mehreren Funktionen zum Bearbeiten von räumlichen Linien und zum Importieren von sf und data.table vorstellen
quelle
Dies mag ein bisschen naiv klingen, aber wenn es sich um ein Straßensystem handelt, wählen Sie die Straßen aus und speichern Sie sie in einer Zwischenablage. Suchen Sie dann ein Tool, mit dem Sie der Zwischenablage einen Puffer hinzufügen können. Stellen Sie ihn auf die zulässige Straßenbreite ein, dh 3 Meter +/- Denken Sie daran, dass sich der Puffer für jede Seite von der Mittellinie bis zur Kante * 2 i befindet, sodass ein 3-Meter-Puffer tatsächlich eine 6-Meter-Straße von einer Seite zur anderen ist.
quelle