首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Z-R中多边形(shapefile)的值

Z-R中多边形(shapefile)的值
EN

Stack Overflow用户
提问于 2014-01-11 17:28:34
回答 1查看 4K关注 0票数 4

我的目标是在R中创建一个三维可视化,我在柏林有一个城市区(Ortsteile)的形状文件,并希望将这个值(居民/平方公里)突出为z值。我已将shapefile实现为R,并将去色值("Einwohnerd")着色如下:

代码语言:javascript
复制
library(rgdal)
library(sp)

berlin=readOGR(dsn="C...etc.", layer="Ortsteile")

berlin@data

col <- rainbow(length(levels(berlin@data$Name)))
spplot(berlin, "Einwohnerd", col.regions=col, main="Ortsteil Berlins", sub="Datensatz der Stadt Berlin", lwd=.8, col="black")

如何将某一多边形(城市地区)引用为z值(居民/平方公里),我如何突出这个z值?

希望有人会有答案!最好的王者

谢谢你的回答,但我仍然希望找到最好的使用密度作为z值,以便我可以创建一个三维模型。我发现它不可能使用多边形的形状,但它是有可能的栅格多边形,并使用一个矩阵为一个不同的视角和旋转。

这是代码,但最终的三维可视化看起来不够清晰和好。也许用另一种方式计算z值会更好,这样第一个值就不会开始那么高,或者使用多边形的中心,而不是在z方向画一列:

代码语言:javascript
复制
library(rgdal)
library(sp)

setwd("C:\\...")
berlin=readOGR(dsn="C:\\...\\Ortsteile", layer="Ortsteile") 

col <- rainbow(length(levels(berlin@data$Name)))  
spplot(berlin, "Einwohnerd", col.regions=col, main="Ortsteil Berlins",                 
sub="Datensatz    der Stadt Berlin", lwd=.8, col="black")

library(raster)

raster <- raster(nrows=100, ncols=200, extent(berlin)) 

test <- rasterize(berlin, raster, field="Einwohnerd")

persp(test, theta = 40, phi = 40, col = "gold", border = NA, shade = 0.5)  

for(i in seq(0,90,10)){     
persp(test, theta = 40, phi = i, col = "gold", border = NA, shade = 0.5)
}

library(rgl)         
library(colorRamps)
mat <- matrix(test[], nrow=test@nrows, byrow=TRUE)
image(mat)
persp3d(z = mat, clab = "m")
persp3d(z = mat, col = rainbow(10),border = "black")
persp3d(z = mat, facets = FALSE, curtain = TRUE)
EN

回答 1

Stack Overflow用户

发布于 2014-01-14 16:56:36

你就是这么想的吗?

代码语言:javascript
复制
library(ggplot2)
library(rgdal)           # for readOGR(...) and spTransform(...)
library(RColorBrewer)    # for brewer.pal(...)

setwd("<directory with shapefile>")
map <- readOGR(dsn=".",layer="Ortsteile")
map <- spTransform(map,CRS=CRS("+init=epsg:4839"))
map.data <- data.frame(id=rownames(map@data), map@data)
map.df   <- fortify(map)
map.df   <- merge(map.df,map.data,by="id")
ggplot(map.df, aes(x=long, y=lat, group=group))+
  geom_polygon(aes(fill=Einwohnerd))+
  geom_path(colour="grey")+
  scale_fill_gradientn(colours=rev(brewer.pal(10,"Spectral")))+
  theme(axis.text=element_blank())+
  labs(title="Berlin Ortsteile", x="", y="")+
  coord_fixed()

解释

这是一个很好的问题,因为它提供了一个使用R.

Shapefile可以使用readOGR(...)读取到R中,从而生成SpatialDataFrame对象。后者基本上有两个部分:包含多边形边界坐标的polygons节和包含shapefile中属性表中的信息的data节。这些可以分别作为map@polygonsmap@data引用。

上面的代码读取shapefile并将坐标转换为epsg:4839。然后,我们将多边形in (存储在行名中)与map@data中的其他信息放在一起,创建map.data。然后利用fortify(...)函数在ggplot中将多边形转换为适合于绘图的数据图(map.df)。这个dataframe有一个列id,它对应于map.data中的id列。然后根据map.data列将属性信息( map.df )合并到map.df中。

ggplot调用创建映射层并呈现映射,如下所示:

代码语言:javascript
复制
ggplot:       set the default dataset to map.df; identify x- and y-axis columns
geom_polygon: identify column for fill (color of polygon)
geom_path:    polygon boundaries
theme:        turn off axis text
labs:         title, turn off x- and y-axis labels
coord_fixed:  ensures that the map is not distorted

关于scale_fill_gradientn(...)的注意事项:该函数通过插值colours=参数中提供的调色板将颜色分配给填充值。这里我们使用来自www.colorbrewer.org的光谱调色板。这个调色板的颜色很受尊敬(蓝-红),所以我们使用rev(.)若要反转颜色顺序(high=red,low=blue),请执行以下操作。如果您更喜欢matlab中常见的高饱和颜色,请使用library(colorRamps)并将对scale_fill_gradientn(...)的调用替换为:

代码语言:javascript
复制
  scale_fill_gradientn(colours=matlab.like(10))+
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21065480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档