检查经纬度是否在Google地图的圆形区域内

25

以下是我想要的期望结果:

在此输入图像描述

我想知道的是:

我使用中心点纬度和经度,以及其周围的半径创建了一个圆。现在,我想知道如何检查(计算)给定的纬度和经度是否位于该区域内或外。如果您能够提供JavaScript代码示例,我将不胜感激。我正在使用Google Maps API V3。

我找到了这个函数,但对我来说没有按预期工作:

function arePointsNear(checkPoint, centerPoint) {
    var sw = new google.maps.LatLng(centerPoint.lat() - 0.005, centerPoint.lng() - 0.005);
    var ne = new google.maps.LatLng(centerPoint.lat() + 0.005, centerPoint.lng() + 0.005);
    var bounds = new google.maps.LatLngBounds(sw, ne);
    if (bounds.contains (checkPoint)){
        return true;
    }
    return false;
}

任何帮助都将是极好的...提前致谢!


一个圆有一个恒定的半径。如果你的圆有10公里的半径,检查点是否在距离圆心10公里以内。如果是,则表示该点在圆内。 - MrUpsidown
2个回答

62

对于这样短的距离,并且当精度不必准确到厘米时,您可以将地球表面视为平坦的。在中心点的纬度上计算从度数到千米的转换,然后可以使用勾股定理来得到距离:

function arePointsNear(checkPoint, centerPoint, km) {
  var ky = 40000 / 360;
  var kx = Math.cos(Math.PI * centerPoint.lat / 180.0) * ky;
  var dx = Math.abs(centerPoint.lng - checkPoint.lng) * kx;
  var dy = Math.abs(centerPoint.lat - checkPoint.lat) * ky;
  return Math.sqrt(dx * dx + dy * dy) <= km;
}

示例:http://jsfiddle.net/Guffa/57gQa/

注意:该代码未考虑传递0/360经度的情况。如果是这种情况,您需要先将经度归一化。


2
非常感谢你,伙计。它正在工作并显示我所寻找的结果。你救了我的命!老实说,我不擅长数学,所以我正在寻求另一个帮助,即如果你可以帮我理解像var ky,kx这样的值,或者如果你可以注释代码,那就太好了。在JSfiddle示例中,你将10作为km,但它真的是作为km还是 - colourtheweb
7
kykx 值分别代表纬度和经度每度对应的公里数。随着纬线距离越来越近,kx 值会变小,因为每度之间的距离会更接近。在示例中两个城市之间的距离接近91公里,而阈值10实际上是以公里为单位而不是米。你可以查看这个链接来了解距离和使用阈值90和91公里的情况:http://jsfiddle.net/Guffa/57gQa/1/ - Guffa
1
感谢您的时间和解释。非常感激 :-) - colourtheweb
1
很晚才问这个问题,因为已经过去了3年。我正在向某人解释,并想要澄清我的疑惑。请问你能告诉我我们在计算kxdxdy时具体是在计算什么吗?另外,你是否为X轴和Y轴命名了变量kx、ky、dx和dy?提前感谢你的回答,期待着听到你的答案。 - colourtheweb
5
哇,你太棒了!人类因为你提供的光芒而微笑。 - moeiscool
Maps API具有几何函数来计算距离。你真的不需要那个。 - MrUpsidown

1

你只需要一点球面三角学知识。

首先,你需要计算由你的距离(L = 10 公里)所夹的的中心角度数theta。

L = theta*r

其中r是地球的半径(6378.135公里)

现在,如果兴趣点与您的中心点之间的中心角小于θ,则它位于您的圆内。将此角度称为θp

这是一个说明球面三角形的图示: 球面三角形图像 http://en.wikipedia.org/wiki/File:Spherical_trigonometry_basic_triangle.svg

编辑-抱歉,显然我不知道如何链接到图像??这是URL: http://en.wikipedia.org/wiki/File:Spherical_trigonometry_basic_triangle.svg

在这种情况下,球面三角形的两条边(称为a、b)分别是点的经度差和纬度差。包含的角度C为90度(经线和纬线之间的夹角)。

球面三角余弦定理为:

cos(c) = cos(a)*cos(b) + sin(a)*sin(b)*cos(C)

c是您的两个点之间的中心角,我们之前称之为θp

编辑 - 与其他建议一样,此解决方案不仅限于相对于地球半径较小的距离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接