谷歌地图两个圆圈交叉点

yaz*_*pro 7 javascript algorithm geometry google-maps google-maps-api-3

有没有一种简单的方法来获取lat/ lng交点(如果可用)两个圆圈谷歌地图API V3?或者我应该用艰难的方式去?

编辑:在我的问题中,圆圈总是具有相同的半径,以防止解决方案更容易.

MBo*_*MBo 11

是的,对于相等的圆,可以详细说明:
让第一个圆心为A点,第二个圆心为F,中点为C,交点为B,D.ABC是直角球面三角形,直角C.

在此输入图像描述

我们想要找到角度A - 这是从AF方向的偏离角度.球面三角学(纳皮尔对右球形三角形的规则)给出了公式:

cos(A)= tg(AC) * ctg(AB) 其中一个符号表示球面角度,双符号表示大圆弧角度(AB,AC).我们可以看到AB =圆半径(当然是弧度),AC =大圆弧上A和F之间的半距离.要查找AC(和其他值) - 我将使用此优秀页面中的代码

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();

var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
Run Code Online (Sandbox Code Playgroud)

和我们的

AC = c/2
Run Code Online (Sandbox Code Playgroud)

如果给出圆半径Rd是千米,那么

AB = Rd / R = Rd / 6371
Run Code Online (Sandbox Code Playgroud)

现在我们可以找到角度

A = arccos(tg(AC) * ctg(AB))
Run Code Online (Sandbox Code Playgroud)

开始轴承(AF方向):

var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1)*Math.sin(lat2) -
        Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
var brng = Math.atan2(y, x);
Run Code Online (Sandbox Code Playgroud)

交叉点的方位:

B_bearing = brng - A
D_bearing = brng + A
Run Code Online (Sandbox Code Playgroud)

交点的坐标:

var latB = Math.asin( Math.sin(lat1)*Math.cos(Rd/R) + 
              Math.cos(lat1)*Math.sin(Rd/R)*Math.cos(B_bearing) );
var lonB = lon1.toRad() + Math.atan2(Math.sin(B_bearing)*Math.sin(Rd/R)*Math.cos(lat1), 
                     Math.cos(Rd/R)-Math.sin(lat1)*Math.sin(lat2));
Run Code Online (Sandbox Code Playgroud)

和D_bearing相同

latB,lonB是弧度