Як витягнути POINT з [LINE | MULTILINE] STRING


10

Я хотів би створити векторний шар 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

пам'ятайте, що вам потрібно мати один унікальний ідентифікатор для видалення дублікатів, якщо у вас його немає, вам потрібно його створити


Привіт, є помилка друку, вам слід зняти останню дужку. Правий синтаксис повинен бути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
)

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