好的非常自我解释。我正在使用谷歌地图,我试图找出一个纬度,长点是否在半径为x的范围内(x由用户选择)。
边界框不适用于此。我已经尝试使用以下代码:
distlatLng = new google.maps.LatLng(dist.latlng[0],dist.latlng[1]);
var latLngBounds = circle.getBounds();
if(latLngBounds.contains(distlatLng)){
dropPins(distlatLng,dist.f_addr);
}
这仍然会导致标记位于圆圈之外。
我猜这是一些需要计算曲率或面积的简单数学,但我不知道从哪里开始。有什么建议吗?
答案 0 :(得分:16)
答案 1 :(得分:10)
不幸的是毕达哥拉斯在球体上没有任何帮助。因此Stuart Beard的回答是不正确的;经度差异与米数没有固定的比率,但取决于纬度。
正确的方法是使用大圆距离的公式。假设球形地球,这是一个很好的近似(用C ++表示):
/** Find the great-circle distance in metres, assuming a spherical earth, between two lat-long points in degrees. */
inline double GreatCircleDistanceInMeters(double aLong1,double aLat1,double aLong2,double aLat2)
{
aLong1 *= KDegreesToRadiansDouble;
aLat1 *= KDegreesToRadiansDouble;
aLong2 *= KDegreesToRadiansDouble;
aLat2 *= KDegreesToRadiansDouble;
double cos_angle = sin(aLat1) * sin(aLat2) + cos(aLat1) * cos(aLat2) * cos(aLong2 - aLong1);
/*
Inaccurate trig functions can cause cos_angle to be a tiny amount
greater than 1 if the two positions are very close. That in turn causes
acos to give a domain error and return the special floating point value
-1.#IND000000000000, meaning 'indefinite'. Observed on VS2008 on 64-bit Windows.
*/
if (cos_angle >= 1)
return 0;
double angle = acos(cos_angle);
return angle * KEquatorialRadiusInMetres;
}
,其中
const double KPiDouble = 3.141592654;
const double KDegreesToRadiansDouble = KPiDouble / 180.0;
和
/**
A constant to convert radians to metres for the Mercator and other projections.
It is the semi-major axis (equatorial radius) used by the WGS 84 datum (see http://en.wikipedia.org/wiki/WGS84).
*/
const int32 KEquatorialRadiusInMetres = 6378137;
答案 2 :(得分:5)
使用Google Maps API几何库计算圆心与标记之间的距离,然后将其与半径进行比较。
var pointIsInsideCircle = google.maps.geometry.spherical.computeDistanceBetween(circle.getCenter(), point) <= circle.getRadius();
答案 3 :(得分:5)
这很简单。您只需计算中心与给定点之间的距离,并将其与半径进行比较。您可以获取帮助来计算来自 here
的两个拉特之间的距离答案 4 :(得分:4)
以下代码适用于我:我的标记不能拖到圆圈之外,而是只悬挂在其边缘(任何方向),并保留最后一个有效位置。
该函数是标记'drag'事件的事件处理程序。
_markerDragged : function() {
var latLng = this.marker.getPosition();
var center = this.circle.getCenter();
var radius = this.circle.getRadius();
if (this.circleBounds.contains(latLng) &&
(google.maps.geometry.spherical.computeDistanceBetween(latLng, center) <= radius)) {
this.lastMarkerPos = latLng;
this._geocodePosition(latLng);
} else {
// Prevent dragging marker outside circle
// see (comments of) http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/
// see http://www.mvjantzen.com/blog/?p=3190 and source code of http://mvjantzen.com/cabi/trips4q2012.html
this.marker.setPosition(this.lastMarkerPos);
}
},
感谢http://unserkaiser.com/code/google-maps-marker-check-if-in-circle/ 和http://www.mvjantzen.com/blog/?p=3190。
答案 5 :(得分:1)
我真的有点傻。考虑一下,我们可以使用Pythagorus定理。
我们距离一个点(X英里),两个纬度和两个经度有一个最大距离。如果我们使用这些形成三角形,那么我们可以求解距离点的距离。
所以说我们知道point1
坐标lat1,lng1
是圆的中心,point2
坐标lat2,lng2
是我们试图确定的圆点或不。
我们使用由point1
和point2
确定的点形成直角三角形。这个,point3
会有坐标lat1,lng2
或lat2,lng1
(无关紧要)。然后,我们计算差异(或者如果您愿意)距离 - latDiff = lat2-lat1
和lngDiff = lng2-lng1
dist=sqrt(lngDiff^2+latDiff^2)
。
我们必须将所有内容翻译成米,以便它可以与谷歌地图一起正常运行,因此里程乘以1609(大约),纬度/经度乘以111000(大约)。这不完全准确,但它做得很好。
希望一切都有意义。