Postgis: Как выбрать каждую вторую точку из LINESTRING? - PullRequest
1 голос
/ 20 февраля 2020

В DBeaver у меня есть таблица, содержащая некоторые координаты GPS, хранящиеся в формате Postgis LINESTRING. Мои вопросы: если у меня есть, скажем, эта информация:

LINESTRING(20 20, 30 30, 40 40, 50 50, 60 60, 70 70)

, какую встроенную функцию ST я могу использовать для получения каждого N-го элемента в этой LINESTRING? Например, если я выберу 2, я получу:

LINESTRING(20 20, 40 40, 60 60)

, если 3:

LINESTRING(20 20, 50 50)

и т. Д.

Я пробовал с ST_SIMPLIFY и ST_POINTN, но теперь это именно то, что мне нужно, потому что я все еще хочу, чтобы он оставался LINESTRING, но с меньшим количеством точек (более низкое разрешение).

Есть идеи?

Спасибо: -)

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Добро пожаловать на SO. Вы пытались использовать ST_DumpPoints и применять модуль % над вершинами path? например, каждая вторая запись:

WITH j AS (
SELECT 
  ST_DumpPoints('LINESTRING(20 20, 30 30, 40 40, 50 50, 60 60, 70 70)') AS point
) 
SELECT ST_AsText(ST_MakeLine((point).geom)) FROM j
WHERE (point).path[1] % 2 = 0;

           st_astext           
-------------------------------
 LINESTRING(30 30,50 50,70 70)
(1 Zeile)

Дополнительная информация:

0 голосов
/ 20 февраля 2020

ST_Simplify должен возвращать линейную строку, если упрощение не приводит к неверной геометрии для lingstring, то есть меньше 2 вершин. Если вы всегда хотите вернуть линейную строку, подумайте о ST_SimplifyPreserveTopology. Это гарантирует, что как минимум две вершины возвращаются в линейной строке.

https://postgis.net/docs/ST_SimplifyPreserveTopology.html

...