¿Cómo crear diagramas de araña (líneas centrales) en PostGIS?

8

Soy bastante nuevo en PostGIS pero he leído mucho. Una cosa que he estado buscando es una función que permita a los usuarios crear un "diagrama de araña" (también llamado "líneas de deseo" o "líneas centrales") en PostGIS.

Como ejemplo, dibuje líneas desde una tienda de comestibles (punto) a todas las direcciones de clientes geocodificadas (punto) de esa tienda de comestibles. Por supuesto, sin embargo, imagine que había cientos de tiendas y miles de clientes. Me imagino que cada tienda tendría una identificación única que cada punto del cliente habría incrustado dentro de un campo para que el software conozca la conexión de origen y destino.

¿Existe una función ST_ simple que realice esta tarea, o esto requiere combinar múltiples consultas para realizar la tarea?

RyanKDalton
fuente

Respuestas:

9

Suponiendo que su esquema de base de datos se vea así:

table customer:                     table shops:
customer_id | shop_id | the_geom    shop_id | the_geom
--------------------------------    ------------------
       1000 |     100 |    ...          100 |    ...
       1001 |     100 |    ...          101 |    ...
       1002 |     101 |    ...

La siguiente declaración debería crear un "diagrama de araña" para la tienda 100:

SELECT c.customer_id, c.shop_id, ST_MakeLine(c.the_geom,s.the_geom)
FROM customer as c JOIN shops as s
     ON c.shop_id = s.shop_id
WHERE shop_id = 100

Doc: http://postgis.net/docs/ST_MakeLine.html

bajo oscuro
fuente
Este código funcionó perfectamente la primera vez. Lo único que eliminé fue la declaración WHERE, ya que quería crear líneas de todos los clientes a todas las tiendas. ¡Excelente!
RyanKDalton
9

La pregunta está más o menos respondida, solo me gustaría agregar algunos comentarios para señalar la flexibilidad y el poder de hacer cosas como esta con sql espacial

Mientras leo la pregunta, se puede dividir en dos preguntas. Una pregunta SIG y una pregunta SQL sobre cómo combinar filas en diferentes tablas.

Como se mencionó anteriormente, la parte gis puede resolverse mejor con ST_MakeLine, si son dos puntos que desea conectar con su línea. Si hubiera sido líneas o polígonos, podría usar ST_Shortestline en su lugar para obtener una línea de las geometrías entre sus puntos más cercanos. Eso funcionará con puntos, líneas y polígonos.

La otra parte trata sobre cómo conectar el punto de tienda correcto con el punto de cliente correcto.

Esa es una pregunta básica de la base de datos. Comprender eso dará mucho más placer al usar PostGIS.

La situación más fácil es una tienda con muchos clientes. Entonces solo necesita una tabla de clientes y su punto de tienda y se vería algo así como:

Select ST_Makeline(customers.the_geom, yourPoint) from custmers;

Si tiene su única tienda en una mesa, se vería así:

Select ST_Makeline(customers.the_geom, stores.the_geom) from custmers, stores;

Pero si tiene muchas tiendas y cada cliente solo usa una tienda, obtendrá una solución que se parece a las otras respuestas aquí, por ejemplo:

Select ST_Makeline(customers.the_geom, stores.the_geom) 
 from custmers, stores
   where customers.storeid = stores.id;

PostgreSQL manejará esa consulta de la misma manera que:

    Select ST_Makeline(customers.the_geom, stores.the_geom) 
     from custmers inner join stores 
      on customers.storeid = stores.id;

Pero en el mundo real, probablemente se encontrará en la situación de que la mayoría de los clientes utilizan muchas tiendas. En ejemplos anteriores hemos tenido la relación de una tienda con muchos clientes, ahora tenemos una situación de muchos a muchos. Muchos clientes usan muchas tiendas.

Entonces hay una mala solución que a veces ves. La gente agrega una nueva fila de clientes para cada tienda que usa. Eso causará muchos problemas si, por ejemplo, desea cambiar su dirección, debe hacerlo en muchos lugares. La base de datos más correcta para hacerlo es hacer una "tabla de enlaces". No sé si esa es la palabra correcta en inglés, pero de todos modos. Esa es una tabla que contiene todos los datos específicos para la relación de los clientes con cada tienda que utiliza. Entonces tienes tres mesas. Uno con tiendas y todos los atributos que pertenecen a la tienda, como cuando está abierto y el número de teléfono para ponerse en contacto. Luego tiene la tabla de clientes, tal vez con la dirección y el número de teléfono del cliente. Luego tiene esta "tabla de enlaces" que debe incluir una identificación para la tienda, la identificación del cliente y tal vez información adicional, como la frecuencia de visitas a esa tienda en particular, o la distancia a la tienda, o esta línea que está creando (pero es mejor crear la distancia y la línea sobre la marcha cuando la necesite). Luego, con esta nueva tabla, su consulta se vería así:

Select ST_Makeline(customers.the_geom, stores.the_geom) 
  from customers inner join  
     c_s_link_table on customers.id = c_s_link_table.customerid 
     inner join stores 
     on c_s_link_table.storeid = stores.id;

Entonces tienes toda la flexibilidad. Digamos, por ejemplo, que agrega a su tabla de enlaces cuántas veces al mes el cliente visita esa tienda. Entonces puedes escribir una consulta como esta:

Select ST_Makeline(customers.the_geom, stores.the_geom), 
c_s_link_table.visits_per_month from
 customers inner join c_s_link_table on customers.id = c_s_link_table.customerid 
  inner join stores on c_s_link_table.storeid = stores.id;

luego puede usar ese atributo, visitas_por_mes para definir el grosor de sus líneas en el mapa que ilustra cuántas visitas recibe cada tienda.

Nicklas Avén
fuente
4

Una forma de hacer el esquema de araña en PostGIS es mediante el uso de la función ST_MakeLine . Ver ejemplo a continuación:

SELECT ST_MakeLine(a.the_geom, b.the_geom), a.id as customer_id, a.store_id 
FROM customers a, stores b WHERE a.store_id = b.id

taudorf
fuente