计算指定区域的纬度经度范围

时间:2014-01-05 16:43:20

标签: android google-maps geolocation latitude-longitude

我在android GoogleMap项目中工作。我有用户的Geo位置(经度和纬度)。我想计算用户在5公里(圆圈)内的区域坐标,以便我可以从用户周围的数据库中过滤掉这些位置。有什么建议?

3 个答案:

答案 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),则该点位于圆内。

参考:http://www.movable-type.co.uk/scripts/latlong.html

答案 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