如何使用postgis将等值线转换为等多边形?


9

我有一张等值线的postgis表,其定义如下:

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

在外观上,此线串对象如下所示:

在此处输入图片说明

我知道数据的空间范围,因此可以添加一个Bbox,这样LineStrings可以是封闭的。

在此处输入图片说明

我想myisopolygonsmyisolines具有多边形的表格中创建一个等值多边形表格,该表格不会重叠,而是创建一个连续的曲面,并具有一列等值线val最低val的列,由此形成多边形。我知道它可以由自封闭的等值线(孤岛)形成,也可以由用bbox封闭的等值线形成,在这种情况下,val应从特定的等值线中获取。在视觉上,它应该看起来像这样:

在此处输入图片说明

我以为可以以某种方式创建拓扑,然后将面转换为多边形,但是我不知道如何正确地进行。如何才能做到这一点?

另一个选择是在bbox和每个创建的多边形之间递归使用差异函数,但我想这不是正确的方法,而且绝对不快。


ST_Split或ST_BuildArea是解决问题的好方法
尼克

Answers:


3

这是使用的解决方案ST_Polygonize。它为每个边界生成一个多边形,并提供该多边形覆盖的最小和最大标高。该算法无法区分高峰和低谷,并且在这些情况下,对于最小值和最大值将返回相同的高度。

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

WITH查询的子句通过将所有打开的轮廓与现有轮廓的略微收缩的范围进行合并来“封闭”所有打开的轮廓。(范围缩小到可以消除由于使用导致的任何舍入误差,使用ST_Extent会产生一个单精度框,而使用ST_Polygonize则需要以doulbe-precision形式完美闭合和结点输入)。如果轮廓已经关闭(例如,您正在使用孤岛),则可以省略此步骤。


0

我不是很经验丰富,但我会尝试几何函数ST_MakePolygon(geometry externallinestring,geometry [] interiorlinestrings);


这并不能完全回答问题。
约翰·鲍威尔

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.