การฉายวัตถุ sp ใน R


35

ฉันมีรูปร่างหลายแบบใน CRS ที่แตกต่างกัน (ส่วนใหญ่เป็น WGS84 lat / lon) ที่ฉันต้องการแปลงเป็นรูปแบบทั่วไป (น่าจะเป็น Albers Equal Area Conic แต่ฉันอาจขอความช่วยเหลือในการเลือกคำถามอื่นเมื่อปัญหาของฉันดีขึ้น -defined)

ฉันใช้เวลาสองสามเดือนในการทำสถิติเชิงพื้นที่ใน R แต่เมื่อ 5 ปีที่แล้ว สำหรับชีวิตของฉันฉันจำไม่ได้ว่าจะเปลี่ยนspวัตถุอย่างไร (เช่นSpatialPolygonsDataFrame) จากการฉายภาพหนึ่งไปอีกภาพหนึ่ง

รหัสตัวอย่าง:

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

ตอนนี้ฉันมีSpatialPolygonsDataFrameข้อมูลเส้นโครงที่เหมาะสม แต่ฉันต้องการแปลงให้เป็นเส้นโครงที่ต้องการ ฉันจำได้ว่ามันมีฟังก์ชั่นที่มีชื่อค่อนข้างไม่เหมาะสมสำหรับเรื่องนี้ แต่ฉันจำไม่ได้ว่ามันคืออะไร

โปรดทราบว่าฉันไม่ต้องการเพียงแค่เปลี่ยน CRS แต่เพื่อเปลี่ยนพิกัดให้ตรงกัน ("reproject", "transform" ฯลฯ )

แก้ไข

ไม่รวม AK / HI ที่วางไว้อย่างน่ารำคาญในเม็กซิโกสำหรับไฟล์รูปร่างนี้:

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

คำตอบก่อนหน้านี้ในการฉายที่ใช้แพคเกจ proj4 ที่นี่ ยังไม่ได้ลองกับ SpatialPolygonsDataFrame
Simbamangu

ดูเหมือนว่า proj4 จะไม่ทำงานกับวัตถุอวกาศ แต่ดูคำตอบด้านล่าง
Simbamangu

2
มีมุมมองงาน Spatial อยู่เสมอ: cran.r-project.org/web/views/Spatial.htmlและบันทึกของฉันเกี่ยวกับ Spatial Data [shameless plug]: maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

คำตอบ:


44

คุณสามารถใช้spTransform()วิธีการใน rgdal - โดยใช้ตัวอย่างของคุณคุณสามารถเปลี่ยนวัตถุเป็น NAD83 สำหรับ Kansas (26978):

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)

ที่คาดการณ์ไว้

วิธีบันทึกในโปรเจคใหม่:

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

แก้ไข : หรือตามคำแนะนำของ @ Spacedman (ซึ่งเขียนไฟล์. prj ด้วยข้อมูล CRS):

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

ถ้าไม่มีใครแน่ใจว่า CRS ต้องทำโครงการอะไรให้อ้างอิงโพสต์ต่อไปนี้:

และถ้าใครต้องการนิยาม / กำหนด CRS เมื่อข้อมูลไม่มีให้อ้างอิง:


10
ทราบว่า writePolyShape ไม่ได้เขียนไฟล์. prj! คุณควรใช้ writeOGR จาก rgdal (และใช้ readOGR เพื่ออ่าน shapefiles) หากคุณต้องการเขียนและอ่านไฟล์. prj เพื่อตั้งค่า CRS ของวัตถุเชิงพื้นที่ของคุณใน R!
Spacedman

ดีกว่ามาก (แก้ไขตาม) - ขอบคุณ; ไม่ได้ตระหนักว่ามันสร้างไฟล์. prj! สุดยอดสูตรชีทบนหน้าเว็บของคุณ
Simbamangu

1
มันแปลกที่การคาดการณ์ในเม็กซิโกส่งผลต่อการปรากฏตัวของอะลาสก้าและฮาวาย :-)
whuber

@whuber - อืมใช่ ... มีคนแก้ไขการโพสต์ของฉันซึ่งไม่มีแผนที่จริงแสดงการแทรกที่ไม่เหมาะสม ... อย่าพล็อตตัวเองเพื่อดูว่าพวกเขาอยู่ที่นั่น
Simbamangu

@Simbamangu ขออภัยลืมว่าไฟล์. shp นี้จะรวม insets ที่ไม่เหมาะสมเมื่อฉันพยายามที่จะเป็นประโยชน์ในการเพิ่มกราฟ!
Ari B. Friedman

7

นับตั้งแต่เปิดตัว sf-package (ดู vignettes sf1 , sf2 , sf3 , sf4และคำแนะนำในการย้ายข้อมูลที่นี่ ) คุณสามารถใช้st_transform()เพื่อคัดลอกข้อมูลเวกเตอร์ของคุณอีกครั้ง:

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")

เอสเอฟจะเข้ามาแทนที่ sp ในอนาคตและเนื่องจากความเรียบง่ายและความเร็วนั้นมีข้อดีหลายประการเมื่อเทียบกับ sp

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.