Comment extraire POINT d'une chaîne [LINE | MULTILINE]

10

Je voudrais créer un vectorLayer QGISpour afficher tous les points qui forment un LINESTRINGou un MULTILINESTRINGstocké dans une base de PostGISdonnées.

Je pense que je dois transformer tous les points de LINESTRING(ou MULTILINESTRING) en POINT.

Première question :

Y a-t-il une PostGISfonction pour le faire?

Deuxième question :

Si je veux exclure les points en double de la POINTtable des résultats , comment puis-je faire cela?

Heisenbug
la source
Merci à tous. Toutes vos réponses m'ont beaucoup aidé. Je dois réfléchir un peu pour décider lequel doit être marqué comme étant le bon :)
Heisenbug

Réponses:

7

Pour obtenir un point dans l'ordre et un lien vers la géométrie d'origine, utilisez

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

et supprimez les doublons de http://wiki.postgresql.org/wiki/Deleting_duplicates

rappelez-vous que vous devez avoir un identifiant unique pour supprimer les doublons, si vous n'en avez pas, vous devez le créer

simplexio
la source
Salut il y a une faute de frappe, vous devez retirer le dernier crochet. La bonne syntaxe devrait êtreSELECT (ST_DumpPoints(the_geom)).path as path, id, (ST_DumpPoints(the_geom)).geom FROM linestrings
aborruso
5

En ce qui concerne la première question, il existe une fonction PostGIS juste pour cela, ST_DumpPoints .

Le premier exemple de la page des documents est exactement ce dont vous avez besoin. C'est une fonction renvoyant un ensemble, donc elle ne fait pas que vider les points, mais aussi des informations (le tableau des chemins) qui les relient à la géométrie d'origine. Puisque vous ne vous souciez que des points, vous pouvez essayer quelque chose comme ceci:

SELECT (dp).geom FROM (
  SELECT ST_DumpPoints(geom) AS dp
    FROM linestrings
)
kprist
la source
2

annonce 1.

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

annonce 2. Sélectionnez Duplicate Points 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;
Vladimir
la source
Cela ne fonctionne pas, il produit des géométries vides et avertissements pour chaque problèmes PostgreSQL ligne traitée: OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this. Vous pouvez simplement sauter ST_AsEWKB()complètement, mais cela n'a toujours aucun sens, voir le dernier exemple dans ST_PointFromWKB
kprist
NULL est retourné si le bytea d'entrée ne représente pas une géométrie POINT.
Vladimir
2

Pour vider uniquement des points uniques, vous pouvez utiliser quelques sous-requêtes avec une SELECT DISTINCT ONexpression :

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;
Mike T
la source