Preciso calcular uma caixa ou círculo delimitador para uma determinada latitude WGS84 e longitude e distância WGS84, mas não tenho ideia de por onde começar!
A distância desde o início Lat / Lon seria 10 km ou menos.
Seria possível alguém me dar algumas dicas / Exemplo de como fazer isso
Respostas:
WGS-o que? WGS-84? Dependendo da precisão de que você precisa, talvez você precise saber muito mais informações - meu palpite é que foi por isso que você recebeu votos negativos, apesar de ninguém se importar em deixar um comentário dizendo o porquê.
Aqui estão duas maneiras:
Impreciso, mas provavelmente "bom o suficiente"
Um grau de latitude é de aproximadamente 10001.965729 / 90 quilômetros (distância do equador ao polo, dividido por noventa graus) ou 111.113 quilômetros, usando o dado WGS-84. Esta é uma aproximação devido à forma da Terra e porque as distâncias mudam à medida que você se aproxima dos pólos (uma razão para usar a latitude, não a longitude - eventualmente a distância de um grau de longitude é zero!) A Terra também não é perfeita esfera. Ambas são razões para usar uma abordagem mais complexa baseada em projeção e em dados, na minha segunda resposta.
Isso está usando graus decimais, não graus / minutos / segundos.
Portanto, sua caixa delimitadora será seu ponto, mais e menos 0,08999 graus. Como alternativa, você pode usar esse número como um raio, fornecendo um círculo delimitador .
Qualquer pessoa GIS lendo isso estremecerá. Porém, será mais preciso, dependendo de onde você está no mundo. Por um raio de 10 km, tudo bem.
Muito mais preciso, mas mais código
Use uma biblioteca de projeção e especifique seu dado, etc. Eu recomendo o Proj4; é amplamente usado para que o Google retorne muitos resultados para perguntas sobre o assunto, e existem invólucros Delphi . Se você tiver problemas para usá-lo, poste outra pergunta aqui no SO - está fora do escopo desta. O site do Proj4 tem exemplos usando as APIs básicas e, embora estejam em C, devem ser facilmente traduzíveis. A referência da API é o melhor lugar para começar, seguida pelas perguntas frequentes .
Eu usaria o WGS-84 como um dado básico (representação da Terra), a menos que você saiba um específico que deseja usar ou que foi usado para criar suas coordenadas. É comumente usado e bastante preciso.
Se sua posição for do Google Maps (por exemplo), especifique uma projeção Mercator. Você pode usar outra projeção ou usar, por exemplo, coordenadas UTMem vez de latitude e longitude, dependendo da fonte dos seus dados e se você deseja alta precisão para uma pequena área local. (O UTM tem várias zonas, todas as quais alteram a distorção, de modo que, dentro dessa zona, é altamente preciso; se você usar uma zona para coordenadas fora dela, a distorção aumentará bastante à medida que você se afasta. Se você visualizar toda a Terra projetada a partir de uma zona, pode ser irreconhecível. Mas dentro de uma zona, as traduções UTM serão as melhores possíveis. As coordenadas são geralmente especificadas em metros, e não em graus, por isso pode ser mais útil para você, já que você precisa de 10 km raio. 10km é fácil dentro de uma única zona, você só precisa escolher a zona apropriada com base na coordenada central. A única parte complicada é quando você se aproxima de uma borda: é uma situação comum e está bem, apenasconsistente em como você escolhe qual deles usar . O Proj4 também permite traduzir projeções, para que você possa ir do Mercator WGS-84 lat / long para uma zona UTM n , por exemplo, ou para e de duas zonas UTM.)
fonte
Supondo que você queira fazer uma consulta em um banco de dados, provavelmente desejará fazer uma pesquisa rápida (imprecisa) e depois calcular exatamente a distância para os locais resultantes. Esse é o seu cenário?
A seguinte função (em PHP, desculpe) calculará aproximadamente as diferenças de latitude e longitude. Essas diferenças dependem da latitude do seu ponto de pesquisa. Use-os (com uma pequena tolerância) para fazer uma pesquisa rápida no banco de dados. A caixa pode ser calculada simplesmente com latitude + -deltaLatitude e longitude + -deltaLongitude.
Com a fórmula haversine , você pode calcular distâncias na esfera. Use-o para cada um dos locais encontrados, para obter a distância "exata". Dessa forma, você pode testar se os dois locais estão dentro de um determinado raio (um círculo em vez da caixa).
fonte
Para testar se um lat / lon está dentro ou fora de um círculo delimitador, você precisa calcular a distância entre o lat / lon de referência e o ponto lat / lon que deseja testar. Como sua distância é de 10 km ou menos, eu tentaria usar a aproximação Equiretangular para obter a distância em vez de Haversine por causa da simplicidade. Para obter a distância em km:
Nota importante: lat / lon nesta fórmula está em radianos e não em graus. O valor típico de EarthRadius é 6371 km, que retornará a distância em unidades de km. Agora é um teste simples se a sua distância está dentro ou fora do círculo. Se um círculo delimitador funcionar, eu aceitaria isso.
Para um retângulo delimitador, eu assumiria que você deseja que o retângulo seja definido paralelamente ao equador. Em seguida, eu calculava os cantos da caixa delimitadora usando cálculos de alcance / rolamento (rolamentos sendo 45 graus, 135 graus, 225 graus e 315 graus). A partir daí, eu assumiria que você não está em volta dos polos e usaria um ponto no teste de polígono.
fonte
Abaixo está o código T-SQL que eu uso para criar a caixa delimitadora no SQL-Server 2012. No meu caso, recebo valores decimais para Lat, Long. Eu uso isso para limitar rapidamente o número de linhas antes de usar a
STDistance
função SQL para verificar se os resultados estão realmente a uma distância específica. As funções geográficas são muito caras no SQL Server, portanto, ao criar uma caixa delimitadora, sou capaz de reduzir bastante o número de vezes que ele precisa ser executado.fonte