r - OSM、rgeos、osmar、面积计算,不相加

标签 r polygon geospatial openstreetmap r-sp

我正在尝试使用 osmar 下载数据,从 OSM 获取多边形的大小。然而,健全性检查告诉我这些是不正确的。

下面是我的意思的一个例子。

(1) 伦敦海德公园周围的地理区域。提取标记为“park”的所有方式和关系。

devtools::install_github('osmdatar/osmdata')
library(osmdata)
library(osmar)
library(sp)
library(sf)
library(rgeos)

osmO <- get_osm(center_bbox(-0.167919, 51.5072682, 2000, 2000))

ids_relations <- osmO$relations$tags[osmO$relations$tags$v=="park","id"]
ids_ways <- osmO$ways$tags[osmO$ways$tags$v=="park","id"]
ids_sub <- find_down(osmO, way(c(ids_relations, ids_ways)))
sp_sub_park <- as_sp(subset(osmO, ids = ids_sub), "polygons")

现在,我想知道每个“公园”的面积[图1](中间最大的一个是海德公园)。

spplot(sp_sub_park, c("version"), colorkey = FALSE, col.regions=c('green'))

Fig1

有两种方法:

1) 在多边形本身中使用插槽“区域”。

a1 <- sapply(sp_sub_park@polygons, function(x) x@area)

2)计算指定投影的面积。

bg_poly_t <- spTransform(sp_sub_park, CRS("+proj=longlat +datum=WGS84"))
a2 <- rgeos::gArea(bg_poly_t, byid=TRUE)

这两个给了我相同的结果[图2](注意两个最大的区域是海德公园,被一条路分成两部分)

plot(a1*1000000, a2*1000000)

Fig2

但是,大小并不是我所期望的。面积以平方公里(绘制的平方米)为单位返回。据介绍,海德公园的两部分面积合计约300平方米,相当于一个大公寓的大小,但不是公园的大小(海德公园约1.420.000平方米)。

有什么想法吗?

最佳答案

由于您的“ map ”采用纬度/经度坐标,为了计算区域,您必须将其转换为“公制”投影(如@Phil建议),或使用球面几何(例如,如包中实现的) 地圈)。

幸运的是,如果对象位于地理坐标中,sf 包的函数 st_area 使用 geosphere 计算多边形的面积。因此,您可以简单地执行以下操作:

sf_sub_park <- st_as_sf(sp_sub_park)
areas <- st_area(sf_sub_park)
sum(areas)

,给予:

2551269 m^2

,这与@Phil 结果非常接近。

HTH

关于r - OSM、rgeos、osmar、面积计算,不相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549920/

相关文章:

css - 形状外和垂直对齐的文本

r - 在 R 中使用 by() 对 data.frame 进行二项式测试

mysql - RMySQL - 自动从数据库表中读取数据

r - 计算 R 函数的最大内存需求

c# - SQL Linq .Take() 来自巨大数据库的最新 20 行,性能方面

java - biomod2 警告消息 : running command 'java' had status 1

solr - 如何使用 Solrj 注释来索引 Lat/Long

R:我的数据集中的 as.POSIXct 时区和 scale_x_datetime 问题

javascript - 在 react-mapbox-gl 中显示多边形

c++ - 多边形 C++ 的凸性?