Comment transformer des polylignes en points tous les n mètres dans PostGIS?

14

Question à peu près la même que celle-ci , mais je dois utiliser PostGIS.

J'ai un certain nombre de polylignes et je souhaite les transformer en points tous les n mètres le long de ces lignes.

edit: Merci beaucoup à Stefan. Ma dernière requête était un peu différente, probablement en raison de l'ancienne version de PostGIS (1.5), mais finalement j'ai obtenu ce dont j'avais besoin. Les points ont été combinés dans une carte thermique de la densité des routes. entrez la description de l'image ici

culebrón
la source

Réponses:

17

Cette requête devrait faire l'affaire:

WITH line AS 
    (SELECT
        your_polylinestring_id,
        (ST_Dump(geom)).geom AS geom
    FROM your_polylinestring_table),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, ST_Length(line.geom)) AS linem,
        generate_series(0, ST_Length(line.geom)::int, 10) AS i
    FROM line),
geometries AS (
    SELECT
        i,
        (ST_Dump(ST_GeometryN(ST_LocateAlong(linem, i), 1))).geom AS geom 
    FROM linemeasure)

SELECT
    i,
    ST_SetSRID(ST_MakePoint(ST_X(geom), ST_Y(geom)), 31468) AS geom
FROM geometries
  1. Au début, vous sélectionnez les lignes distinctes de votre colonne de polyligne avec ST_Dump

  2. Ensuite, vous devez définir les éléments de mesure avec ST_AddMeasure, en commençant par 0 (début de la chaîne de lignes) et la fin de la chaîne de lignes (identique à la longueur de la chaîne de lignes). Generate_seriescrée une série sur cette mesure par pas de 10. Ici vous pouvez définir "n metres"(dans cet exemple 10 mètres). La ivaleur recommence pour chaque ligne de ligne.

  3. Avec ST_LocateAlonget ST_GeometryNvous créez une géométrie de point multidimensionnelle.

  4. Enfin, vous devez extraire les valeurs X et Y de cette géométrie et en créer un point.

Le résultat pourrait ressembler à ceci: entrez la description de l'image ici

ÉDITER

Pour être honnête, je veux ajouter ces informations: l'idée et la requête dans cette réponse sont extraites d'une requête que j'utilise pour créer des lignes drapées à partir de DEM dans PostGIS. L'excellente mise en œuvre de ceci est expliquée dans cet article de Mathieu Leplatre.

Stefan
la source
Pouvez-vous préciser, b / c que je ne connais pas ces constructions SQL: où WITH line ASest-il utilisé? Je ne vois pas de «ligne» ailleurs.
culebrón
2
@ culebrón Le WITH Queryfournit l'utilisation de tables temporaires pour les requêtes plus volumineuses. Voici quelques informations: postgresql.org/docs/8.4/static/queries-with.html . lineest utilisé dans la sous-requête suivante linemeasure. Les données sélectionnées dans cette sous-requête sont basées sur les sélections effectuées dans la linesous - requête. Ils sont construits les uns sur les autres. J'espère que cela a aidé!
Stefan
Dans PostGIS antérieur à 2.0, la fonction est st_locate_along_measure.
culebrón