Eu dei uma localização definida por latitude e longitude. Agora eu quero calcular uma caixa delimitadora dentro de, por exemplo, 10 quilômetros daquele ponto.
A caixa delimitadora deve ser definida como latmin, lngmin e latmax, lngmax.
Preciso disso para usar a API panoramio .
Alguém conhece a fórmula de como obter esses pontos?
Edit: Gente, estou procurando uma fórmula / função que leva lat & lng como entrada e retorna uma caixa delimitadora como latmin & lngmin e latmax & latmin. Mysql, php, c #, javascript é bom, mas também o pseudocódigo deve funcionar.
Edit: Não estou procurando uma solução que me mostre a distância de 2 pontos
Respostas:
Eu sugiro aproximar localmente a superfície da Terra como uma esfera com raio dado pelo elipsóide WGS84 na latitude dada. Suspeito que o cálculo exato de latMin e latMax exigiria funções elípticas e não produziria um aumento apreciável na precisão (o WGS84 é em si uma aproximação).
Minha implementação é a seguinte (escrita em Python; não testei):
EDITAR: o código a seguir converte (graus, primos, segundos) em graus + frações de um grau e vice-versa (não testado):
fonte
Escrevi um artigo sobre como encontrar as coordenadas delimitadoras:
http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates
O artigo explica as fórmulas e também fornece uma implementação Java. (Também mostra por que a fórmula de Federico para a longitude mín. / Máx. É imprecisa.)
fonte
public override string ToString()
:, é muito ruim substituir esse método global apenas para um propósito, melhor apenas adicionar outro método, em seguida, substituir o método padrão, que pode ser usado em outras partes do aplicativo, não para o gis exato ...Aqui, converti a resposta de Federico A. Ramponi para C # para qualquer pessoa interessada:
fonte
Escrevi uma função JavaScript que retorna as quatro coordenadas de uma caixa delimitadora quadrada, dadas uma distância e um par de coordenadas:
fonte
minLon = void 0;
emaxLon = MAX_LON;
ele ainda não funciona.centerPoint
argumento é uma matriz que consiste em duas coordenadas. Por exemplo,getBoundingBox([42.2, 34.5], 50)
-void 0
é a saída do CoffeeScript para "indefinido" e não afetará a capacidade de execução dos códigos.degLat.degToRad
não é uma funçãodegToRad
erros "não é uma função". Nunca descobri o porquê, masNumber.prototype.
não é uma boa ideia para uma função de utilidade como essa, então eu as converti em funções locais normais. Também é importante observar que a caixa retornada é [LNG, LAT, LNG, LAT] em vez de [LAT, LNG, LAT, LNG]. Modifiquei a função return quando usei isso para evitar confusão.Como eu precisava de uma estimativa aproximada, para filtrar alguns documentos desnecessários em uma consulta de pesquisa elástica, empreguei a fórmula abaixo:
N = kms necessários do local fornecido. Para o seu caso N = 10
Não é preciso, mas prático.
fonte
Você está procurando uma fórmula elipsóide.
O melhor lugar que encontrei para começar a codificar é baseado na biblioteca Geo :: Ellipsoid do CPAN. Ele fornece uma linha de base para criar seus testes e comparar seus resultados com os resultados. Usei-o como base para uma biblioteca semelhante para PHP em meu empregador anterior.
Geo :: Elipsóide
Dê uma olhada no
location
método. Ligue duas vezes e você tem sua bbox.Você não postou o idioma que estava usando. Pode já haver uma biblioteca de geocodificação disponível para você.
Ah, e se você ainda não percebeu, o Google Maps usa o elipsóide WGS84.
fonte
Ilustração da explicação excelente de @Jan Philip Matuschek. (Vote a favor da resposta dele, não esta; estou adicionando isso porque demorei um pouco para entender a resposta original)
A técnica da caixa delimitadora para otimizar a localização dos vizinhos mais próximos precisaria derivar os pares de latitude e longitude mínimo e máximo para um ponto P à distância d. Todos os pontos fora deles estão definitivamente a uma distância maior que d do ponto. Uma coisa a se notar aqui é o cálculo da latitude de interseção, conforme destacado na explicação de Jan Philip Matuschek. A latitude de interseção não está na latitude do ponto P, mas ligeiramente deslocada dele. Esta é uma parte frequentemente perdida, mas importante na determinação da longitude limite mínima e máxima correta para o ponto P para a distância d. Isso também é útil na verificação.
A distância haversine entre (latitude de intersecção, longitude alta) e (latitude, longitude) de P é igual à distância d.
Python gist aqui https://gist.github.com/alexcpn/f95ae83a7ee0293a5225
fonte
Aqui está uma implementação simples usando javascript que é baseada na conversão do grau de latitude para kms where
1 degree latitude ~ 111.2 km
.Estou calculando os limites do mapa a partir de uma determinada latitude e longitude com largura de 10 km.
fonte
Adaptei um script PHP que descobri para fazer exatamente isso. Você pode usá-lo para encontrar os cantos de uma caixa em torno de um ponto (digamos, 20 km fora). Meu exemplo específico é para a API do Google Maps:
http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers
fonte
Eu estava trabalhando no problema da caixa delimitadora como uma questão secundária para encontrar todos os pontos dentro do raio SrcRad de um ponto LAT, LONG estático. Existem alguns cálculos que usam
para calcular os limites de longitude, mas descobri que isso não dá todas as respostas necessárias. Porque o que você realmente quer fazer é
Eu sei, eu sei que a resposta deveria ser a mesma, mas descobri que não era. Parecia que por não ter certeza de que estava fazendo o (SRCrad / RadEarth) primeiro e depois dividindo pela parte Cos, eu estava deixando de fora alguns pontos de localização.
Depois de obter todos os pontos da caixa delimitadora, se você tiver uma função que calcula a distância ponto a ponto dada lat, é fácil obter apenas os pontos que estão a um determinado raio de distância do ponto fixo. Aqui está o que eu fiz. Eu sei que foram necessários alguns passos extras, mas me ajudaram
fonte
É muito simples ir para o site panoramio e, em seguida, abrir o mapa do mundo no site panoramio. Em seguida, vá para o local especificado, que exige latitude e longitude.
Então você encontrou latitude e longitude na barra de endereço, por exemplo, neste endereço.
http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all
lt = 32,739485 => latitude ln = 70,491211 => longitude
este widget da API JavaScript Panoramio cria uma caixa delimitadora em torno de um par lat / long e, em seguida, retorna todas as fotos com esses limites.
Outro tipo de widget da API JavaScript Panoramio em que você também pode alterar a cor de fundo com exemplo e código está aqui .
Não aparece no modo de composição. Mostra após a publicação.
fonte
Aqui, converti a resposta de Federico A. Ramponi para PHP, se alguém estiver interessado:
fonte
Obrigado @Fedrico A. pela implementação do Phyton, eu o transferi para uma classe de categoria Objective C. Aqui está:
Eu testei e parece estar funcionando bem. Struct BoundsLocation deve ser substituído por uma classe, usei-a apenas para compartilhá-la aqui.
fonte
Todas as respostas acima estão apenas parcialmente corretas . Especialmente em regiões como a Austrália, eles sempre incluem a pole e calculam um retângulo muito grande mesmo para 10kms.
Especialmente o algoritmo de Jan Philip Matuschek em http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex incluía um retângulo muito grande de (-37, -90, -180, 180) para quase todos os pontos na Austrália. Isso atinge um grande número de usuários no banco de dados e a distância deve ser calculada para todos os usuários em quase metade do país.
Eu descobri que o Drupal API Earth Algorithm do Rochester Institute of Technology funciona melhor em torno do pólo, bem como em outros lugares, e é muito mais fácil de implementar.
https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54
Use
earth_latitude_range
eearth_longitude_range
do algoritmo acima para calcular o retângulo delimitadorE use a fórmula de cálculo de distância documentada pelo google maps para calcular a distância
https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php
Para pesquisar por quilômetros em vez de milhas, substitua 3959 por 6371. Para (Lat, Lng) = (37, -122) e uma tabela de Marcadores com colunas lat e lng , a fórmula é:
Leia minha resposta detalhada em https://stackoverflow.com/a/45950426/5076414
fonte
Aqui está a resposta de Federico Ramponi em Go. Nota: sem verificação de erros :(
fonte