当我有高度值属性时,如何将2D OSM多边形转换为3D



我有一个OSM数据库,只有建筑物多边形及其高度属性。我删除了任何没有高度的内容。

现在我需要转换";"方式";列转换为3D(或者创建另一个我不知道的列(以将所有普通2D多边形转换为3D几何图形;Z";坐标值。

我找不到任何PostGIS函数来做这件事(或者我无法解释现有的函数(。

有什么方法可以做到这一点吗?或者我需要GDAL吗?

您可以ST_DumpPoints您的几何体,使用ST_MakePointZ维度添加到,然后再次创建多边形,例如

WITH j (geom,height) AS (
SELECT 
(ST_DumpPoints('POLYGON((30 10,40 40,20 40,10 20,30 10))'::geometry)).geom,42
)
SELECT 
ST_AsText(
ST_MakePolygon(
ST_MakeLine(
ST_MakePoint(ST_X(geom),ST_Y(geom),height))))
FROM j;
st_astext                          
------------------------------------------------------------
POLYGON Z ((30 10 42,40 40 42,20 40 42,10 20 42,30 10 42))
(1 Zeile)

最后,创建一个新列或更新现有列取决于您。

我承认这不是一个非常优雅的解决方案。如果我们的PostGIS专家同事能想出一个更好的方案,我会非常高兴。

如果多边形中已经有了所有3个维度,并且只想将几何体更改为正确的类型,请查看ST_Force3D:

SELECT 
ST_AsText(
ST_Force3D('POLYGON((30 10 42,40 40 42,20 40 42,10 20 42,30 10 42))'::geometry));
st_astext                          
------------------------------------------------------------
POLYGON Z ((30 10 42,40 40 42,20 40 42,10 20 42,30 10 42))
(1 Zeile)

编辑:这是@Magno C:友好提供的OSM上下文中的答案

首先,您需要将";高度";将列属性为";真实的";因为OSM数据只是文本。但首先您需要删除所有非数字数据。您也可以删除所有null行。请注意,您将丢失数据!

alter table planet_osm_polygon add column alt real;
delete from planet_osm_polygon where height !~ '^([0-9]+[.]?[0-9]*|[.][0-9]+)$'
update planet_osm_polygon set alt = CAST ( REPLACE(height,',','.') AS real);

现在,您需要强制关闭LineStrings。我按照这个答案创建ST_ForceClosed函数。

现在,上面提到的答案可以起作用了。我修改它以符合OSM表结构。

ALTER TABLE planet_osm_polygon ADD COLUMN buildings3d geometry;

WITH j (geom,height) AS (
SELECT (ST_DumpPoints(way::geometry)).geom, alt from planet_osm_polygon
)
update planet_osm_polygon set buildings3d = ( SELECT 
ST_MakePolygon( ( ST_ForceClosed( ST_MakeLine( ST_MakePoint(ST_X(geom),ST_Y(geom),height) ) ) ) ) 
FROM j );

进一步阅读:ST_MakeLineST_MakePolygon

最新更新