Como criar diagramas de aranha (linhas de cubo) no PostGIS?

8

Sou bastante novo no PostGIS, mas já li bastante. Uma coisa que tenho procurado é uma função que permite aos usuários criar um "diagrama de aranha" (também chamado de "linhas de desejo" ou "linhas de hub") no PostGIS.

Como exemplo, desenhe linhas de uma mercearia (ponto) para todos os endereços geocodificados de clientes (ponto) dessa mercearia. Obviamente, imagine que houvesse centenas de lojas e milhares de clientes. Eu imaginaria que cada loja teria um ID exclusivo que cada ponto do cliente teria incorporado em um campo para que o software conheça a conexão de origem e destino.

Existe uma função ST_ simples que realizará essa tarefa ou isso exige a combinação de várias consultas para realizar a tarefa?

RyanKDalton
fonte

Respostas:

9

Supondo que o esquema do seu banco de dados tenha a seguinte aparência:

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

A declaração a seguir deve criar um "diagrama de aranha" para a loja 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

underdark
fonte
Este código funcionou perfeitamente na primeira vez. A única coisa que removi foi a instrução WHERE, pois queria criar linhas de todos os clientes para todas as lojas. Excelente!
precisa saber é o seguinte
9

A pergunta é mais ou menos respondida, gostaria apenas de adicionar alguns comentários para apontar a flexibilidade e o poder de fazer coisas assim com sql espacial

Enquanto leio a pergunta, ela pode ser dividida em duas perguntas. Uma pergunta GIS e uma pergunta sql sobre como combinar linhas em tabelas diferentes.

A parte gis pode, como mencionado antes, ser melhor resolvida com ST_MakeLine, se houver dois pontos que você deseja conectar à sua linha. Se fossem linhas ou polígonos, você poderia usar ST_Shortestline para obter uma linha das geometrias entre os pontos mais próximos. Isso funcionará com pontos, linhas e polígonos.

A outra parte é sobre como conectar o ponto de armazenamento certo ao ponto de cliente certo.

Essa é uma pergunta básica do banco de dados. Entendimento que dará muito mais prazer ao uso do PostGIS.

A situação mais fácil é uma loja com muitos clientes. Então você só precisa de uma tabela de clientes e seu ponto de loja, e seria algo como:

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

Se você tiver sua única loja em uma tabela, ficaria assim:

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

Mas se houver muitas lojas e cada cliente estiver usando apenas uma loja, você obterá uma solução parecida com as outras respostas aqui, por exemplo:

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

O PostgreSQL manipulará essa consulta da mesma maneira que:

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

Mas, no mundo real, você provavelmente encontrará a situação em que a maioria dos clientes está usando muitas lojas. Em exemplos anteriores, tivemos a relação de uma loja para muitos clientes, agora temos uma situação de muitos para muitos. Muitos clientes usando muitas lojas.

Depois, há uma solução ruim que você vê às vezes. As pessoas adicionam uma nova linha de cliente para cada loja que ele usa. Isso causará muitos problemas se, por exemplo, você quiser alterar o endereço dele, em muitos lugares. O banco de dados mais correto para fazer isso é criar uma "tabela de links". Não sei se essa é a palavra certa em inglês, mas de qualquer maneira. Essa é uma tabela que contém todos os dados específicos para a relação dos clientes com cada loja que ele usa. Então você tem três mesas. Um com lojas e todos os atributos pertencentes à loja, como quando está aberto e o número de telefone para entrar em contato. Então você tem a tabela de clientes, talvez com endereço e número de telefone para o cliente. Então você tem essa "tabela de links" que deve incluir um ID para a loja, o ID do cliente e talvez informações adicionais, como a frequência de visita a uma loja em particular, a distância da loja ou a linha que você está criando (mas é melhor criar distância e linha rapidamente quando você precisar). Então, com essa nova tabela, sua consulta seria semelhante a:

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;

Então você tem toda a flexibilidade. Digamos, por exemplo, que você adicione à sua tabela de links quantas vezes por mês o cliente visita essa loja. Então você pode escrever uma 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;

então você pode usar esse atributo, visits_per_month, para definir a espessura de suas linhas no mapa, ilustrando quantas visitas cada loja recebe.

Nicklas Avén
fonte
4

Uma maneira de fazer o digram spider no PostGIS é usando a função ST_MakeLine . Veja o exemplo abaixo:

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
fonte