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

Posted

技术标签:

【中文标题】计算指定区域的经纬度范围【英文标题】:calculate the latitude longitude range of a specified region 【发布时间】:2014-01-05 16:43:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

纬度和经度以度为单位,因此您需要使用简单的平面地球投影。 重要提示:下面公式中的所有纬度/经度值都应以弧度为单位,而不是度数!使用平坦的地球就足够了,因为您的半径为 5 公里。平面地球投影为:

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(即小于 5 公里),则该点在圆内。

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

【讨论】:

【参考方案2】:

第一个答案 (TreyA) 似乎向您展示了 Haversine 函数的精简版本。下面是我给人们实现Haversine函数并将十进制值转换为弧度的JS代码。

// 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

【讨论】:

Haversine 在 5 公里半径范围内是多余的。平坦的地球是这个问题的适当近似值。 TreyA 显示的公式是毕达哥拉斯距离。这是一个近似值(相对于Haversine),假设地球不是弯曲的。计算中的错误率因经度而异。它在赤道的误差最小,在北极的误差最大。 我不认为安德鲁的评论是正确的。平面地球方程的准确性不受地球上位置的影响,而是受与参考点的距离的影响。离所选参考越远,计算的准确性就越低。同样,在 5 公里的距离内,地球的曲率在距离计算中并不重要。 很抱歉不同意,但随着我们远离赤道,经度之间的距离缩短,进一步扭曲了测量结果。在之前的 stackexchange GIS 帖子中有一个很好的技术解释:gis.stackexchange.com/questions/58653/… 我相信您假设参考点始终位于赤道/本初子午线。但是,投影是在参考点 lat1/lon1 处创建的。因此,如果您选择参考点作为赤道并开始计算纽约周围的距离,那么您所说的是正确的。我是说你把你的推荐信放在纽约,然后从那里开始项目。【参考方案3】:

您可以通过以下方式获得圆周的点(坐标):

(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 不是千米,只是一个表示圆半径的数字,取决于 X 和 Y 的值。 坐标可能是双精度格式,但纬度和经度的单位是度。如何将 5 公里转换为度数? 我认为您的解决方案(以及来自 Andrew 的解决方案)进行了转换。我考虑了纬度/经度的坐标和半径,因此您可以使用标准函数来进行“切换”,考虑到地球是平的。显然,您的解决方案更完整,因为您在内部进行。我现在对问题有了更好的了解,谢谢。

以上是关于计算指定区域的经纬度范围的主要内容,如果未能解决你的问题,请参考以下文章

卫星测高用matlab读取指定经纬度区域的卫星测高数据并计算高程_以jason2为例

如何判断一个指定的经纬度点是不是落在一个多边形区域内

JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸

SQL Server语句查询指定位置(经纬度)范围内信息

如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内

在c#中以指定的半径获取经纬度的范围