我从瑞士联邦地形局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有点问题。任何帮助或提示将不胜感激!
答案 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]