У меня есть таблица postgis изолиний, которая определяется следующим образом:
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_Polygonize
. Он генерирует многоугольник для каждой границы и обеспечивает минимальное и максимальное превышение, охватываемое многоугольником. Алгоритм не может различить пик и депрессию и будет возвращать одинаковую высоту для минимума и максимума в этих случаях.Предложение
WITH
запроса «закрывает» любые открытые контуры, объединяя их со слегка сокращенным экстентом существующих контуров. (Степень сокращается для устранения любых ошибок округления, возникающих в результате использования, приST_Extent
котором создается коробка одинарной точности, сST_Polygonize
которой требуются идеально замкнутые и узловые входы в точности doulbe). Если ваши контуры уже закрыты (то есть вы работаете с островом), то этот шаг можно пропустить.источник
Я не очень опытный, но я бы попробовал геометрию функции ST_MakePolygon (геометрия externallinestring, geometry [] interiorlinestrings);
источник
Используя ваш bbox и итерируя по каждой линии контура, вы можете использовать
ST_ConcaveHull
для преобразования каждого региона в многоугольник.источник