当我具有高度值属性时,如何将 2D OSM 多边形转换为 3D?
How can I transform 2D OSM Polygon to 3D when I have a height value attribute?
我有一个只有建筑物多边形及其高度属性的 OSM 数据库。我删除了所有没有高度的东西。
现在我需要将“way”列转换为 3D(或创建另一个我不知道的列)以将所有普通 2D 多边形转换为 3D 几何,将高度属性设置为“Z”坐标值。
我找不到任何 PostGIS 函数来执行此操作(或者我无法解释存在的函数)。
有什么办法可以做到这一点,或者我需要 GDAL 吗?
您可以ST_DumpPoints
your geometry, add the Z
dimension to with ST_MakePoint
并再次创建多边形,例如
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 上下文中的答案:
首先您需要将“height”属性列转换为“real”,因为 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);
现在,您需要强制关闭 LineString。我遵循 this answer 并创建了 ST_ForceClosed
函数。
现在上面提到的答案可以工作了。我修改它以符合 OSM table 结构。
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_MakeLine
and ST_MakePolygon
我有一个只有建筑物多边形及其高度属性的 OSM 数据库。我删除了所有没有高度的东西。
现在我需要将“way”列转换为 3D(或创建另一个我不知道的列)以将所有普通 2D 多边形转换为 3D 几何,将高度属性设置为“Z”坐标值。
我找不到任何 PostGIS 函数来执行此操作(或者我无法解释存在的函数)。
有什么办法可以做到这一点,或者我需要 GDAL 吗?
您可以ST_DumpPoints
your geometry, add the Z
dimension to with ST_MakePoint
并再次创建多边形,例如
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 上下文中的答案:
首先您需要将“height”属性列转换为“real”,因为 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);
现在,您需要强制关闭 LineString。我遵循 this answer 并创建了 ST_ForceClosed
函数。
现在上面提到的答案可以工作了。我修改它以符合 OSM table 结构。
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_MakeLine
and ST_MakePolygon