我在android GoogleMap
项目中工作。我有用户的Geo
位置(经度和纬度)。我想计算用户在5公里(圆圈)内的区域坐标,以便我可以从用户周围的数据库中过滤掉这些位置。有什么建议?
答案 0 :(得分:2)
纬度和经度以度为单位,因此您需要使用简单的平面地球投影。 重要提示:下面公式中的所有纬度/经度值都应该是弧度,而不是度数!使用扁平地球就足够了,因为半径是5km。平坦的地球投影是:
var R = 6371; // km
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2);
var y = (lat2-lat1);
var d = Math.sqrt(x*x + y*y) * R;
现在,lat1 / lon1是参考位置,在您的情况下,是用户的位置。 Lat2 / lon2将是您正在测试的点。变量'd'是距离。由于'R'以km为单位,因此'd'将以km为单位。
如果'd'小于5(即小于5km),则该点位于圆内。
答案 1 :(得分:0)
第一个答案(TreyA)似乎向您展示了Haversine功能的精简版。下面是JS代码我给人们实现Haversine函数并将十进制值转换为弧度。
// Convert Degress to Radians
function Deg2Rad( deg ) {
return deg * Math.PI / 180;
}
// Get Distance between two lat/lng points using the Haversine function
// First published by Roger Sinnott in Sky & Telescope magazine in 1984 (“Virtues of the Haversine”)
//
function Haversine(lat1,lon1,lat2,lon2)
{
var R = 6372.8; // Earth Radius in Kilometers
var dLat = Deg2Rad(lat2-lat1);
var dLon = Deg2Rad(lon2-lon1);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Deg2Rad(lat1)) * Math.cos(Deg2Rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
// Return Distance in Kilometers
return d;
}
这是直接下载文件的链接: http://www.opengeocode.org/download/haversine/haversine.js
答案 2 :(得分:-1)
您可以通过以下方式获取圆周的点(坐标):
(x - x_o)^ 2 +(y - y_o)^ 2 = r ^ 2
其中x_0和y_0是用户的坐标,r是您要考虑的半径,您的点是x和y。
因为您必须将地点的坐标与圆的坐标进行比较,您可以将X和Y作为地点坐标,看看它们是否解决了这个问题:
(X - x_o)^ 2 +(Y - y_o)^ 2< = r ^ 2