如何计算地图上的线段交叉点

时间:2012-07-25 12:44:41

标签: map line gis intersection

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

我有两行:

  • 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米的错误偏移

1 个答案:

答案 0 :(得分:4)

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

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