r - 如何使用 sf 包从 3D 数据中提取建筑面积
问题描述
我有以下来自瑞士联邦地形局 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 是有问题的。任何帮助或提示将不胜感激!
解决方案
如果您仔细查看第一个特征的几何形状:
> 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]
推荐阅读
- sql - 如何在 SQL Server 存储过程中安排重复代码?
- javascript - 我的节点 js 从 json 文件中获取函数未在控制台上显示 json 数据
- c++ - 我在哪里可以找到 GLIBCXX_3.4.29?
- c# - C# 将证书字符串转换为 X509 证书
- ruby-on-rails - 使用 SELECT MAX 的集合的 ActiveRecord 查询在 Rails 中表现不佳
- javascript - Django Bootstrap - 如何从本地 JSON 文件解析变量并将其显示在 .html 模板中?
- git - Azure Devops Repos - 恢复到以前的提交,就像最近的提交从未存在过一样
- c++ - 是否需要 std::forward 将 rValue 参数传递给 make_ 智能指针函数?
- android - React Native 崩溃 - 仅限三星 Android 10 - apex/com.android.runtime/lib64/bionic/libc.so abort
- c++ - 无法在 CMake 中正确包含第三方库