- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用sp R 中的包。我想知道何时使用 SpatialPoints 以及何时使用 SpatialPointsDataframe。我觉得没有太大区别?!
唯一的区别是在 SpatialPointsDataframe 中我可以存储更多属性吗?!如果是这样,我可以从现有的数据帧创建一个 SpatialPointDataframe (如果该数据帧中存在坐标),而不需要绕道创建空间点吗?
最佳答案
SpatialPoints 和 SpatialPointsDataFrame 对象都是 S4 对象。确实,主要的结构差异在于,后者有一个包含属性数据的额外槽。然而,实际差异更为显着。仅举几个示例(使用 sp
包中的内置 meuse
数据库,其中包含来自默兹河漫滩的地理编码污染物数据)。
library(sp)
data(meuse)
class(meuse) # a data.frame
# [1] "data.frame"
head(meuse[,1:5]) # first 5 columns
# x y cadmium copper lead
# 1 181072 333611 11.7 85 299
# 2 181025 333558 8.6 81 277
# 3 181165 333537 6.5 68 199
# 4 181298 333484 2.6 81 116
# 5 181307 333330 2.8 48 117
# 6 181390 333260 3.0 61 137
coordinates(meuse) <- 1:2 # convert to spDF object; use first 2 columns for lon/lat
class(meuse) # now a SpatialPointsDataFrame
# [1] "SpatialPointsDataFrame"
# attr(,"package")
# [1] "sp"
尽管meuse
是一个SpatialPointsDataFrame,我们仍然可以对它进行索引,就好像它是一个简单的data.frame一样。请注意我们如何引用属性表的 lead
列,就好像 meuse
是一个 df,并注意索引如何像在 df 中那样工作。
meuse[meuse$lead>500,1:5] # high lead
# coordinates cadmium copper lead zinc elev
# 55 (179973, 332255) 12.0 117 654 1839 7.90
# 60 (180100, 332213) 10.9 90 541 1571 6.68
meuse[meuse$lead<40,1:5] # low lead
# coordinates cadmium copper lead zinc elev
# 112 (180328, 331158) 0.4 20 39 113 9.717
# 161 (180201, 331160) 0.8 18 37 126 9.036
我们还可以使用 SpatialPointsDataFrames 的绘图方法来绘制数据。
par(mfrow=c(1,2), mar=c(2,2,2,2)) # 1 X 2 grid of plots; remove margins
plot(meuse, pch=20, main="Full Dataset", axes=TRUE)
plot(meuse,
bg=rev(heat.colors(5))[cut(meuse$lead,breaks=c(0,100,200,300,400,Inf),labels=FALSE)],
col="grey",main="Lead Distribution", pch=21, axes=TRUE)
我们可以将坐标转换为更有用的东西(经度/纬度)。
library(rgdal)
proj4string(meuse) <- CRS("+init=epsg:28992") # set original projection
meuse <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84")) # transform to lon/lat
plot(meuse, pch=20, main="Full Dataset", axes=TRUE)
plot(meuse,
bg=rev(heat.colors(5))[cut(meuse$lead,breaks=c(0,100,200,300,400,Inf),labels=FALSE)],
col="grey",main="Lead Distribution", pch=21, axes=TRUE)
最后是一个反例,将点叠加到 Google map 上:
library(ggmap) # loads ggplot2 as well
map <- get_map(location=rowMeans(bbox(meuse)), zoom=13) # get Google map
ggmap(map) +
geom_point(data=as.data.frame(meuse), aes(x,y,fill=lead),
color="grey70", size=3.5, shape=21)+
scale_fill_gradientn(colours=rev(heat.colors(5)))
本质上,我们在这里所做的是将 meuse
从 data.frame 转换为 SpatialPointsDataFrame,以便我们可以使用 spTransform(...)
坐标,然后将结果转换回 data.frame,以便我们可以使用 ggplot 将它们覆盖到 Google map 上。
关于r - SpatialPoints 和 SpatialPointsDataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32229496/
这个问题似乎已经以不同的形式被问过几次,但我找不到正确的解决方案。我有一个带有多个多边形的 SpatialPoint 对象,并且想使用槽“ID”对一个多边形进行子集化和绘制。 使用 this 中的示例
使用sp R 中的包。我想知道何时使用 SpatialPoints 以及何时使用 SpatialPointsDataframe。我觉得没有太大区别?! 唯一的区别是在 SpatialPointsDat
我是一名优秀的程序员,十分优秀!