Trasladar un punto a la geometría mas cercana con postGIS

Hay veces que es necesaria trasladar un punto a la geometría más cercana por ejemplo estamos trabajando con calles i necesitamos asignar la posición de cada casa (número de policía) a su punto en la calle mas cercano a esta. Con postGIS esto se puede hacer. Utilizando dos funciones ST_LineInterpolatepoint y ST_LineLocatePoint. La segunda función localiza el en cada una de las geometría destino respecto al punto que queremos trasladar, la primera función crea un punto en dicha localización, el query quedaría de la siguiente forma, para el ejemplo de los números de policía.

Este proceso lo vamos ha realizar en dos pasos. Con el primero buscamos aquel ejes (línea que se encuentra mas cercana a cada punto). Esto lo hacemos con el agregador “min”. Si estamos trabajando con muchos puntos podemos limitar la distancia máxima para realizar el cálculo de la distancia mínima con ST_DWithin. Esto resulta interesante cuando tenemos una gran cantidad de elementos y necesitamos acortar el tiempo de procesamiento. El único inconveniente es que nos debemos asegurar que la distancia utilizar sea suficiente para incluir todos los elementos, de lo contrario puede haber elementos que se nos queden fuera del cálculo.

SELECT id_calles, b.gid id_numero_policia,
      min(ST_Distance (a.geom, b.geom))

FROM casas as a, calles as b
WHERE ST_DWithin(a.geom,b.geom,100)
GROUP BY id_calles, id_numero_policia

Una ves tenemos comprobado que la sentencia SQL funciona correctamente e incluye todos los elementos que necesitamos podemos pasar a incluirla en la sentencia que nos va a trasladar los puntos sobre la línea más cercana.

SELECT DISTINCT ON (id_numero_policia) id_calle, id_numero_policia,
     min(ST_Distance (a.geom, b.geom))as min,
     ST_LineInterpolatepoint(b.geom,ST_LineLocatePoint(b.geom,a.geom)) as geom

FROM casas as a, calles as b
WHERE ST_DWithin(a.geom,b.geom,100)

GROUP BY id_calles, id_numero_policia
ORDER BY id_numero_policia, min;

En esta sentencia sql hay que tener en cuenta que utilizamos [DISNTINCT ON(id_numero_policia)] para que nos seleccione solo el primer resultado,de lo contrario tendríamos el punto duplicado en todos aquellos ejes que se encuentran a menos de 100 metros. Ahora bien como controlamos que el primer resultado se el del eje mas cercano y no otro, con [ORDER BY id_numero_policia, min], al ordenar de menor a mayor el primer resultado es el del eje mas cercano.

El resultado final es el que se muestra en la figura, en rojo están representados los puntos en su posición original y en verde los puntos trasladados al eje mas cercacno.

ejes_pol

Advertisements

3 thoughts on “Trasladar un punto a la geometría mas cercana con postGIS

  1. Hola en mi caso tengo un punto en una esquina de calle como llevaria ese punto al vertice de la esquina de cada poligo es decir tengo cuatro poligonos digamos 2 por dos estan separados entre si unos 5 metros en el medio de los 4 poligonos hay un punto yo quisiera a partir de ese punto dibujar una linea hacia el vertice de cada esquina de los poligonos podrias darme una idea de como hacerlo?

    M'agrada

    • Si entiendo bien la pregunta quieres dibujar una línea de un punto dada a cada vértice del polígono. Lo que pretendes es crear una nueva capa de líneas i cada línea vendra definida por la posición del nodo en el polígono y por el punto al que lo quieres unir.

      En postgis tienes la opcion ST_MakeLine para crear líeneas, esta función la puedes combinar con ST_DumpPoints. Quedaría algo así

      SELECT ST_AsText(ST_MakeLine(a.geom, ST_DumpPoints))

      M'agrada

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s