R'de shapefile açılıyor? [kapalı]


64

Daha ileri geostatistik analizlerde kullanmak için ArcMap'ten R'de bir form dosyası açmam gerekiyor. ASCII metin dosyasına dönüştürdüm, ancak R'de data.frame olarak tanınıyor. Koordinatlar işlevi, x ve y'nin sayısal olmayan olarak algılanması durumunda çalışmaz.

Başa çıkmak için yardım edebilir misin?


1
Ne tür bir şekil dosyası? X ve Y sütununa sahip olduğu için puan kabul ediyorum?
Simbamangu

Yanıtlar:


54

Doğrudan shapefile kullanın. Bunu rgdalveya sfpaketleriyle kolayca yapabilirsiniz ve bir nesnedeki şekli okuyabilirsiniz. Sağlamanız gereken her iki paket için de dsn- bir shapefile olması durumunda dizin olan veri kaynağı ve layer- shapefile adı olan eksi uzantısı:

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

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

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

(Rgdal için OSX veya Linux veri kaynağı (gibi ev dizini için '~' steno kullanamaz dsn. Aksi takdirde mesaj "açık veri kaynağı olamaz" yararsızdır alırsınız -) dizini sfpaket yok Diğer bazı avantajların yanı sıra bu sınırlamaya sahip olmalısınız.

Bu size Mekansal * DataFrame (noktalar, çizgiler veya çokgenler) olan bir nesne verecektir - özellik tablosunun alanlarına sıradan bir veri çerçevesiyle aynı şekilde erişilebilir, yani shape$IDkimlik sütunu için.

Aldığınız ASCII dosyasını kullanmak istiyorsanız, o zaman x (y) ve x alanlarını sayılara dönüştürmelisiniz, örneğin:

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

Edit 2015-01-18: rgdal'ın, esasen projeksiyon bilgisini otomatik olarak okuyup yazdığı için (başlangıçta burada önerdiğim) maptools'tan biraz daha iyi olduğuna dikkat edin.

Notlar:

  • iç içe geçmiş as.numeric(as.character())işlevler - eğer ASCII metniniz bir faktör olarak okunmuşsa (muhtemelen), bu faktör seviyeleri yerine sayısal değerleri almanızı sağlar.
  • rgdalve sffarklı dosya ve veritabanı türlerine (örneğin bir GPX dosyası için, dsn dosya adıdır ve ara noktalar, yol noktaları, vb. gibi bireysel bileşenleri katmanlara ayırır) erişmek için kafa karıştırıcı yollara sahiptir ve çevrimiçi örneklerin dikkatlice okunması gerekir.

R, sayısal alanları ayrıştırmalı, böylece x ve y'de özel bir karakter tipi olduğunu hayal ediyorum. Ayrıca, ithalatta, farklı şekilde belirtilmediği sürece, karakter alanları bir faktöre zorlanacaktır. Bu nedenle, basit bir "as.nümerik" yavaşlama işe yaramayacaktır. Ayrıca maptools yerine "rgdal" içinde "readORG" yi kullanırdım.
Jeffrey Evans,

@Jeffrey, readOGR kesinlikle gitmenin daha iyi bir yoludur - burada daha sonra R soruları hakkında bazı tartışmalara bakabilirsiniz Faktör zorlaması üzerine iyi nokta; as.characterSorunu aşmak için iç içe geçmiş olarak güncellenir .
Simbamangu

~ Kullanabilirsiniz, ancak dizinde path.expand öğesini çağırmanız gerekir; örneğin, readOGR (dsn = path.expand ("~ / Downloads / cb_2016_us_zcta510_500k /"), layer = "cb_2016_us_zcta510_500k")
hd1

3
Her nasılsa hala bu doğru cevabı açıklamaya ihtiyacım vardı:dsn="directory where the shapefile, projection file, etc are located" layer="name of the file without .shp extention"
Ufos

Ben dikkat isteyen dsnargümanı bölü çizgisi içermemelidir --- mesela dsn = "C:/Users/Downloads/"olmalıdır dsn = "C:/Users/Downloads". Umarım bu birinin hayal kırıklığını çözer ...
Kim

21

Simbamangu ile aynı fikirdeyim ve şekil dosyasını tutmak konusunda anlamsız görünüyorum ama dikkatinizi özellikle rgdal kütüphanesine yönlendirmek istiyorum. NCEAS için gissolved tarafından önerilen bağlantıyı izleyin ve rgdal için talimatlara uyun. Bazı makinelere kurmak zor olabilir, ancak projeksiyonlar söz konusu olduğunda sonuçları büyük ölçüde iyileştirebilir.

Maptools kütüphanesi mükemmeldir ve okuduğunuz şekil dosyası için izdüşümü tanımlamanıza izin verir, ancak bunun için izdüşümü proj4 biçiminde nasıl belirteceğinizi bilmeniz gerekir. bir örnek şöyle bir şeye benzeyebilir:

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)

Bu rotaya gitmek istiyorsanız, http://spatialreference.org adresini projeksiyonun proj4 formatında nasıl göründüğünü bulmak için gidilecek yer olarak tavsiye ederim . Bu size bir güçlük gibi gözüküyorsa, rgdal, ESRI shapefile'nin .prj dosyasını (ESRI'nin shapefile için projeksiyon tanımını içeren dosya.) Okuyarak kolaylaşacaktır.

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

Yalnızca tek bir şekil dosyasıyla çalışıyorsanız, bunu yapmadan kayma yapabilirsiniz; ancak birden fazla veri kaynağına bakmaya başladığınızda veya Google Haritalar ile paylaşmaya başladığınızda, projeksiyonlarınızı iyi durumda tutmak önemlidir.

R modelindeki uzaysal verilerle ilgili bazı yararlı adımlar için, nokta desenleri alma ve alma ile ilgili bir sürü şey dahil, https://csde.washington.edu/workshop/point-patterns-and-raster adresinde çevrimiçi olarak bazı eski ders materyallerine sahibim. Bu yöntemlerin pratikte nasıl karşılaştırıldığını görmenize yardımcı olabilecek yüzeyler / ( burada daha fazla atölye çalışması bulunabilir ).


Mekansal referans bilgisi için +1 ... özellikle çıkıntıların düzenli tutulmasını vurgulamak için!
Simbamangu

@ csfowler, readOGR'yi kullanmaya çalıştım, ancak .prj dosyasını içe aktarmıyor. Neden bir fikrin var mı? Ben de biyoloji bölümünde UW'deyim.
Herman Toothrot

@ user4050, kodunuzu görmeden bilmek zor. Aynı dizinde bir .prj dosyası olduğunu varsayıyorum? ve rgdal'ın bir shapefile olduğunu bildiğinden emin olmak için encoding = "ESRI Shapefile" değerini kullandınız mı?
csfowler


17

Shapefiles'u doğrudan sfaçmak için kütüphaneyi kullanabilirsiniz . Kütüphaneden daha hızlı , buraya bakın: R - Benchmark'lar için Basit Özellikler . Hakkında daha fazla bilgi için paketin proje anasayfa kontrol r-uzaysal .Rrgdalsf

# Load library
library('sf')

# Load shapefile
shapename <- read_sf('~/path/to/file.shp')

11

2017'de kolay bir çözüm kütüphanedeki shapefile()işlevdir raster.

#Load library
library(raster)

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

GÜNCELLEME: Bu, 2019'da hala iyi bir seçenek.


Bu, çevrimiçi bir kaynaktan almak için kullanılabilir mi? I
I Del Toro

@ IDelToro Doğrudan değil. Önce onu sabit sürücünüze indirmeniz ve ardından oradan yüklemeniz gerekir.
Christopher,

6

Bir alternatif daha sunan fastshp kütüphanesini kullanmak :

Büyük ESRI şekil dosyalarının (.shp) işlenmesi için rutinler. Bu, okuma, puanları inceltme ve puanları içeren şekillerle eşleştirmeyi içerir. Bu paketin temel amacı, büyük şekil dosyalarını (milyonlarca nokta) destekleme hızını sağlamaktır. Diğer bazı şekil dosyası paketlerinden daha hızlı maginute siparişleridir.

İşte benim ggplot2 ile nasıl kullanılacağı hakkında SE üzerine sorum:

Fastshp aracılığıyla yüklenen shapefile ggplot2 içinde nasıl çizebilirim?


1
Read.shp işlevinin sp nesnesiyle sonuçlanmadığını biraz sinir bozucu buluyorum. Mekansal R topluluğunun, mekansal nesneleri ele almak için fiili standart olarak yaklaşmakta olduğu göz önüne alındığında, bunu biraz özensiz buluyorum. Yeterli RAM ve 64bit işletim sistemi verildiğinde, büyük verileri okumak çok da önemli değil. 8GB RAM ile, sorun olmadan rgdal kullanarak 30M noktaları ve 2.5M poligonları okudum. İşte ggplot2 ile sp nesnelerini kullanmaya ilişkin bazı yönler: github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles
Jeffrey Evans
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.