Як перетворити ізоліни на ізополігони з постгітами?


9

У мене є таблиця постгігів ізоліній, яка визначена так:

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

Візуально цей об'єкт рядкових рядків виглядає приблизно так:

введіть тут опис зображення

Я знаю просторовий обсяг моїх даних, тому я можу додати Bbox, тому LineStrings може бути як би закритим.

введіть тут опис зображення

Я хочу створити таблицю ізополігонів myisopolygonsіз myisolinesтаблиці, з багатокутниками, яка не перекриватиметься, а створюватиме суцільну поверхню і мати стовпчик valз найнижчою valкількістю ізоліній, з якого утворився багатокутник. Я розумію, що це може формуватися з самозакритого ізоліну (острова) або ізолінії, закритого bbox, у такому випадку valслід брати саме з цього конкретного ізоліну. Візуально це повинно виглядати так:

введіть тут опис зображення

Я думав, що я можу якось створити топологію, а потім перетворити обличчя на багатокутники, але не розумію, як це зробити правильно. Як це можна зробити?

Іншим варіантом було б рекурсивно використовувати функцію різниці між bbox і кожним створеним багатокутником, але я думаю, що це не правильний спосіб зробити це, і, безумовно, не швидко.


ST_Split або ST_BuildArea - хороші кандидати для вашої проблеми
nickves

Відповіді:


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Пункт запиту «закриває» всі відкриті контури, unioning їх злегка стисненого обсягом існуючих контурів. (Ступінь контрактується для усунення будь-яких помилок округлення, що виникають в результаті використання ST_Extent, що створює одноточну коробку, за допомогою ST_Polygonizeякої потрібні ідеально закриті та кивані вхідні дані з точністю в дубльбе). Якщо ваші контури вже закриті (тобто ви працюєте з островом), цей крок можна опустити.


0

Я не дуже досвідчений, але я б спробував функціонувати геометрію ST_MakePolygon (геометрія зовнішньої лінії, геометрія [] внутрішні рядки);


Це насправді не відповідає повністю на питання.
Джон Пауелл

0

Використовуючи свій скриньку і повторюючи кожну лінію контуру, ви можете ST_ConcaveHullперетворити кожну область у багатокутник.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.