8

我正在使用谷歌地图中的纬度/经度坐标。

我有两行:

  • A 线:48.31508162629726、-2.591741396838972 至 48.40216156645915、-2.2218462112093404
  • B 线:48.383816077371215、-2.274292940053768 至 48.66103546935337、-1.7066197241571377

然后我使用以下公式找到它们交叉的点。

var XAsum = A.LngStart - A.LngEnd;
var XBsum = B.LngStart - B.LngEnd;
var YAsum = A.LatStart - A.LatEnd;
var YBsum = B.LatStart - B.LatEnd;

var LineDenominator = XAsum * YBsum - YAsum * XBsum;
if(LineDenominator == 0.0)
    return false;

var a = A.LngStart * A.LatEnd - A.LatStart * A.LngEnd;
var b = B.LngStart * B.LatEnd - B.LatStart * B.LngEnd;

var x = (a * XBsum - b * XAsum) / LineDenominator;
var y = (a * YBsum - b * YAsum) / LineDenominator;

这告诉我这些线确实交叉并返回 x 和 y 值。

但是,当我绘制返回的点时,它与真正的交点有偏移(不多)。

有没有更好的和一样快的算法我可以使用它来返回正确的交点?

它需要快速,因为我正在迭代大量行(~1000)。

编辑:请注意,这给了我大约 7.5 米的误差偏移

4

1 回答 1

4

我假设您使用的算法是在笛卡尔坐标系(即平面)上查找线交点的算法。不幸的是,地球不是平面(甚至不是球体),因此使用该算法会引入错误。Google 地图使用椭球体(特别是 WGS84)来近似地球表面,因此您需要一种算法来查找椭球体上弧的交点。

此页面可能包含一些有用的信息: http: //mathhelpforum.com/calculus/90196-point-intersection-two-lines.html

于 2012-07-25T16:49:40.417 回答