16 votos

PostGIS: Asignar ID de punto en la capa A al punto más cercano en la capa B

Este debería haber sido un precursor obvio (que no pregunté) a mi otra pregunta: ¿Cómo crear diagramas de araña (líneas de centro) en PostGIS?

Si no conozco la relación entre un punto en la capa A (tiendas) y un punto en la capa B (clientes), me gustaría decir en general "El cliente 1 es atendido por la tienda más cercana." Aunque reconozco que este hecho puede que no sea cierto, puede ser un buen sustituto.

Usando PostGIS, ¿cuál es la manera más eficiente de asignar el ID del punto más cercano en la capa A (tiendas) a cada punto en la capa B (clientes)? El resultado que estoy buscando es algo como lo siguiente.

Cliente | Tienda
    1    |   A
    2    |   A
    3    |   B
    4    |   C

8voto

saint_groceon Puntos 2696

Si parece que tienes muchos más clientes que tiendas, entonces podría ser más eficiente crear una capa de polígonos de Voronoi para las tiendas, y luego hacer una unión espacial de los clientes con los polígonos de las tiendas.

7voto

knut Puntos 241

Asimismo:

seleccionar A.ID como CUST_ID, (seleccionar B.ID from B order by st_distance(A.geom,B.geom) limit 1) como STORE_ID de A

6voto

tobes Puntos 19

Desde http://www.bostongis.com/?content_name=postgis_nearest_neighbor:

Si necesitas obtener el vecino más cercano para todos los registros en una tabla, pero solo necesitas el primer vecino más cercano para cada uno, entonces puedes usar la distintiva sintaxis DISTINCT ON de PostgreSQL. Que se vería algo así:

SELECT DISTINCT ON(g1.gid)  g1.gid As gref_gid, 
       g1.description As gref_description, 
       g2.gid As gnn_gid, 
       g2.description As gnn_description  
FROM sometable As g1, sometable As g2   
WHERE g1.gid <> g2.gid 
      AND ST_DWithin(g1.the_geom, g2.the_geom, 300)   
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 

Esto encontrará distancias mínimas de hasta 300 unidades. Por lo tanto, primero debes verificar tus datos y averiguar qué tan grandes serán tus distancias mínimas.

5voto

Lars Mæhlum Puntos 4569

Discusiones sobre algunas soluciones básicas de vecino más cercano se pueden encontrar aquí: http://www.bostongis.com/?content_name=postgis_nearest_neighbor#120

/Nicklas

3voto

NilObject Puntos 7874

Tienes que encontrar el par más corto en un cuadro de búsqueda, y si el cuadro no tiene nada dentro, amplíalo. No es bonito pero funciona. Aquí hay un ejemplo de código PL/PgSQL http://trac.osgeo.org/postgis/wiki/UsersWikiNearest

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X