用GIS数据生成3D城市模型
在这个教程中,我们将学习如何使用挤压方法(extrusion)和开源软件3dfier利用开放数据生成 3D 城市模型。
1、挤压方法简介
生成 3D 城市模型的一种流行方法是挤压:将 2D 数据集(例如地籍数据库)中的特征提升到单个高度,从而创建体积 3D 城市模型。高度通常来自激光扫描(例如区域内所有点的平均高度)、地籍数据库或志愿地理信息(例如使用楼层数)。第一种情况如图所示:
这种方法简单明了。生成的 3D 城市模型虽然简单(它们只有平顶;所谓的 LOD1 模型),但与 2D 数据集相比具有很大优势。例如,它们可用于阴影分析和视线预测。
然而,有一些挑战需要注意,例如 2D 数据中的错误传播到生成的 3D 模型,虽然这种方法简单但没有很多实现,并且由于点云通常很大,每个特征的高度计算可能很慢。
在代尔夫特理工大学的3D 地理信息小组,我们开发了3dfier用于创建 3D 模型。在本教程中,我们将简要演示如何使用开放数据生成 3D 模型。
2、软件的安装
3dfier软件是命令行的,也就是说,它没有图形界面。但是,使用起来仍然非常简单。
第一步是按照安装说明进行安装。要测试是否安装正确,只需运行./3dfier
,你应该会得到如下内容:
$ ./3dfier
3dfier Copyright (C) 2015-2019 3D geoinformation research group, TU Delft
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; for details run 3dfier with the '--license' option.
ERROR: one YAML config file must be specified.
Allowed options:
--help View all options
--version View version
--license View license
--OBJ arg Output
--OBJ-NoID arg Output
--CityGML arg Output
--CityGML-Multifile arg Output
--CityGML-IMGeo arg Output
--CityGML-IMGeo-Multifile arg Output
--CityJSON arg Output
--CSV-BUILDINGS arg Output
--CSV-BUILDINGS-MULTIPLE arg Output
--CSV-BUILDINGS-ALL-Z arg Output
--Shapefile arg Output
--Shapefile-Multifile arg Output
--PostGIS arg Output
--PostGIS-PDOK arg Output
--PostGIS-PDOK-CityGML arg Output
--GDAL arg Output
3、3dfier 用法简介
3dfier 需要一个或多个 2D 数据集和一个或多个高程数据集作为输入。2D 数据集可以是任何 OGR 格式,例如 SHP 或 GML。高程数据集将位于 LAS/LAZ 中。
除了定义输入数据集外,3dfier 还可以定义某些参数,例如点云抽稀。
.yml
所有这些都在带有扩展名的单个文本文件中定义。例如,如果你在单独的 2D 文件中构建封装,输入将如下所示:
input_polygons:
datasets:
- bgt/bgt_pand.sqlite
uniqueid: gml_id
lifting: Building
不用担心,3dfier 附带一个准备好的示例配置文件,你可以对其进行编辑以适应自己的情况。
4、生成自己的数据集
下载软件后,你可能已经注意到有一个名为example_data
的文件, 它包含创建示例 3D 城市模型所需的一切,我们将在本简短教程中使用该模型。
配置文件testarea_config.yml
已准备好所有必需的信息。
首先熟悉下输入数据集。在这个二维数据示例中,我们将使用BGT,即荷兰大比例尺地形图。BGT 是由荷兰国家测绘机构Kadaster提供的开放数据。该文件夹bgt
包含多个文件中的 2D 数据集。我们将研究的区域是代尔夫特的中心(你可以使用免费的QGIS查看文件):
因此 2D 数据集不仅包含建筑物,还包含水、道路和植被等其他特征。
对于高程,我们将使用荷兰国家高度模型 ( AHN )。它也可以作为开放数据使用。该区域有两个文件,都存储在文件夹中ahn3
。这是点云的样子(你可以使用免费软件CloudCompare):
有关输入点云的信息也记录在配置文件中:
input_elevation:
- datasets:
- ahn3/ahn3_cropped_1.laz
- ahn3/ahn3_cropped_2.laz
omit_LAS_classes:
- 1 # unclassified
thinning: 0
请注意,在配置文件中,你还可以指定省略点云中的某些类(例如植被)并细化点以加快处理速度。这两个激光雷达文件很小,因此我们将考虑所有激光雷达点。
现在已经检查了输入数据集,让我们看看 3dfier 的其他一些选项。一个重要的选项是指定如何确定每个建筑物顶部的标高。在我们的例子中:
lifting_options:
Building:
roof:
height: percentile-90
ground:
height: percentile-10
“屋顶”的标高位于建筑物占地面积内所有点标高的 90%。这应该大致对应于建筑物顶部的标高(给出 90% 的值以过滤掉异常值和特征,例如烟囱)。底部(即接地板)的标高位于第 10 个百分位。可以使用这些值并确定最适合你的值。有些人更喜欢使用height_roof: percentile-50
在所有点的中位数处获得顶部的高度。
另一个重要的选项是生成的 3D 城市模型的格式。选项在上面的软件安装中显示。该选项作为命令行参数传递。
3dfier 提供CityJSON、OBJ和更多格式。OBJ 受到 3D 计算机图形软件的广泛支持,因此可以创建一个漂亮的 3D 模型渲染:
另一方面,CityJSON 是一种强大的 3D GIS 格式,可以对对象进行空间分析和结构化。
现在我们准备好在 CityJSON 和 OBJ 中生成 3D 模型。生成 3D 模型只需要一个简单的命令:
3dfier testarea_config.yml --OBJ output/testarea.obj --CityJSON output/testarea.json
3dfier 将报告 3D 生成的过程,但总体而言,对于此示例,它不应超过半分钟。如果输入数据一切顺利,该文件应该在指定的目录中可用(在我们的例子中/output
)。
如果你生成了一个 OBJ,可以使用免费软件MeshLab来查看它。如果你选择了 CityJSON,可以使用我们的CityJSON web-viewer将其可视化。
一个 OBJ 由三角形组成,因此结果将如下所示:
3dfier还自带了一个材质文件,所以如果你在MeshLab中切换相应的选项就可以可视化不同的语义类:
CityJSON 看起来很相似:
恭喜,你已经创建了 3D 城市模型!
5、用你自己的数据试试
现在你已经熟悉了 3dfier,您以尝试使用自己的数据生成 3D 城市模型。如果生成了一个不错的数据集,请告诉我们,以便我们可以在我们的网站上展示它。
原文链接:Generate LoD1 models
BimAnt翻译整理,转载请标明出处