Suite

PostGIS - Fusion de chaînes de lignes en plusieurs chaînes dans un ordre particulier

PostGIS - Fusion de chaînes de lignes en plusieurs chaînes dans un ordre particulier


J'ai un ensemble de chaînes de lignes que je souhaite regrouper en une seule chaîne multiligne et dans un ordre spécifique. Cependant, lorsque j'utilise ST_Collect, il les fusionne dans le désordre, comme ceci :

Géométries sous forme de lignes :

Ordre dans lequel la chaîne multiligne est générée :

Je sais que cet "ordre" n'est vraiment que dans ma tête, et la fonction utilisera un paramètre pour déterminer l'ordre. Une recherche rapide m'a montré que ST_Collect fait son ordre magique par l'identifiant de ligne, mais pour des raisons que je ne prendrai pas la peine de passer en revue ici, je ne peux pas réorganiser mes identifiants dans "l'ordre d'agrégation".

J'ai cependant une table séparée avec le bon ordre, qui fait référence aux identifiants geom, donc une simple jointure suffirait à les mettre dans l'ordre, mais ST_Collect l'ignore. Existe-t-il un moyen d'agréger des chaînes de lignes en une chaîne multiligne en utilisant l'ordre de cette deuxième table ?

(les dessins sont simplement illustratifs, mais représentent un cas réel, c'est-à-dire que certaines des lignes ne sont pas connectées et doivent le rester. Par conséquent, je ne peux pas utiliser ST_LineMerge pour "forcer" un ordre correct)


Postgres vous permet de contrôler l'ordre dans lequel les lignes sont introduites dans une fonction d'agrégat, à l'aide d'unCOMMANDÉ PARconstruire dans les paramètres de l'agrégat (voir docs). Par exemple (ça a l'air un peu bizarre) :

CREER des lignes TEMPORARY TABLE (géométrie geom); INSERT INTO lines VALUES ('LINESTRING (0 0, 1 1)'), ('LINESTRING(1 1, 2 2)'), ('LINESTRING(0 -1, 2 7)'); SELECT ST_AsText(ST_Collect(geom ORDER BY ST_Length(geom) DESC)) FROM lignes ; -- MULTILINESTRING((0 -1,2 7),(0 0,1 1),(1 1,2 2)) SELECT ST_AsText(ST_Collect(geom ORDER BY ST_YMin(geom) DESC)) FROM lines; -- CHAÎNE MULTILIGNE((1 1,2 2),(0 0,1 1),(0 -1,2 7))

Sans rien savoir de votre schéma et de ce que vous avez essayé jusqu'à présent, cela peut vous aider à progresser un peu

Ce petit test montre que vous pouvez influencer l'ordre dans lequel ST_Collect assemble les lignes. Donc tu devrais pouvoir faire ce que tu veux.

CREATE TABLE Lines (ID INT NOT NULL, SEQ INT, Geom Geometry); INSERER DANS LES VALEURS DE Lignes (1,2,ST_GeomFromText('LINESTRING(0 0, 10 0)')), (2,1,ST_GeomFromText('LINESTRING(15 0, 15 5)')), (3,4,ST_GeomFromText ('LINESTRING(15 5, 10 10)')), (4,3,ST_GeomFromText('LINESTRING(5 5, 0 15)')); SELECT ST_AsText((ST_Dump(C)).geom) FROM ( SELECT ST_Collect(Geom) C FROM LINES A )C; SELECT ST_AsText((ST_Dump(C)).geom) FROM ( SELECT ST_Collect(Geom) C FROM (SELECT * FROM LINES ORDER BY SEQ) A )C; SELECT ST_AsText((ST_Dump(C)).geom) FROM ( SELECT ST_Collect(Geom) C FROM (SELECT * FROM LINES ORDER BY SEQ DESC) A )C;

Voir la vidéo: Postgresql: Create Postgis database and import shapefiles.