OSM, rgeos, osmar和面积计算问题不符

7
我正在尝试使用osmar下载OSM数据并获取多边形的大小。然而,经过检查后发现其大小不正确。
下面是一个示例:
(1) 伦敦海德公园周围的地理区域。提取所有标记为“公园”的道路和关系。
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)

这两个给我相同的结果 [Fig2] (请注意,最大的两个区域是海德公园,被一条道路分成两部分)。
plot(a1*1000000, a2*1000000)

图2

然而,尺寸并不是我所期望的。该区域以平方千米返回(绘制的是平方米)。根据这个结果,海德公园的两个部分加起来大约只有300平方米,这只相当于一个大公寓的面积,而不是一个公园的面积(海德公园约为1,420,000平方米)。

有什么想法吗?


rgeos::gArea 给了你一个警告,这可以作为提示。 - Edzer Pebesma
2个回答

4

由于您的“地图”是以纬度/经度坐标表示的,要计算面积,您必须将其转换为“公制”投影(如@Phil所建议的那样),或者使用球体几何(例如,在geosphere包中实现)。

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

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

给出:

2551269平方米

与@Phil的结果非常接近。

希望有所帮助。


不仅如此,它还会给你计量单位。 - Edzer Pebesma

1

我已将数据转换为使用米作为长度单位的英国国家网格(WGS84可能使用度,我不确定)。然后该区域面积为250万平方米,这似乎更合理?

sp_sub_park <- spTransform(sp_sub_park, CRS("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs "))
gArea(sp_sub_park)
# [1] 2550387

这比您预估的约1.4百万平方米更大,但海德公园是否占据了您地图上的大面积(即肯辛顿花园是否单独计算)?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接