Как извлечь POINT из строки [LINE | MULTILINE]

10

Я хотел бы создать vectorLayer QGISдля отображения всех точек, которые образуют LINESTRINGили MULTILINESTRINGхранятся в PostGISБД.

Я думаю, что мне нужно преобразовать все точки LINESTRING(или MULTILINESTRING) в POINT.

Первый вопрос :

Есть ли какая-либо PostGISфункция для этого?

Второй вопрос :

Если я хочу исключить повторяющиеся точки из POINTтаблицы результатов , как я могу это сделать?

гейзенбаг
источник
Спасибо всем. Все ваши ответы мне очень помогли. Я должен немного подумать, чтобы решить, какой из них следует пометить как правильный :)
Heisenbug

Ответы:

7

Чтобы получить точку в порядке и ссылку на оригинальную геометрию, используйте

SELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings)

и удалите дубликаты из http://wiki.postgresql.org/wiki/Deleting_duplicates

помните, что вам нужно иметь один уникальный идентификатор для удаления dublicate, если у вас его нет, вам нужно его создать

simplexio
источник
Привет, есть опечатка, вы должны удалить последнюю скобку. Правильный синтаксис должен бытьSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

Что касается первого вопроса, то для этого есть функция PostGIS, ST_DumpPoints .

Первый пример на странице документов - это именно то, что вам нужно. Это функция, возвращающая множество, поэтому она не только выводит точки, но и некоторую информацию (массив путей), которая связывает их с исходной геометрией. Так как вы заботитесь только о баллах, вы можете попробовать что-то вроде этого:

SELECT (dp).geom FROM (
  SELECT ST_DumpPoints(geom) AS dp
    FROM linestrings
)
kprist
источник
2

Объявление 1

CREATE TABLE points AS
SELECT ST_PointFromWKB(ST_AsEWKB(linestring_geom)) AS point_geom FROM linestring_table;

Объявление 2. Выберите дубликаты баллов PostGIS

CREATE TEMPORARY TABLE temp AS 
SELECT *
FROM points AS a, points AS b
WHERE ST_Equals(a.geom, b.geom) AND a.id <> b.id;

DROP FROM points USING temp WHERE points.id=temp.id;
Владимир
источник
Это не работает, она производит пустые геометрии и PostgreSQL выдает предупреждения для каждой строки переработанной: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Вы могли бы просто ST_AsEWKB()вообще пропустить , но это все равно не имело бы никакого смысла, см. Последний пример в ST_PointFromWKB
kprist
NULL возвращается, если входной байт не представляет геометрию POINT.
Владимир
2

Чтобы вывести только уникальные точки, вы можете использовать несколько подзапросов с SELECT DISTINCT ONвыражением :

SELECT geom, gid, path
FROM (
  SELECT DISTINCT ON (geom) geom, path, gid
  FROM (
    SELECT (ST_DumpPoints(the_geom)).geom, (ST_DumpPoints(the_geom)).path, gid
    FROM my_linestrings_table
  ) f
  ORDER BY geom, path, gid
) f
ORDER BY gid, path;
Майк Т
источник