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)
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)
Réponses:
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.
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)