如何检查给定标记是否在区域内

时间:2011-02-17 09:46:25

标签: javascript math google-maps google-maps-api-3

大家好o / 我知道这比gmap更像是一个数学问题,但我想有人已经通过了这个=)

在我的地图中,我有圈子(实际上我有几个,但这不会改变问题),如下所示:http://code.google.com/intl/pt-BR/apis/maps/articles/mvcfun/step6.html

我如何知道标记(纬度X和经度Y)是否在此圆圈内?

抱歉英语不好,我是brazillian = p

5 个答案:

答案 0 :(得分:8)

在Google Maps JavaScript API v3中,您可以使用几何库。要启用它,您必须稍微更改脚本URL:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&libraries=geometry"></script>

该库包含用于计算球体上几何数据的实用函数。您可以利用它来计算由latLngs给出的两个点的距离:

var distanceInMetres = google.maps.geometry.spherical.computeDistanceBetween(latLngCircleCenter, latLngPoint);

现在您可以轻松检查点是否在圆圈内(假设R以米为单位):

if(distanceInMetres < R)
   alert("in the circle");

答案 1 :(得分:2)

如果(lat1,lon1)和(lat2,lon2)是你的两个点,R是你的第一个点周围的圆的半径,那么点之间的距离由haversine formula(或者Great-circle distance)。但我相信,对于你的问题,角度足够小,可以使用这种近似值:

Approximate Haversine formula

然后检查d ^ 2是否小于半径R ^ 2.

但是如果您的纬度和经度差异大于几度,您将需要使用完整的半正弦公式。

答案 2 :(得分:1)

我建议你阅读http://www.movable-type.co.uk/scripts/latlong.html。它为这种计算提供了许多算法。它包含用于计算的JavaScript代码。

答案 3 :(得分:0)

基本上,如果您有圆心(cX,cY)和半径R的坐标,以及X,Y处的某些标记,您可以进行以下计算:

var distanceQuad = (X-cX)*(X-cX)+(Y-cY)*(Y-cY)
if (distanceQuad<=(R*R))
{
 alert("Marker inside circle!");
}

这是来自三角学。您将距离计算为sqrt(sqr(deltaX)+ sqr(deltaY))并将其与圆半径进行比较。鉴于代码有点优化以摆脱计算平方根。

答案 4 :(得分:0)

这比你期望的要容易得多。阅读this answer,包括一个有效的jsFiddle示例。