Estou pesquisando neste site SE há algumas horas e ainda estou lutando para encontrar uma solução para minha pergunta. Meu objetivo é que, de certa forma, no OSM e na minha localização (coordenadas lat / lon), eu queira encontrar o local mais próximo (coordenadas lat / lon) nesse caminho. O ponto pode estar em qualquer lugar do caminho, não limitado aos pontos usados para definir o caminho.
Então, eu estou pensando no seguinte algoritmo:
- Caminho separado em arestas separadas, cada aresta conectando apenas dois pontos.
- Selecione a aresta mais próxima.
- Projete minha localização nessa extremidade.
Agora, existem muitas perguntas sobre o cálculo da distância entre um local e um caminho:
- Ponto WGS para distância do segmento de linha WGS (grande círculo)
- Cálculo da distância entre um ponto e uma linha virtual de dois lat / lngs
- Como aproximar ponto a segmento da distância na esfera?
Também uma pergunta muito semelhante, da qual não consigo acertar ou verificar os cálculos:
Há também algumas informações do Dr. Math sobre esse assunto. No entanto, parece que não consigo encontrar um algoritmo para calcular a localização na etapa 3. Como não toquei na álgebra (vetor) há um bom tempo, não entendo bem a lógica nessas respostas.
Alguém pode mostrar um algoritmo para fazer isso? Uma solução em qualquer linguagem de programação razoável está bem comigo.
Respostas:
O uso de um modelo esférico da Terra pode fornecer precisão adequada e levar a cálculos rápidos e simples.
Converta todas as coordenadas em coordenadas cartesianas centradas na terra (3D). Por exemplo, a fórmula
vai fazer. (Ele usa uma medida de distância na qual o raio da Terra é uma unidade, o que é conveniente.)
Escrevendo X0 = (x0, y0, z0) para o ponto inicial e X1 = (x1, y1, z1) para o ponto de destino, que define o grande círculo (desde que X0 seja distinto de X1 e os dois não sejam diametralmente opostos), seja U o produto cruzado normalizado de X0 e X1. Isso é calculado em duas etapas:
O comprimento de V é
A normalização estende V ao comprimento da unidade:
A distância 3D orientada entre qualquer ponto X = (x, y, z) e o plano desse grande círculo é apenas o produto escalar de X com Z, dado por
O ponto mais próximo em termos da distância na superfície da Terra é o que está mais próximo do plano: assim, ele tem o menor valor absoluto de d .
Esta figura mostra um grande círculo (em preto) determinado pelos dois pontos brancos e 2000 pontos aleatórios na esfera colorida e sombreada de acordo com sua distância 3D absoluta ao plano desse grande círculo; isto é, | d |.
Tendo encontrado um ponto mais próximo, projete-o no grande círculo, primeiro projetando-o no plano do grande círculo (em 3D) e depois estendendo-o radialmente para a superfície da Terra. A projeção apenas subtrai d * U:
A projeção radial simplesmente renormaliza X 'da mesma maneira que V foi renormalizado para U:
(Isso será problemático se | X '| = 0, que acontece quando o ponto mais próximo é um dos pólos do grande círculo. Inclua um teste no código para essa condição, se possível, e lide com ele separadamente, usando o sinal de d para identificar qual pólo.)
Se desejar, converta as coordenadas de X '' de volta para (lat, lon) usando as fórmulas usuais .
fonte