在R中投影sp对象


35

我想将不同的CRS(主要是WGS84纬度/经度)中的许多shapefile转换为通用投影(可能是Albers Equal Area Conic),但是一旦我的问题变好,我可能会寻求其他问题的帮助-定义)。

我花了几个月的时间在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,还希望更改坐标以匹配(“重新投影”,“变换”等)。

编辑

不包括在此shapefile中令人讨厌地放置在墨西哥的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不适用于Spatial对象-但请参见下面的答案。
Simbamangu

2
总是有空间任务视图:cran.r-project.org/web/views/Spatial.html和我关于空间数据的注释[无耻插件]:maths.lancs.ac.uk/~rowlings/Teaching/UseR2012
Spacedman

Answers:


44

您可以使用spTransform()rgdal中的方法-以您的示例为例,可以将对象转换为堪萨斯州的NAD83(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)

未投射

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

投射的

要将其保存在新的投影中:

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

编辑:或,按照@Spacedman的建议(它将与CRS信息一起写入.prj文件):

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

如果不确定要从哪个CRS进行投影,请参阅以下文章:

如果要在没有数据的情况下定义/分配CRS,请参考:


10
请注意,writePolyShape不会写入.prj文件!如果要写入和读取.prj文件以在R中设置空间对象的CRS,则应使用rgdal中的writeOGR(并使用readOGR读取shapefile)!
Spacedman

更好(进行了相应编辑)-谢谢;尚未意识到它会创建.prj文件!顺便说一句,您页面上的真棒备忘单。
Simbamangu 2012年

1
奇怪的是,墨西哥的投影如何影响阿拉斯加和夏威夷插图的出现:-)。
ub

@whuber-嗯,是的。。。有人编辑了我的贴子,里面没有实际地图,显示的是那些不合适的插图。
Simbamangu

@Simbamangu对不起,当我尝试帮助添加图形时,忘记了此.shp文件相当不合适地包含了插图!
阿里·弗里德曼

7

由于引入了SF-包(看看的护身符SF1SF2SF3SF4和迁移指南这里)你可以使用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")

sf将来会取代sp,并且由于其简单性和速度,im相比sp具有若干优点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.