Tengo unas cuantas líneas que juntas forman una línea larga. Los puntos de inicio y final de las líneas son iguales a su vecino directo, pero cuando se comprueba la distancia ST_Distance entre dos líneas cualquiera es como 1,0x10^-11.
Este parece ser el problema conocido con la codificación de flotantes. Son iguales pero no son lo mismo.
Sin embargo, cuando actualizo 2 líneas vecinas con sus coordenadas Astext existentes, se codifican por el mismo algoritmo y su distancia es 0. Pero entonces tienen una pequeña distancia con sus vecinos exteriores (que no se actualizan de esta manera).
Lo que quiero hacer es ajustar una línea a la izquierda y a la derecha con sus vecinos para que la ST_Distance con ambos vecinos sea 0. Creo que ST_Snap sólo mueve una geometría a otra geometría. Eso no es lo que quiero. Sólo quiero que el punto inicial y final de una línea se ajuste al vecino. El resto de la línea debe permanecer donde está.
¿Cómo lo hago?
Con la respuesta dada he arreglado los dos extremos de la línea conflictiva así:
update network set the_geom = ST_RemovePoint(the_geom, (select st_npoints(the_geom)-1 from network where gid=6909)) where gid=6909;
update network set the_geom = ST_AddPoint(the_geom, (select st_endpoint(the_geom) from network where gid=6123), (select st_npoints(the_geom) from network where gid=6909)) where gid=6909;
update network set the_geom = ST_RemovePoint(the_geom, 0) where gid=6055;
update network set the_geom = ST_AddPoint(the_geom, (select st_startpoint(the_geom) from network where gid=6909), 0) where gid=6055;
0 votos
Podría intentar extraer los puntos de inicio y final, ajustarlos y reemplazar los antiguos puntos de inicio y final con los datos que obtenga de st_snap
1 votos
Hay ST_AddPoint(línea, punto, índice), ST_RemovePoint(línea, índice) pero sólo puedes usar ST_ReplacePoint (línea,índice,punto) entonces necesitas ST_PointN(línea, índice) y ST_NumPoints(línea). Añade St_Snap dos veces y reemplaza tus viejos puntos finales con los nuevos
0 votos
Simplexia - He utilizado St_RemovePoint y ST_AddPoint como forma de reemplazar un vértice (ya que no pude encontrar el ST_ReplacePoint que mencionaste). Funcionó. Si actualizas tu comentario a una respuesta lo aceptaré como la respuesta que estaba buscando.
0 votos
Gracias. ¿Podría añadir un ejemplo de SQL a la respuesta?
0 votos
Una cosa extraña es que ST_RemovePoint y ST_AddPoint tienen un índice 0 pero ST_PointN tiene un índice 1.