如何将.shp文件转换为R中的.csv?

iou*_*ich 1 maps r spatial shape

我想将两个.shp文件转换为一个允许我一起绘制地图的数据库.

另外,有没有办法将.shp文件转换为.csv文件?我想能够个性化和添加一些数据,这对我来说更容易.csv格式.如果要在地图上添加叠加产量数据和降水数据,我会想到什么.

以下是摩洛哥西撒哈拉的形状文件.

用于绘制两个文件的代码:

# This is code for mapping of CGE_Morocco results

# Loading administrative coordinates for Morocco maps
library(sp)
library(maptools)
library(mapdata)

# Loading shape files
Mor <- readShapeSpatial("F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/Country-CGE/MAR_adm1.shp")
Sah <- readShapeSpatial("F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/Country-CGE/ESH_adm1.shp")

# Ploting the maps (raw)
png("Morocco.png")
Morocco <- readShapePoly("F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/Country-CGE/MAR_adm1.shp")
plot(Morocco)
dev.off()

png("WesternSahara.png")
WesternSahara <- readShapePoly("F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/Country-CGE/ESH_adm1.shp")
plot(WesternSahara)
dev.off()
Run Code Online (Sandbox Code Playgroud)

摩洛哥 撒哈拉沙漠西部

在查看@AriBFriedman和@PaulHiemstra的建议并随后弄清楚如何合并.shp文件后,我设法使用以下代码和数据生成以下映射(对于.shp数据,参见上面的链接)

码:

# Merging Mor and Sah .shp files into one .shp file

MoroccoData <- rbind(Mor@data,Sah@data) # First, 'stack' the attribute list rows using rbind() 
MoroccoPolys <- c(Mor@polygons,Sah@polygons) # Next, combine the two polygon lists into a single list using c()

summary(MoroccoData)
summary(MoroccoPolys)

offset <- length(MoroccoPolys) # Next, generate a new polygon ID for the new SpatialPolygonDataFrame object

browser()
for (i in 1: offset)
{
sNew =  as.character(i)
MoroccoPolys[[i]]@ID = sNew
}

ID <- c(as.character(1:length(MoroccoPolys))) # Create an identical ID field and append it to the merged Data component
MoroccoDataWithID <- cbind(ID,MoroccoData)

MoroccoPolysSP <- SpatialPolygons(MoroccoPolys,proj4string=CRS(proj4string(Sah))) #  Promote the merged list to a SpatialPolygons data object

Morocco <- SpatialPolygonsDataFrame(MoroccoPolysSP,data = MoroccoDataWithID,match.ID = FALSE) #  Combine the merged Data and Polygon components into a new SpatialPolygonsDataFrame.

Morocco@data$id <- rownames(Morocco@data)
Morocco.fort <- fortify(Morocco, region='id') 
Morocco.fort <- Morocco.fort[order(Morocco.fort$order), ] 

MoroccoMap <- ggplot(data=Morocco.fort, aes(long, lat, group=group)) + 
geom_polygon(colour='black',fill='white') + 
theme_bw()
Run Code Online (Sandbox Code Playgroud)

结果:

MoroccoMAp

新问题:

1-如何消除将地图切成两半的边界数据?

2-如何在.shp文件中组合不同的区域?

谢谢大家.

PS:stackoverflow.com中的社区非常精彩且非常有帮助,特别是对于初学者来说:)只是想到强调它.

Pau*_*tra 8

将shapefile加载到Spatial {Lines/Polygons} DataFrames(sp-package中的类)后,可以使用fortify泛型函数将它们转换为flat data.frame格式.fortify通用的特定功能包含在ggplot2包中,因此您需要先加载它.一个代码示例:

library(ggplot2)
polygon_dataframe = fortify(polygon_spdf)
Run Code Online (Sandbox Code Playgroud)

这里polygon_spdf是一个SpatialPolygonsDataFrame.类似的方法适用于SpatialLinesDataFrame.

我的解决方案与@AriBFriedman的解决方案之间的区别在于,除了与这些polgons /行相关联的数据之外,我还包括多边形/线的坐标xy坐标.我真的很喜欢使用ggplot2包来可视化我的空间数据.

一旦你的数据正常,data.frame你就可以简单地用来write.csv在磁盘上生成一个csv文件.


Ari*_*man 5

我想你的意思是你想要每个相关的data.frame?

如果是这样,可以使用@插槽访问功能访问它.该槽名为data:

write.csv( WesternSahara@data, file="/home/wherever/myWesternSahara.csv")
Run Code Online (Sandbox Code Playgroud)

然后,当您再次阅读时read.csv,您可以尝试分配:

myEdits <- read.csv("/home/wherever/myWesternSahara_modified.csv")
WesternSahara@data <- myEdits
Run Code Online (Sandbox Code Playgroud)

您可能需要对行名称进行一些按摩等,以使其接受新的data.frame为有效.我可能会尝试将现有的data.frame与您在R中读入的csv合并,而不是破坏性地编辑....

  • @PaulHiemstra +1给你好好使用`fortify`.总是有一些水晶球凝视着这样的问题,但是我对OP的意图的解读只是添加和清理一些相关的值.为此,出口越少越好 - 我仍然担心将所有内容导出到Excel,编辑,然后回读,使用任一解决方案都不可重复...... (2认同)
  • 我真的建议OP学习如何在R中进行编辑. (2认同)