PostGIS多边形边缘分析(方向,边缘长度)


9

我对GIS尤其是PostGIS不太熟悉,因此,如果答案似乎显而易见,请原谅...

我想对许多建筑物进行分析。我感兴趣的一件事是它们的外墙表面以及各自的方向。如下图所示,我希望具有一系列多边形中所有边的长度和(法线)方向。在示例中,我仅突出显示一个表面。

在此处输入图片说明

结果表可能是这样的:

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

但是,我不确定这是否是存储结果以进行进一步处理的明智方法(例如,计算从边缘到下一栋建筑物的距离等)。所以我的问题是双重的:

  1. 是否有一个有效的PostGIS功能可以分析多边形的边缘?如果没有本地PostGIS功能,我可能会对基于Python的方法感兴趣。
  2. 由于多边形的边数可能不同,因此将结果存储在PostGIS表中的聪明方法是什么?

2
首先创建多边形的线段:stackoverflow.com/questions/7595635/…然后起点和终点坐标应移至x1,y1和x2,y2之类,并且比ST_Azimuth(ST_Startpoint(geometries),ST_Endpoint(geometries)) 。(postgis.org/docs/ST_Azimuth.html)–
塔马斯·科萨

1
@TamasKosa:您有一个很好的答案的本质。为什么不将其扩展为一个?同样,对于法线,方位角需要+/- pi / 2。
马丁F

1
@TamasKosa这也是我也在考虑的一种方法。使用ST_ExteriorRing,然后按照您的说明获取方位角。由于建筑物可以具有不同数量的边,因此理想情况下如何存储结果?在如上所述的表格中?我同意MartinF,这几乎是一个答案;)
n1000

只是好奇,您为什么要法线...暴露在阳光下?
马丁F

1
问题的第一部分已得到解答-您可以使用ST_Dumppoints和ST_Azimuth。对于第二部分,由于没有输出空间元素,因此我认为将找到一个指向polygonID和edge_id的链接。
约翰·鲍威尔

Answers:


10

昨天,我没有时间详细创建它...分4步查看解决方案:

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

最后一个查询使用st_touches为您提供带有空间连接的建筑物ID。希望能帮助到你。更新-在qgis中,解决方案如下所示: 在此处输入图片说明


1
令人印象深刻!我知道了。非常感谢!随着大量建筑物的出现,它变得有点慢。方位角现在不是法线。您是否也有解决该问题的想法?我不确定如何找到多边形的“外部”。
n1000 2015年

1
像这样向弧度中的方位角添加90度:deg(st_azimuth(ff.sp,ff.ep)+1.57079633)。有时会生成大于360的值。但是通过更新查询,您可以替换这些值。如果您想用作静态视图,请创建“ CREATE MATERIALIZED VIEW”,它不会在第一次出现时就变慢。
塔马斯·科萨

2
不完全的。假设北为0°,这将使法线朝向多边形/建筑物的内部(如您的屏幕截图所示)。但是您是对的-一个简单的方法UPDATE就可以解决问题。再次感谢您提供的出色解决方案。如果出现其他答案,我将再等待几天,然后再接受。
n1000 2015年

1
ST_ForceRHR呢 这个答案实际上似乎还不错。
雅各布·卡尼亚

@JakubKania我试图提出ST_ForceRHR解决方案,但没有成功。非常感谢您的提示...我尝试过ST_Dump(ST_Boundary(ST_ForceRHR(the_geom)))
n1000 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.