如何使用sf包从3D数据中提取建筑面积

时间:2019-05-10 09:37:56

标签: r sf

我从瑞士联邦地形局swisstopo获得了以下3D数据:

https://shop.swisstopo.admin.ch/en/products/landscape/build3D

要下载数据,您需要单击“阅读更多”,向下滚动并单击示例数据。

这只是一个示例。请注意,我使用GDB是因为我的真实数据集是这种格式的。 然后我将数据读入R:

library(sf)

data <- st_read("swissbuildings3dlv03/GDB/swissBUILDINGS3d_10.gdb")

下一步,我放下三维尺寸并计算面积:

data %>% 
 st_zm() %>% 
 st_area()

但是,将其与这些建筑物的官方数据进行比较时,该区域始终是其应有面积的两倍。我猜想,如何将尺寸从3D缩小到2D有点问题。任何帮助或提示将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果您仔细观察第一个特征的几何:

> st_as_text(st_geometry(map[1,]))
GEOMETRYCOLLECTION Z ( TIN Z .....
[...]
MULTIPOLYGON Z (((601608.1 197988.1 525.57, 601604 197974.8 525.57, 601593.7 197977.9 525.57, 601597.8 197991.3 525.57, 601608.1 197988.1 525.57)), ((601608.1 197988.1 517.9725, 601597.8 197991.3 517.9725, 601593.7 197977.9 517.9725, 601604 197974.8 517.9725, 601608.1 197988.1 517.9725))))"

MULTIPOLYGON位相关。它由两个多边形组成:

> st_as_text(st_cast(st_collection_extract(st_geometry(map)[1]),"POLYGON"))
[1] "POLYGON Z ((601608.1 197988.1 525.57,
                 601604 197974.8 525.57,
                 601593.7 197977.9 525.57,
                 601597.8 197991.3 525.57,
                 601608.1 197988.1 525.57))"          
[2] "POLYGON Z ((601608.1 197988.1 517.9725,
                 601597.8 197991.3 517.9725,
                 601593.7 197977.9 517.9725,
                 601604 197974.8 517.9725,
                 601608.1 197988.1 517.9725))"

看起来像两个相同的多边形,但Z高度不同。通过st_zm进行过滤将产生两个相同的2D多边形。因此,您将获得两倍的面积。

如果可以确保以这种方式表示每个要素,则将其除以2即可得到覆盖区域。如果可能还有其他复杂性(瑞士有金字塔吗?或者形状像Toblerone的建筑物?),其中顶部多边形与底部多边形不同,则您需要提取最低的多边形(如果需要覆盖面积)地面上)或所有多边形的并集(如果您希望从上方看到区域覆盖的话。

下面是第一个要素上的st_union的示例,通过合并顶部和底部多边形将面积减半:

> st_area(st_union(st_collection_extract(st_geometry(map)[1])))
150.5087 [m^2]

与原始版本相比:

> st_area(st_collection_extract(st_geometry(map)[1]))
301.0174 [m^2]