如何从[LINE | MULTILINE] STRING提取POINT


10

我想在其中创建一个vectorLayer,QGIS以显示形成DB LINESTRINGMULTILINESTRING存储在PostGISDB中的所有点。

我认为我需要将LINESTRING(或MULTILINESTRING)的所有点转换为POINT

第一个问题

PostGIS功能吗?

第二个问题

如果要从结果POINT表中排除重复的点,该怎么办?


谢谢大家。您的所有回答对我都有很大帮助。为了确定应该标记为正确的标记,我需要考虑一下:)
Heisenbug 2012年

Answers:


7

要获得点并链接到原始几何体,请使用

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

并从http://wiki.postgresql.org/wiki/Deleting_duplicates中删除重复项

请记住,您需要有一个唯一的ID才能进行重复删除,如果没有,则需要创建一个ID


嗨,有一个错字,你应该去掉最后一个括号。正确的语法应为SELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso

5

就第一个问题而言,就有一个PostGIS函数ST_DumpPoints

docs页面中的第一个示例正是您所需要的。这是一个返回集合的函数,因此它不仅可以转储点,还可以转储一些信息(将其与原始几何图形相关联)。由于您只在乎要点,因此可以尝试执行以下操作:

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 2012年

如果输入bytea不代表POINT几何,则返回NULL。
弗拉基米尔·

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.