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

5
大家好 o/ 我知道这更像是一个数学问题而不是gmap问题,但我想有人肯定已经遇到过这个问题 =)
在我的地图上,我有圆圈(实际上我有几个圆圈,但这不改变问题),如下所示:http://code.google.com/intl/pt-BR/apis/maps/articles/mvcfun/step6.html 如何知道一个标记(具有纬度X和经度Y)是否在此圆内?
抱歉我的英语不好,我是巴西人 =p
5个回答

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");

2
如果(lat1, lon1)和(lat2, lon2)是您的两个点,R是围绕第一个点的圆的半径,则点之间的距离由haversine公式(或大圆距离)给出。但我认为对于您的问题,角度足够小,可以使用这个近似值:

Approximate Haversine formula

然后检查d^2是否小于半径R^2。但如果您的纬度和经度差异大于几度,您将需要使用完整的haversine公式。

我尝试了以下代码:if ((Math.pow((x - xc), 2) + Math.pow((y - yc), 2)) < Math.pow(R, 2)){ alert("Marker inside circle!"); }但总是输出 "Marker inside circle!"。 - Lucas Pelegrino
是的,绝对不要使用那个,它不适用于经纬度。事实上,我会从答案中将其删除。 - marshall.ward

1

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))来计算距离,并将其与圆半径进行比较。给定的代码经过一定的优化,以避免计算平方根。


我尝试了以下代码:var cX = 37.79457586821203, cY = -122.37932682031499, R = 50, X = 37.791591528681565, Y = -121.81147098535405; var distanceQuad = (X-cX)*(X-cX)+(Y-cY)*(Y-cY) if (distanceQuad<=(R*R)) { alert("Marker inside circle!");但是总是会弹出 "Marker inside circle" 的提示。 - Lucas Pelegrino
如果您关心的是线性距离,那么这个方法可以奏效。但是,原帖中提到的情况涉及大圆弧长度,需要使用haversine公式计算。 - andand

0

这比你想象的要容易得多。阅读此答案,其中包括一个可工作的jsFiddle示例。


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