如何有效地合并多个 3d 多边形并将它们投射到另一个 table?
How to effiecently union multiple 3d polygones and cast them to another table?
我正在处理大量 CityGML 3d 建筑数据 (LoD2) 并使用 3D 城市数据库(及其 Importer/Exporter 工具)导入数据(参见 https://www.3dcitydb.org/3dcitydb/),这会创建一个数据库中的新模式并使用 java 例程将 XML 样式的地理数据转换为 PostGIS 兼容的数据库输入。
然后将每个建筑物的信息(空间和非空间)写入不同的 tables,其中 "building" table 保存建筑元数据,例如建筑功能或街道名称和 "surface_geometry" table 包含所有建筑物的实体和 3d 表面几何形状。将列“id”、“parent_id”和“root_id”用作 PK 和 FK,以确保一个 table 的元素可以与另一个 [=] 的一个或多个元素匹配60=]。
由于我的大部分分析都需要 2d 建筑物足迹(或鸟瞰图多边形),因此我创建了查询以在 st_union()
使用 group by
对同一建筑物的所有 2d 表面进行 st_force2d()
之前使用 st_force2d()
制作 2d 表面] 在可用的 FK 上。
有什么想法可以改进以下代码以有效处理庞大的数据集吗?
查询是
CREATE TABLE citydb.building_geom_tmp AS
SELECT a.*, b.bldg_footprint AS geom
FROM Citydb.building AS a
LEFT JOIN (
SELECT *, ST_Force2D(geometry) AS bldg_footprint FROM citydb.surface_geometry
) AS b
ON a.lod2_solid_id = b.root_id;
DROP TABLE IF EXISTS citydb.building_geom ;
CREATE TABLE citydb.building_geom AS
SELECT a.*, b.geom
FROM citydb.building AS a
LEFT JOIN (
SELECT id, ST_Union(geom) AS geom
FROM citydb.building_geom_tmp AS c
GROUP BY c.id
) AS b
ON a.id = b.id;
DROP TABLE IF EXISTS citydb.building_geom_tmp
我正在使用 Win 10 和
SELECT version()
和 SELECT postgis_full_version()
给出
PostgreSQL 13.2, compiled by Visual C++ build 1914, 64-bit
和
POSTGIS="3.1.1 3.1.1" [EXTENSION] PGSQL="130" GEOS="3.9.1-CAPI-1.14.1"
PROJ="7.1.1" GDAL="GDAL 3.2.1, released 2020/12/29" LIBXML="2.9.9"
LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)" RASTER
分别。
上面显示postgres/postgis-versions的虚拟机上的3dcityDB是4.1.0.
示例 CityGML LoD2 数据可以从德国联邦制图和大地测量局 (here) 下载。
此外,我向 3DCityDB 开发人员询问了 github 存储库 here 中的想法。
在此先感谢您的任何想法和最诚挚的问候
安德烈
直接在 Github 上得到了开发者的回答:
https://github.com/3dcitydb/3dcitydb/issues/73
我正在处理大量 CityGML 3d 建筑数据 (LoD2) 并使用 3D 城市数据库(及其 Importer/Exporter 工具)导入数据(参见 https://www.3dcitydb.org/3dcitydb/),这会创建一个数据库中的新模式并使用 java 例程将 XML 样式的地理数据转换为 PostGIS 兼容的数据库输入。
然后将每个建筑物的信息(空间和非空间)写入不同的 tables,其中 "building" table 保存建筑元数据,例如建筑功能或街道名称和 "surface_geometry" table 包含所有建筑物的实体和 3d 表面几何形状。将列“id”、“parent_id”和“root_id”用作 PK 和 FK,以确保一个 table 的元素可以与另一个 [=] 的一个或多个元素匹配60=]。
由于我的大部分分析都需要 2d 建筑物足迹(或鸟瞰图多边形),因此我创建了查询以在 st_union()
使用 group by
对同一建筑物的所有 2d 表面进行 st_force2d()
之前使用 st_force2d()
制作 2d 表面] 在可用的 FK 上。
有什么想法可以改进以下代码以有效处理庞大的数据集吗?
查询是
CREATE TABLE citydb.building_geom_tmp AS
SELECT a.*, b.bldg_footprint AS geom
FROM Citydb.building AS a
LEFT JOIN (
SELECT *, ST_Force2D(geometry) AS bldg_footprint FROM citydb.surface_geometry
) AS b
ON a.lod2_solid_id = b.root_id;
DROP TABLE IF EXISTS citydb.building_geom ;
CREATE TABLE citydb.building_geom AS
SELECT a.*, b.geom
FROM citydb.building AS a
LEFT JOIN (
SELECT id, ST_Union(geom) AS geom
FROM citydb.building_geom_tmp AS c
GROUP BY c.id
) AS b
ON a.id = b.id;
DROP TABLE IF EXISTS citydb.building_geom_tmp
我正在使用 Win 10 和
SELECT version()
和 SELECT postgis_full_version()
给出
PostgreSQL 13.2, compiled by Visual C++ build 1914, 64-bit
和
POSTGIS="3.1.1 3.1.1" [EXTENSION] PGSQL="130" GEOS="3.9.1-CAPI-1.14.1" PROJ="7.1.1" GDAL="GDAL 3.2.1, released 2020/12/29" LIBXML="2.9.9" LIBJSON="0.12" LIBPROTOBUF="1.2.1" WAGYU="0.5.0 (Internal)" RASTER
分别。 上面显示postgres/postgis-versions的虚拟机上的3dcityDB是4.1.0.
示例 CityGML LoD2 数据可以从德国联邦制图和大地测量局 (here) 下载。
此外,我向 3DCityDB 开发人员询问了 github 存储库 here 中的想法。
在此先感谢您的任何想法和最诚挚的问候
安德烈
直接在 Github 上得到了开发者的回答: https://github.com/3dcitydb/3dcitydb/issues/73