Shapefile in R öffnen? [geschlossen]

64

Ich muss ein Shapefile aus ArcMap in R öffnen, um es für weitere geostatistische Analysen zu verwenden. Ich habe es in eine ASCII-Textdatei konvertiert, aber in R wird es als data.frame erkannt. Die Koordinatenfunktion funktioniert nicht, sobald x und y als nicht numerisch erkannt werden.

Könnten Sie helfen, damit umzugehen?

slava
quelle
1
Was für ein Shapefile? Ich gehe von Punkten aus, da es eine X- und eine Y-Spalte hat.
Simbamangu

Antworten:

54

Verwenden Sie das Shapefile direkt. Sie können dies einfach mit den Paketen rgdaloder tun sfund die Form in einem Objekt lesen. Für beide Pakete müssen Sie Folgendes angeben: dsn- die Datenquelle, die im Fall eines Shapefiles das Verzeichnis ist , und layer- den Namen des Shapefiles abzüglich der Erweiterung:

# Read SHAPEFILE.shp from the current working directory (".")

require(rgdal)
shape <- readOGR(dsn = ".", layer = "SHAPEFILE")

require(sf)
shape <- read_sf(dsn = ".", layer = "SHAPEFILE")

(In rgdal, OSX oder Linux können Sie die Abkürzung '~' für das Ausgangsverzeichnis nicht als Datenquellenverzeichnis ( dsn) verwenden. Andernfalls wird die Meldung "Datenquelle kann nicht geöffnet werden" nicht angezeigt. Das sfPaket funktioniert nicht haben diese Einschränkung neben einigen anderen Vorteilen.)

Dadurch erhalten Sie ein Objekt, das ein Spatial * -Datenrahmen (Punkte, Linien oder Polygone) ist. Die Felder der Attributtabelle sind dann für Sie wie für einen normalen Datenrahmen verfügbar, dh shape$IDfür die ID-Spalte.

Wenn Sie die von Ihnen importierte ASCII-Datei verwenden möchten, konvertieren Sie einfach die Textfelder (Zeichen) x und y in Zahlen, z.

shape$x <- as.numeric(as.character(shape$x))
shape$y <- as.numeric(as.character(shape$y))
coordinates(shape) <- ~x + y

Edit 2015-01-18 : beachte, dass rgdal ein bisschen besser ist als maptools (was ich anfangs hier vorgeschlagen habe), hauptsächlich weil es Projektionsinformationen automatisch liest und schreibt.

Anmerkungen:

  • Die verschachtelten as.numeric(as.character())Funktionen - Wenn Ihr ASCII-Text als Faktor gelesen wurde (wahrscheinlich), wird sichergestellt, dass Sie die numerischen Werte anstelle der Faktorstufen erhalten.
  • rgdalSie sfhaben verwirrende Möglichkeiten, auf verschiedene Datei- und Datenbanktypen zuzugreifen (z. B. bei einer GPX-Datei ist dsn der Dateiname und überlagert die einzelnen Komponenten wie Wegpunkte, Trackpunkte usw.). Sie müssen die Online-Beispiele sorgfältig lesen.
Simbamangu
quelle
Sollte R numerische Felder analysieren, so würde ich mir vorstellen, dass es einen Sonderzeichentyp in x und y gibt. Außerdem werden beim Importieren, sofern nicht anders angegeben, Zeichenfelder zu einem Faktor gezwungen. Daher funktioniert eine einfache "as.numeric" -Verzögerung nicht. Ich würde auch "readORG" in "rgdal" anstelle von Maptools verwenden.
Jeffrey Evans
@ Jeffrey, readOGR ist definitiv der bessere Weg - siehe einige Diskussionen zu späteren R-Fragen hier auf gis.SE. Guter Punkt zum Faktor Zwang; wird mit verschachtelten Updates aktualisiert as.character, um das Problem zu umgehen.
Simbamangu
Sie könnten ~ verwenden, aber man müsste path.expand auf das Verzeichnis nennen, zB readOGR (dsn = path.expand ( "~ / Downloads / cb_2016_us_zcta510_500k /"), Schicht = "cb_2016_us_zcta510_500k")
HD1
3
Irgendwie brauchte ich noch eine Klärung dieser eigentlich richtigen Antwort: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos
Ich möchte darauf hinweisen, dass das dsnArgument keine abschließenden Schrägstriche enthalten dsn = "C:/Users/Downloads/"sollte --- zB sollte sein dsn = "C:/Users/Downloads". Hoffe, dies löst jemandes Frustration ...
Kim
21

Ich stimme dem Simbamangu zu und bin gespannt, was die Beibehaltung des Shapefiles angeht, aber ich möchte Ihre Aufmerksamkeit speziell auf die rgdal-Bibliothek lenken. Folgen Sie dem von gissolved für das NCEAS vorgeschlagenen Link und folgen Sie den Anweisungen für rgdal. Die Installation auf einigen Computern kann schwierig sein, aber die Ergebnisse bei Projektionen können erheblich verbessert werden.

Die MapTools-Bibliothek ist exzellent und ermöglicht es Ihnen, die Projektion für das eingelesene Shapefile zu definieren. Dazu müssen Sie jedoch wissen, wie Sie diese Projektion im proj4-Format angeben. Ein Beispiel könnte ungefähr so ​​aussehen:

project2<-"+proj=eqdc +lat_0=0 +lon_0=0 +lat_1=33 +lat_2=45 +x_0=0 +y_0=0 +ellps=GRS80    
   +datum=NAD83 +units=m +no_defs" #USA Contiguous Equidistant Conic Projection
data.shape<-readShapePoly("./MyMap.shp",IDvar="FIPS",proj4string=CRS(project2))
plot(data.shape)

Wenn Sie diesen Weg gehen möchten, empfehle ich http://spatialreference.org als Ausgangspunkt, um herauszufinden, wie Ihre Projektion im proj4-Format aussieht. Wenn Ihnen das mühsam vorkommt, erleichtert Ihnen rgdal das Lesen der .prj-Datei des ESRI-Shapefiles (die Datei, die die ESRI-Projektionsdefinition für das Shapefile enthält). Um rgdal für dieselbe Datei zu verwenden, schreiben Sie einfach:

library(rgdal)
data.shape<-readOGR(dsn="C:/Directory_Containing_Shapefile",layer="MyMap")
plot(data.shape)

Wenn Sie nur mit einem einzigen Shapefile arbeiten, können Sie sich wahrscheinlich daran vorbeischleichen. Sobald Sie jedoch mehrere Datenquellen betrachten oder Google Maps überlagern, müssen Sie Ihre Projektionen stets in gutem Zustand halten.

Für einige hilfreiche exemplarische Vorgehensweisen zu räumlichen Daten in R, einschließlich einiger Dinge zum Importieren und Arbeiten mit Punktmustern, habe ich einige alte Kursmaterialien online unter https://csde.washington.edu/workshop/point-patterns-and-raster -surfaces / (weitere Workshops finden Sie hier ), anhand derer Sie sehen können, wie diese Methoden in der Praxis verglichen werden.

csfowler
quelle
+1 für Raumbezugsinformationen ... speziell zur Hervorhebung, dass Projektionen aussortiert bleiben!
Simbamangu
@csfowler, ich habe versucht, readOGR zu verwenden, aber es importiert nicht die .prj-Datei. Irgendeine Idee warum? Ich bin auch bei UW in der Abteilung für Biologie.
Herman Toothrot
@ user4050, schwer zu wissen, ohne Ihren Code zu sehen. Ich gehe davon aus, dass sich im selben Verzeichnis eine .prj-Datei befindet. und dass Sie den Wert encoding = "ESRI Shapefile" verwendet haben, um sicherzustellen, dass rgdal weiß, dass es sich um ein Shapefile handelt?
csfowler
17

Sie können die sfBibliothek verwenden, um Shapefiles direkt in zu öffnen R. Es ist schneller als die rgdalBibliothek. Schauen Sie hier nach: Einfache Funktionen für R-Benchmarks . Weitere Informationen zum sfPaket finden Sie auf der Projekthomepage r-spatial .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')
Guzmán
quelle
11

Eine einfache Lösung im Jahr 2017 ist die shapefile()Funktion in der rasterBibliothek.

#Load library
library(raster)

#Load shapefile
shp <- shapefile("myshapefile")

UPDATE: Dies ist auch 2019 eine gute Option.

Christopher
quelle
Kann dies zum Importieren aus einer Online-Quelle verwendet werden? I
I Del Toro
@IDelToro Nicht direkt. Sie müssen es zuerst auf Ihre Festplatte herunterladen und dann von dort laden.
Christopher
6

Eine weitere Alternative ist die Verwendung der FastShp- Bibliothek, die Folgendes bietet:

Routinen für den Umgang mit großen ESRI-Shapefiles (.shp). Dies umfasst das Lesen, Ausdünnen von Punkten und das Anpassen von Punkten an Formen. Das Hauptziel dieses Pakets ist es, die Geschwindigkeit bereitzustellen, mit der große Shapefiles (Millionen von Punkten) unterstützt werden. Es ist einige Größenordnungen schneller als einige andere Shapefile-Pakete.

Hier ist meine Frage zu SE zur Verwendung mit ggplot2:

Wie kann ich Shapefile plotten, das über FastShp in ggplot2 geladen wurde?

radek
quelle
1
Ich finde es etwas ärgerlich, dass die Funktion read.shp kein sp-Objekt ergibt. Angesichts der Tatsache, dass die räumliche R-Community dies als De-facto-Standard für den Umgang mit räumlichen Objekten betrachtet, finde ich dies etwas schlampig. Bei ausreichend RAM und einem 64-Bit-Betriebssystem ist das Lesen großer Datenmengen kein großes Problem. Mit 8 GB RAM habe ich 30 Millionen Punkte und 2,5 Millionen Polygone mit rgdal ohne Probleme gelesen. Hier einige Anweisungen zur Verwendung von sp-Objekten mit ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans