Otwierasz plik kształtu w R? [Zamknięte]

64

Muszę otworzyć plik kształtu z ArcMap w R, aby użyć go do dalszej analizy geostatystycznej. Przekształciłem go w plik tekstowy ASCII, ale w R jest rozpoznawany jako data.frame. Funkcja współrzędnych nie działa, gdy xiy są rozpoznawane jako nienumeryczne.

Czy możesz pomóc sobie z tym poradzić?

slava
źródło
1
Jaki rodzaj pliku kształtu? Zakładam punkty, ponieważ ma kolumnę X i Y?
Simbamangu,

Odpowiedzi:

54

Użyj bezpośrednio pliku shapefile. Możesz to łatwo zrobić za pomocą pakietów rgdallub sfi odczytać kształt w obiekcie. Dla obu pakietów musisz podać dsn- źródło danych, którym w przypadku pliku shapefile jest katalog , i layer- które jest nazwą pliku shapefile, bez rozszerzenia:

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

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

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

(W przypadku rgdal, w systemie OSX lub Linux nie można używać skrótu „~” dla katalogu domowego jako katalogu źródła danych ( dsn) - w przeciwnym razie pojawi się nieprzydatny komunikat „Nie można otworzyć źródła danych”. sfPakiet nie mają to ograniczenie i inne zalety.)

To da ci obiekt, który jest przestrzenną * ramką danych (punkty, linie lub wielokąty) - pola tabeli atrybutów są wtedy dostępne dla ciebie w taki sam sposób jak zwykła ramka danych, tj. shape$IDDla kolumny ID.

Jeśli chcesz użyć zaimportowanego pliku ASCII, powinieneś po prostu przekonwertować pola tekstowe (znakowe) xiy na liczby, np .:

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

Edytuj 18.01.2015 : zauważ, że rgdal jest nieco lepszy niż maptools (które początkowo zasugerowałem tutaj), przede wszystkim dlatego, że automatycznie czyta i zapisuje informacje o projekcji.

Uwagi:

  • as.numeric(as.character())funkcje zagnieżdżone - jeśli tekst ASCII został odczytany jako czynnik (prawdopodobnie), zapewnia to otrzymanie wartości liczbowych zamiast poziomów czynników.
  • rgdali sfmieć mylące sposoby dostępu do różnych typów plików i baz danych (np. w przypadku pliku GPX, dsn jest nazwą pliku i nakłada warstwy na poszczególne komponenty, takie jak punkty trasy, punkty ścieżki itp.), i konieczna jest uważna lektura przykładów online.
Simbamangu
źródło
R powinien parsować pola numeryczne, więc wyobrażam sobie, że w xiy występuje specjalny znak. Ponadto podczas importu, o ile nie określono inaczej, pola znaków zostaną przekształcone w czynnik. W związku z tym proste opóźnienie „as.numeric” nie będzie działać. Używałbym również „readORG” w „rgdal” zamiast maptools.
Jeffrey Evans
@Jeffrey, readOGR to zdecydowanie lepsza droga - zobacz dyskusje na temat późniejszych pytań R tutaj na gis.SE. Dobra uwaga na przymus czynnikowy; zaktualizuje zagnieżdżone, as.characteraby obejść problem.
Simbamangu,
Możesz użyć ~, ale będziesz musiał wywołać path.expand w katalogu, np. ReadOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1
3
Jakoś wciąż potrzebowałem wyjaśnienia tej właściwie poprawnej odpowiedzi: dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos,
Chcę zauważyć, że dsnargument nie powinien zawierać końcowych ukośników --- np. dsn = "C:/Users/Downloads/"Powinien być dsn = "C:/Users/Downloads". Mam nadzieję, że rozwiąże to czyjąś frustrację ...
Kim
21

Zgadzam się z Simbamangu i rozwiązałem problem zachowania pliku kształtu, ale chcę skierować twoją uwagę na bibliotekę rgdal. Skorzystaj z linku sugerowanego przez gissolved dla NCEAS i postępuj zgodnie ze wskazówkami dla rgdal. Instalacja na niektórych komputerach może być trudna, ale może znacznie poprawić wyniki, jeśli chodzi o projekcje.

Biblioteka maptools jest doskonała i pozwala zdefiniować projekcję dla pliku kształtu, który czytasz, ale aby to zrobić, musisz wiedzieć, jak określić tę projekcję w formacie proj4. przykład może wyglądać mniej więcej tak:

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)

Jeśli chcesz wybrać tę trasę, polecam http://spatialreference.org jako miejsce, w którym możesz dowiedzieć się, jak wygląda twoja projekcja w formacie proj4. Jeśli wygląda to na kłopot, rgdal ułatwi to, czytając plik .prj pliku shapefile ESRI (plik zawierający definicję rzutowania ESRI dla pliku shapefile. Aby użyć rgdal na tym samym pliku, po prostu napiszesz:

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

Prawdopodobnie możesz jeździć na deskorolce, nie robiąc tego, jeśli pracujesz tylko z jednym plikiem kształtu, ale gdy tylko zaczniesz szukać wielu źródeł danych lub nakładki z Mapami Google, utrzymanie dobrej projekcji staje się niezbędne.

Aby uzyskać przydatne wskazówki dotyczące danych przestrzennych w języku R, w tym wiele rzeczy na temat importowania i pracy z wzorcami punktów, mam kilka starych materiałów szkoleniowych online na stronie https://csde.washington.edu/workshop/point-patterns-and-raster -surfaces / (więcej warsztatów można znaleźć tutaj ), które mogą pomóc Ci zobaczyć, jak te metody się sprawdzają w praktyce.

csfowler
źródło
+1 za przestrzenne informacje referencyjne ... szczególnie za podkreślenie uporządkowania projekcji!
Simbamangu
@csfowler, próbowałem użyć readOGR, ale nie importuję pliku .prj. Masz pomysł, dlaczego? Jestem też na UW, na wydziale biologii.
Herman Toothrot
@ user4050, trudny do zrozumienia bez zobaczenia twojego kodu. Zakładam, że plik .prj znajduje się w tym samym katalogu? i że użyłeś wartości kodowania = "ESRI Shapefile", aby upewnić się, że rgdal wie, że jest to plik kształtu?
csfowler
17

Możesz użyć sfbiblioteki, aby bezpośrednio otworzyć pliki ShapefilesR . To szybciej niż rgdalbiblioteki, sprawdź tutaj: Proste funkcje dla R - Benchmarki . Aby uzyskać więcej informacji o sfpakiecie, sprawdź stronę główną projektu r-spatial .

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')
Guzmán
źródło
11

Łatwym rozwiązaniem w 2017 roku jest shapefile()funkcja w rasterbibliotece.

#Load library
library(raster)

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

AKTUALIZACJA: To nadal dobra opcja w 2019 roku.

Krzysztof
źródło
Czy można tego użyć do importowania ze źródła online? I
I Del Toro
@IDelToro Nie bezpośrednio. Najpierw musisz pobrać go na dysk twardy, a następnie załadować stamtąd.
Christopher
6

Jeszcze jedną alternatywą jest użycie biblioteki fastshp, która oferuje:

Procedury obsługi dużych plików kształtów ESRI (.shp). Obejmuje to czytanie, przerzedzanie punktów i dopasowanie punktów do zawierających kształty. Głównym celem tego pakietu jest zapewnienie szybkości obsługi dużych plików kształtowych (miliony punktów). To kilka rzędów maginutów szybciej niż niektóre inne pakiety plików shapefile.

Oto moje pytanie na temat SE, jak go używać z ggplot2:

Jak wykreślić plik shapefile załadowany przez fastshp w ggplot2?

radek
źródło
1
Trochę denerwuje mnie to, że funkcja read.shp nie daje obiektu sp. Biorąc pod uwagę, że społeczność przestrzenna R zbiega się w tej kwestii jako de facto standard obsługi obiektów przestrzennych, uważam to za nieco niechlujne. Biorąc pod uwagę wystarczającą ilość pamięci RAM i 64-bitowy system operacyjny, czytanie dużych danych nie stanowi większego problemu. Z 8 GB pamięci RAM odczytałem 30 milionów punktów i 2,5 milionów wielokątów używając rgdal bez żadnych problemów. Oto kilka wskazówek dotyczących używania obiektów sp z ggplot2: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans,