Mais

Encontrando a Intersecção de Dois Círculos dados Lat / Lon e raio?


Estou tentando calcular a interseção de dois círculos na Terra com uma dada latitude, longitude e raio. Comecei calculando a interseção de dois círculos?

Esses círculos nunca terão mais de 100 km de diâmetro e normalmente estarão "próximos" um do outro, o que significa dois pontos de intersecção para o par de círculos.

Eu adicionei um comentário no código abaixo no local onde estou tendo o problema.

Originalmente, fiz essa pergunta no StackOverflow, mas por ser tão geoespacial, não obtive nenhuma resposta.

var circle1 = {lat: 37,673442, lon: -90,234036, r: 107,5}; var circle2 = {lat: 36,109997, lon: -90,953669, r: 145}; função findInterscetionOfTwoCircles (circle1, circle2) {var c1 = latLonToGeocentricCoords (circle1); var c2 = latLonToGeocentricCoords (círculo2); var r1 = convertRadius (circle1.r); var r2 = convertRadius (circle2.r); var c1dotc2 = calcularDotProduto (c1, c2); // É aqui que o problema está ocorrendo. // O valor de 'a' deve ser 0,9735030, mas estou recebendo 46,770178816522844. // Estou certo de que r1 e r2 estão corretos (correspondem aos valores da postagem original). Além disso, acredito que a função CalculeDotProduto está // correta, tornando c1dotc2 correto. Acho que eliminei // qualquer erro de Ordem de Operações. Talvez seja um problema de conversão // grau / radiano ou algo parecido? Eu tentei diferentes variações e agora // sem ideias. var a = (Math.cos (r1) - (Math.cos (r2) * c1dotc2)) / (1 - (c1dotc2 * c1dotc2)); var b = (Math.cos (r2) - (Math.cos (r1) * c1dotc2)) / (1 - (c1dotc2 * c1dotc2)); // -45,83805010474024, deve ser 0,0260194 var n = calculCrossProduct (c1, c2); var x0 = calcular Combinação Linear (a, b, c1, c2); var ndotn = calculeDotProduto (n, n); // var t = Math.sqrt ((1 - CalculeDotProduto (x0, x0)) / CalculeDotProduto (n, n)); // Terminar o algoritmo} função latLonToGeocentricCoords (circle) {var x = Math.cos (degToRad (circle.lon)) * Math.cos (degToRad (circle.lat)); var y = Math.sin (degToRad (circle.lon)) * Math.cos (degToRad (circle.lat)); var z = Math.sin (degToRad (circle.lat)); retornar {x: x, y: y, z: z}; } function geocentricCoordsToLatLon (x, y, z) {var lon = Math.atan2 (x, y) var lat = Math.atan2 (Math.sqrt ((x * x) + (y * y)), z) return { lat: lat, lon: lon}; } function convertRadius (radius) {// converte NM agora return degToRad (radius) / 60; } function calculDotProduct (input1, input2) {if (arguments.length! == 2) {throw new Error ('Você deve fornecer dois argumentos para este método.'); } if (Array.isArray (input1)! == Array.isArray (input2) || typeof input1! == typeof input2) {throw new Error ('As entradas devem ser do mesmo tipo.'); } var dotProduct = 0; if (Array.isArray (input1)) {// processa como arrays paralelos if (input1.length === input2.length) {throw new Error ('Os comprimentos de entrada devem ser iguais.'); } para (var i = 0, len = input1.length; i 

circle1 com r = 107,5 naut.mile e circle2 com r = 145 naut.mile se cruzam em pontos como mostrado na imagem:

Deve-se adotar um sistema de coordenadas projetadas (cartesianas) para este tipo de trabalho. Eu trabalhei na UTM-Zone 15 porque ambos os centros do círculo estão nesta zona. Se você tentar fazer isso manualmente / matematicamente usando o sistema de coordenadas polares, será muito complicado devido ao formato da terra imperfeito. Pode-se realizar cálculos mais precisos adotando o melhor sistema de projeção / coordenadas para esta área.