Comment ajouter des sommets aux chaînes de lignes existantes?

10

Si j'ai

Linestring(1 2, 1 5, 1 9)

et un

Point(1 3)

Y a-t-il une fonction qui peut fusionner la chaîne de lignes et le point en préservant l'ordre de sorte que la sortie serait:

Linestring(1 2, 1 3, 1 5, 1 9)
BorisT
la source
Vous allez donc simplement ajouter des sommets aux lignes existantes?
RK
oui, ajoutez un sommet à la chaîne de lignes existante, ce qui donne une chaîne de lignes.
BorisT
Pourquoi avez-vous besoin de le faire btw?
RK

Réponses:

8

Si le LineString doit simplement être subdivisé à une position la plus proche du point donné, vous pouvez faire ce que vous voulez avec cela (divise LineString au point le plus proche du point donné et rappelle ensuite les deux segments)

SELECT ST_AsText(
         ST_LineMerge(
           ST_Union(
             ST_Line_Substring(line, 0, ST_Line_Locate_Point(line, point)),
             ST_Line_Substring(line, ST_Line_Locate_Point(line, point), 1)
       )))
FROM  ST_GeomFromText('Linestring(1 2, 1 5, 1 9)') as line, 
      ST_GeomFromText('Point(1 3)') as point;

Cependant, si votre point n'est pas censé être projeté sur le LineString, cela ne fonctionnera pas.

chriserik
la source
2

PostGIS a ST_AddPoint qui devrait vous permettre de le faire bien que vous deviez spécifier où ajouter le point.

ST_AddPoint - Ajoute un point à un LineString avant le point (index basé sur 0).

Exemples:

--guarantee all linestrings in a table are closed
        --by adding the start point of each linestring to the end of the line string
        --only for those that are not closed
        UPDATE sometable
        SET the_geom = ST_AddPoint(the_geom, ST_StartPoint(the_geom))
        FROM sometable
        WHERE ST_IsClosed(the_geom) = false;

        --Adding point to a 2-d line
        SELECT ST_AsEWKT(ST_AddPoint(ST_GeomFromEWKT('LINESTRING(1 2, 1 5, 1 9)'), ST_MakePoint(1, 3), 1));

        --result
        st_asewkt
        ----------
        LINESTRING(1 2, 1 3, 1 5, 1 9)
RK
la source
oui, je sais pour cette fonction mais je ne sais pas où dois-je mettre mon nouveau point.
BorisT