Suite

Comment exploser un MultiLineString en utilisant ST_Dump () dans PostGIS?

Comment exploser un MultiLineString en utilisant ST_Dump () dans PostGIS?


Je veux faire ce que fait cet article de blog : exploser un ChaîneMultiligne en individu ChaîneLignes. J'utilise CartoDB mais je ne deviens pas individuel ChaîneLignes à la suite de ma requête. je reçois toujours un MultiLineSting. J'ai essayé de le simplifier en supprimant des parties que je ne comprends pas (comme la partie COALESCE()) mais je n'ai toujours pas réussi à le faire fonctionner.

mon code

SELECT COALESCE((simple.trip_id || '.' || simple.path[1]::text)::float, simple.trip_id) comme identifiant, simple.simple_geom comme geom, ST_GeometryType(simple.simple_geom) comme geom_type, ST_AsEWKT(simple.simple_geom) as geom_wkt FROM ( SELECT dumped.*, (dumped.geom_dump).geom as simple_geom, (dumped.geom_dump).path as path FROM ( SELECT *, ST_Dump(the_geom) AS geom_dump FROM my_table ) ) AUSSI simple

Si quelqu'un pouvait aider à expliquer ce que fait le SQL ci-dessus et/ou comment le modifier, ce serait formidable. Je ne sais pas comment fonctionne la fonction ST_Dump.


Détails supplémentaires

En suivant les étapes de l'article de blog,

  1. Je crée une table vide appelée complexe dans CartoDB, une table Postgresql (via l'interface utilisateur, pas la commande SQL).

  2. Je crée deux LineStrings. J'ai d'abord essayé d'insérer avec SQL, comme dans l'exemple, mais j'obtiens une erreur

    INSERER DANS LE complexe (nom, the_geom) VALUES ( 'Bob', ST_GeomFromEWKT('MULTILINESTRING((498376.89 651569.6,498372.28 651571.89),(498372.28 651571.89,498371.77 651576.05))') ) >>>Error : ne correspond pas au SRID de la colonne (4326)"
  3. Au lieu de cela, je dessine une MultiLine avec 3 points (2 segments de ligne). Ensuite, je dessine une autre ligne avec 2 points (1 segment de ligne). Quand je regardele_geom, je vois que les deux lignes sont de type MultiLineString. Mon tableau est

    SELECT * FROM cartodb_id complexe | nom | the_geom -----------+------+---------- 1 | « Bob » | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373],[-25.83984375,35.17380832]]]} 2 | "Harry" | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373]]]}
  4. Je lance ensuite ce qui suit et j'obtiens,

    SELECT *, ST_GeometryType(the_geom) en tant que geom_type, ST_AsEWKT(the_geom) en tant que geom_wkt du complexe cartodb_id | nom | le_geom | geom_wkt | the_geom_webmercartor -----------+----------+----------+--------------- -------- 1 | « Bob » | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373],[-25.83984375,35.17380832]]]} | SRID=4326;MULTILINESTRING((-39.90234375 44.46515101,-25.83984375 44.71551373,-25.83984375 35.17380832)) | « Bob » | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373],[-25.83984375,35.17380832]]]} 2 | "Harry" | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373]]]} | SRID=4326;MULTILINESTRING((-39.90234375 44.46515101,-25.83984375 44.71551373)) | {"type":"MultiLineString","coordinates":[[[-39.90234375,44.46515101],[-25.83984375,44.71551373]]]}

Le billet de blog a indiqué que je devrais en obtenir ungeom_typeST_ChaîneMultiLigne et une ST_LineString. je reçois seulement Chaîne multilignes.

  1. Ensuite, j'exécute la fonction ST_Dump, mais je n'obtiens qu'une table avec 2 lignes. Soi-disant ils sont Chaînes de lignes, maisidentifiant = 1.1a 3 points dansle_geom. Je devrais obtenir un tableau avec 3 lignes (avec tous ChaîneLignes).

    SELECT COALESCE((simple.cartodb_id || '.' || simple.path[1]::text)::float, simple.cartodb_id) as id, simple.name, simple.simple_geom as geom, ST_GeometryType(simple.simple_geom ) comme geom_type, ST_AsEWKT(simple.simple_geom) comme geom_wkt FROM ( SELECT dumped.*, (dumped.geom_dump).geom as simple_geom, (dumped.geom_dump).path comme chemin FROM ( SELECT *, ST_Dump(the_geom) FROM AS geom_dump. complexe ) comme dumpé ) AS simple id | nom | le_geom | geom_type | geom_wkt ----+------+----------+-----------+---------- 1.1 | Bob | LINESTRING(-39.90234375 44.46515101,-25.83984375 44.71551373,-25.83984375 35.17380832) | ST_LineString | SRID=4326;LINESTRING(-39.90234375 44.46515101,-25.83984375 44.71551373,-25.83984375 35.17380832) 2.1 | Harry | LINESTRING(-39.90234375 44.46515101,-25.83984375 44.71551373) | ST_LineString | SRID=4326;LINESTRING(-39.90234375 44.46515101,-25.83984375 44.71551373)

Des questions

A. Pourquoi n'ai-je pas trois lignes, chacune avec un ChaîneLigne fait de 2 points ? Comment corriger mon SQL ?

B. Comment puis-je également obtenir the_geom_webmercator dans mon tableau de résultats pour qu'il apparaisse sur la carte ?


SELECT a.id, (ST_Dump(a.the_geom)).path path , (ST_Dump(a.the_geom)).geom geom ,ST_GeometryType((ST_Dump(a.the_geom)).geom ) geomtype INTO b FROM a

Créez une table avec les colonnes id, path , geom et geomtype. id point vers geom d'origine , path pointe vers l'endroit où geom était dans geom d'origine et geom est la géométrie.

Vous pouvez maintenant ajouter la colonne geom2 à la table (type géométrie) et créer une nouvelle ligne avec un décalage de ligne. Après cela, vous pouvez à nouveau créer MULTILINE en utilisant id
(pas testé)

ALTER TABLE b add geom2 geometry UPDATE b SET geom2 = line-offset(geom, 2) -- quelque chose comme ça SELECT id, ST_Linemerge(st_collect(geom)) de b group by id -- crée une chaîne de ligne ou plusieurs lignes

Ou alors

SELECT id, ST_MULTI(st_collect(geom)) du groupe b par id -- crée Multiline

si la commande est la même

SELECT b.id, ST_Multi(ST_Collect(b.geom)) FROM SELECT (id, path, geom from b order by id, path ) b GROUP BY b.id

ÉDITER: ST_Collect doit être remplacé par st_union ou autre. St_Multi et st_linemerge n'aiment pas les GEOMETRYCOLLECTIONS

EDIT : à propos des détails supplémentaires

  1. INSÉRER DANS LES VALEURS complexes (nom, the_geom) ( 'Bob', ST_GeomFromEWKT('SRID=4236;MULTILINESTRING((498376.89 651569.6,498372.28 651571.89),(498372.28 651571.89,498371.77 651576.05)') )

  2. LINESTRING peut être MULTILINESTRING, c'est juste une collection MULTI avec une LIGNE

RÉPONSES : Question A : je ne suis pas sûr, mais voici un exemple testé.

SELECT * INTO complex FROM ( SELECT 'Harry' comme nom , ST_GeomFromEWKT('SRID=4236;MULTILINESTRING((498376.89 651569.6,498372.28 651571.89))')as the_geom UNION SELECT 'Bob' comme nom , ST_GeomFRIDEWKTING(;'SMULTIWKT ((498376.89 651569.6,498372.28 651571.89),(498372.28 651571.89,498371.77 651576.05))') comme the_geom ) un

maintenant ce retour 3 lignes, Bob en a 2 et Harry 1

SELECT *, ST_AsEWKT(simple_geom) -- dans le test FROM ( SELECT dumped.*, (dumped.geom_dump).geom as simple_geom, (dumped.geom_dump).path as path FROM ( SELECT *, ST_Dump(the_geom) AS geom_dump FROM complexe ) comme sous-évalué) AS simple Maintenant, nous avons une table de test avec 3 lignes. SELECTIONNER st_asEWKT((st_union(the_geom))) comme geom du groupe de test par nom OU SELECTIONNER st_asEWKT(st_linemerge(st_union(the_geom))) comme geom du groupe de test par nom Le premier renvoie le type multiple, le second essaie de fusionner les lignes. Dans ce cas, il renverra 2 chaînes de lignes s'il ne réussit pas, il renverra des chaînes multilignes

Question B :

SELECT *, ST_Transform(geom,3857) comme the_geom_webmercator de xxx

Vous devez d'abord définir le SRID correct sur geoms. Créez-les en utilisant EWKT avec srid (comme cet exemple) ou en utilisant ST_SetSRID(geom, srid) , exemple

MISE À JOUR xxx set geom = ST_SetSRID(geom)

… J'espère que ça aide