Mais

Como calculo a distância de Manhattan com PostGIS?


Estou usando a função ST_Distance para calcular a distância entre duas geometrias (uma estação de trem e um edifício). Como sei que todos os edifícios e todas as estações de trem estão em Chicago, que tem uma grade de ruas excelente / completa, gostaria de usar Manhattan (ou táxi) distância.

A fórmula genérica para isso é a diferença em X mais a diferença em Y, então Abs (X1-X2) + Abs (Y1-Y2).

Que consulta PostgreSQL faria isso funcionar?


Estou respondendo à minha própria pergunta com uma proposta de consulta.

select *, ABS (x_permit-x_station) + ABS (y_permit-y_station) como manhattan FROM (SELECT longname AS NAME, linhas AS metadados, T .slug, ST_Distance (T .geom, ST_Transform (P .geometry, 3435)) AS distância , ST_X (ST_Transform (p.geometry, 3435)) como x_permit, ST_Y (ST_Transform (p.geometry, 3435)) como y_permit, ST_X (t.geom) como x_station, ST_Y (t.geom) como y_station FROM permite P, estações_cta T ONDE P .permit_ = '100533644' ORDENAR POR LIMITE de distância 2) como foo

Isso resulta no seguinte com algumas colunas cortadas:

Kedzie-Ravenswood Brown Line 3738.52830193659 3796.29623843171 Addison-O'Hare Blue Line 4105.37381385087 5790.20002649655

A primeira coluna numerada é a distância (em pés, porque estou usando EPSG 3435) calculada pela função ST_Distance PostGIS, e a segunda coluna numerada é o resultado da fórmula de distância de Manhattan.

Verifiquei o segundo resultado, obtendo a distância a pé do Google Maps entre a estação CTA Addison Blue Line e o prédio na 3226 W Belle Plaine Ave (anotado como '100533644' na consulta). O Google Maps gerou uma rota de caminhada de 1,1 milhas, enquanto o resultado do Postgres foi de 5.790 pés = 1,09 milhas. A diferença é aceitável para meus propósitos.


Acho que também encontrei uma solução um pouco mais elegante que usa trigonometria e aST_Azimuthfunção e encapsulou em uma função agradável:

CRIAR OU SUBSTITUIR A FUNÇÃO JZ_TaxiCab (geometria p1, geometria p2) RETORNA REAL AS $$ DECLARE az REAL; h REAL; BEGIN az: = ST_Azimuth (p1, p2); / * Converter para geografia para obter o resultado em metros * / h: = ST_Distance (p1 :: geografia, p2 :: geografia); / * Nota: temos que pegar abs () porque os valores retornados por podem ser positivos ou negativos. Nós realmente não nos importamos necessariamente com o ponto de referência, pois será um triângulo retângulo. * / RETURN h * abs (sin (az)) + h * abs (cos (az)); FIM; $$ LANGUAGE plpgsql

Próximo Próximo Pesquisa de Vizinho Mais Próximo com PostGIS

PostgreSQL: Documentação: 10: 7.8. COM Consultas (expressões de tabela comuns)

  • https://www.postgresql.org/docs/10/static/queries-with.html#QUERIES-WITH-SELECT
  • WITH fornece uma maneira de escrever instruções auxiliares para uso em uma consulta maior. Essas instruções, frequentemente chamadas de Expressões de Tabela Comuns ou CTEs, podem ser consideradas como definições de tabelas temporárias que existem apenas para uma consulta. Cada instrução auxiliar em uma cláusula WITH pode ser SELECT, INSERT, UPDATE ou DELETE e a própria cláusula WITH é anexada a uma instrução primária que também pode ser SELECT, INSERT, UPDATE ou DELETE.

Calcule a distância mínima entre os pontos no PostGIS - Geographic Information Systems Stack Exchange

  • ST_Distance - Para tipo de geometria Retorna a distância cartesiana 2D entre duas geometrias em unidades projetadas (com base na referência espacial). Para o tipo de geografia, o padrão é retornar a distância geodésica mínima entre duas geografias em metros.

Boundless: Introduction to PostGIS: 27. Pesquisa de Vizinhos Mais Próximos

Boundless: Introdução ao PostGIS: 29. Construções Geométricas Avançadas


Próximo Próximo Pesquisa de Vizinho Mais Próximo com PostGIS

PostgreSQL: Documentação: 10: 7.8. COM Consultas (expressões de tabela comuns)

  • https://www.postgresql.org/docs/10/static/queries-with.html#QUERIES-WITH-SELECT
  • WITH fornece uma maneira de escrever instruções auxiliares para uso em uma consulta maior. Essas instruções, frequentemente chamadas de Expressões de Tabela Comuns ou CTEs, podem ser consideradas como definições de tabelas temporárias que existem apenas para uma consulta. Cada instrução auxiliar em uma cláusula WITH pode ser SELECT, INSERT, UPDATE ou DELETE e a própria cláusula WITH é anexada a uma instrução primária que também pode ser SELECT, INSERT, UPDATE ou DELETE.

Calcule a distância mínima entre os pontos no PostGIS - Geographic Information Systems Stack Exchange

  • ST_Distance - Para tipo de geometria Retorna a distância cartesiana 2D entre duas geometrias em unidades projetadas (com base na referência espacial). Para o tipo de geografia, o padrão é retornar a distância geodésica mínima entre duas geografias em metros.

Boundless: Introduction to PostGIS: 27. Pesquisa de Vizinhos Mais Próximos

Boundless: Introdução ao PostGIS: 29. Construções Geométricas Avançadas


Assista o vídeo: Webinar Jak przejść na PostgreSQL i PostGIS z komercyjnych baz danych? (Outubro 2021).