NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割

在这个教程中,我们将学习如何使用挤压方法(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 提供CityJSONOBJ和更多格式。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翻译整理,转载请标明出处