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

我花了几个月的时间在R中进行空间统计工作,但那是5年前了。为了我的生命,我不记得如何将sp对象(例如SpatialPolygonsDataFrame)从一个投影转换为另一个投影。

示例代码: br />现在我有一个带有适当投影信息的SpatialPolygonsDataFrame,但我想将其转换为所需的投影。我记得有一个名称不太直观的函数,但是我不记得它是什么。 “ reproject”,“ transform”等)。

编辑

不包括为该shapefile在墨西哥烦人放置的AK / HI:

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


评论

在这里使用proj4软件包进行投影的先前答案。尚未尝试使用SpatialPolygonsDataFrame进行此操作。

实际上看起来proj4不适用于Spatial对象-但请参见下面的答案。

总是有Spatial Task View:cran.r-project.org/web/views/Spatial.html和我关于Spatial Data的注释[无耻插件]:maths.lancs.ac.uk/~rowlings/Teaching/UseR2012 >

#1 楼

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


编辑:
或者按照@Spacedman的建议(使用CRS信息写入一个.prj文件):

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



如果不确定要使用哪个CRS项目,请参考以下文章:


为R中的shapefile读取选择proj4string的正确值?

如果要定义/分配一个






当数据不存在时,请参考:


在R中将不存在的CRS分配给shapefile?

评论


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

– Spacedman
2012年8月19日在8:59

好得多(进行了相应编辑)-谢谢;尚未意识到它会创建.prj文件!顺便说一下,您页面上的很棒的速查表。

–Simbamangu
2012年8月19日10:47



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

– hu
2012年8月19日在18:03

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

–Simbamangu
2012年8月19日在18:30

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

–阿里·弗里德曼(Ari B. Friedman)
2012年8月19日在21:35

#2 楼

由于引入了sf软件包(请在此处查看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")


sf将来将取代sp,并且由于其简单性和速度,恕我直言,与sp。相比有几个优点。