R içindeki sp nesnelerini yansıtma


35

Farklı CRS'lerde (çoğunlukla WGS84 lat / lon) ortak bir projeksiyona dönüştürmek istediğim (muhtemelen Albers Equal Area Conic) bir takım şekil dosyalarım var, ancak sorunum düzeldiğinde başka bir soru seçmek için yardım isteyebilirim -defined).

Birkaç aydır R'de uzamsal istatistiklerle uğraşmıştım, ama 5 yıl önceydi. Hayatım boyunca, bir spnesneyi (örneğin SpatialPolygonsDataFrame) bir projeksiyondan diğerine nasıl dönüştüreceğimi hatırlamıyorum .

Örnek kod:

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry"), verbose=TRUE, proj4string=P4S.latlon) 
# Shapefile available at 
#   http://www.dartmouthatlas.org/downloads/geography/hrr_bdry.zip 
#   but you must rename all the filenames to have the same 
#   capitalization for it to work in R

Şimdi SpatialPolygonsDataFrameuygun projeksiyon bilgisine sahibim, ancak onu istenen projeksiyona dönüştürmek istiyorum. Bunun için biraz garip bir şekilde adlandırılmış bir işlev olduğunu hatırlıyorum, ancak ne olduğunu hatırlayamıyorum.

Sadece CRS'yi değiştirmek istemediğimi, eşleşecek koordinatları ("reproject", "transform" vb.) Değiştirmek istediğimi unutmayın.

Düzenle

Bu şekil dosyası için rahatsız edici bir şekilde Meksika’ya yerleştirilen AK / HI hariç:

library(taRifx.geo)
hrr.shp <- 
  subset(hrr.shp, !(grepl( "AK-" , hrr.shp@data$HRRCITY ) |
                                     grepl( "HI-" , hrr.shp@data$HRRCITY )) )
proj4string(hrr.shp) <- P4S.latlon

Burada proj4 paketini kullanarak projelendirme ile ilgili önceki cevap . Bu SpatialPolygonsDataFrame ile henüz denemedim.
Simbamangu

Aslında proj4 Uzamsal nesnelerle çalışmıyor gibi görünüyor - ancak aşağıdaki cevaba bakınız.
Simbamangu

2
Daima Mekansal Görev Görünümü var: cran.r-project.org/web/views/Spatial.html ve Mekansal Verilerle ilgili notlarım [utanmaz fiş]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Yanıtlar:


44

spTransform()Yöntemleri rgdal'da kullanabilirsiniz - örneğinizi kullanarak, nesneyi Kansas için NAD83'e (26978) dönüştürebilirsiniz:

library(rgdal)
library(maptools)

P4S.latlon <- CRS("+proj=longlat +datum=WGS84")
hrr.shp <- readShapePoly("HRR_Bdry", verbose=TRUE, proj4string=P4S.latlon)
plot(hrr.shp)

unprojected

hrr.shp.2 <- spTransform(hrr.shp, CRS("+init=epsg:26978"))
plot(hrr.shp.2)

projekte

Yeni projeksiyonda kaydetmek için:

writePolyShape(hrr.shp.2, "HRR_Bdry_NAD83")

EDIT : Veya @ Spacedman'ın önerisine göre (ki bu CRS bilgisine sahip bir .prj dosyası yazar):

writeOGR(hrr.shp.2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver="ESRI Shapefile")

Hangi CRS'den yansıtılacağından emin değilseniz, aşağıdaki postaya bakın:

Biri, verileri olmadığında CRS'yi tanımlamak / atamak istiyorsa, bakınız:


10
writePolyShape, .prj dosyasını YAZMAYI unutmayın! Eğer uzaysal nesnelerinizin CRS'sini R'de yazmak için .prj dosyasını yazıp okumak istiyorsanız, rgdal'dan writeOGR kullanmalısınız (ve shapefilleri okumak için readOGR kullanmalısınız)!
Spacedman

Çok daha iyi (buna göre düzenlenmiş) - teşekkürler; .prj dosyasını yarattığını fark etmemişti! Bu arada, sayfanızdaki müthiş kopya kağıdı.
Simbamangu

1
Meksika’daki projeksiyonun Alaska ve Hawaii’nin içindekilerin görünüşünü nasıl etkilemesi çok garip.
whuber

@whuber - hmm, evet ... birisi, içinde uygunsuz haritaları gösteren asıl haritaları olmayan yazımı düzenledi ... orada olduklarını görmek için asla kendimi çizmedim.
Simbamangu

@Simbamangu Maalesef, bu .shp dosyasının grafikleri eklemek konusunda yardımcı olmaya çalışırken içindekileri uygun olmayan bir şekilde içerdiğini unutmuşum!
Ari B. Friedman,

7

Sf paketinin tanıtılmasından bu yana ( sf1 , sf2 , sf3 , sf4 vinyetlerine ve buradaki geçiş kılavuzuna bakınız ) st_transform()vektör verilerinizi yeniden düzenlemek için kullanabilirsiniz :

require(sf)

hrr_sf = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 4326) # has +proj=longlat +datum=WGS84
plot(hrr_sf)

hrr_sf2 = st_transform(hrr_sf, "+init=epsg:26978") # 1st option sp::CRS() not working/ needed
hrr_sf2 = st_transform(hrr_sf, 26978) # 2nd option - EPSG code as an integer
plot(hrr_sf2)

# don't think about doing this:
hrr_sf3 = st_read('HRR_Bdry.shp', stringsAsFactors = FALSE,
    crs = 26978)

# Output layer
st_write(hrr_sf2, dsn = getwd(), layer = "HRR_Bdry_NAD83", driver = "ESRI Shapefile")

sf gelecekte sp'in yerini alacaktır ve sadeliği ve hızı nedeniyle sp'e kıyasla birkaç avantajı vardır.

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.