安卓:如何通过一个经纬度坐标作为中心来查找经纬度范围?

4
我有一组不同地点的数据集,想要展示最近的位置(在5公里内)。
如何确定纬度和经度的最小/最大值?
例如:我需要加油,正在寻找附近所有的加油站,以便去最近的一个。如何在Android手机上实现这个功能?
我也想避免迭代所有位置,因为我有大约2500个位置并且还在增加。有什么建议吗?
非常感谢大家提前给我的建议!
更新: 感谢你们给我的反馈,我通过在服务器上迭代所有位置并使用Google距离矩阵API计算距离来解决了我的问题:http://code.google.com/intl/nl/apis/maps/documentation/distancematrix/
3个回答

2
简单来说,纬度是赤道上/下的角度,经度是相对于格林威治子午线的角度。
因此,要计算例如1º纬度平均相当于多少距离,可以将其转换为弧度(乘以PI / 180),然后乘以地球的平均半径(6,371.0公里)。
对于您的问题,过程是相反的:将5公里转换为度数:
1. 将其除以地球半径 2. 乘以180 / PI
这样您就会得到一个“delta”度数,即5公里大约相当于多少度数(如果您想要精确度,需要考虑在这5公里内地球半径的精确差异),您可以用它来围绕给定位置建立一个圆圈(就像一个指南针一样)。

有没有一种方法可以知道某个纬度的确切地球半径是多少?有什么网站或API可以提供这样的信息吗? - Diëgo
谢谢!我使用Google DistanceMatrix API解决了我的问题:http://code.google.com/intl/nl/apis/maps/documentation/distancematrix/ - Diëgo
请注意,在纬度圈上移动并不能提供最小和最大经度。请参阅http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates。 - luxcem
@m0skit0,我遇到了类似的问题,我想找到距离给定位置 x 公里左右的区域面积。我该如何实现?有没有相关的代码示例可以提供? - G K
请发布您自己的问题。 - m0skit0
显示剩余2条评论

0

所有计算和方法都是近似值,但完全在您需要的公差范围内。

地球周长约为40076000米。

每度纬度行进的距离始终相同,仅是地球周长的比例。

然而,每经度行进的距离取决于您的纬度(这些环在接近极地的地方变得更小)。

因此,对于给定的距离m,相应的纬度和经度值为

earthcirc = 40076000;
// at Lat and Lon for distance m (in meters)
LatDelta = (m * 360) / earthcirc;
LonDelta = (m * 360) / abs(eathcirc*cos(lat));

这将为您提供简单搜索数据的正方形纬度和经度差。但是在找到候选者后,您应该进行完整的距离计算,因为正方形的角落距离超过5公里。

两个纬度/经度之间的距离

distLat = (lat1-lat2) * earthcirc) / 360;
distLong = (long1-long2) * earthcirc * cos((lat1+lat2)/2) / 360;
dist = sqrt( sqr(distLat) + sqr(distLong) );

我知道大多数编译器/语言在cos/sin函数中使用弧度,但用角度来解释更容易。

至于搜索数据,最简单的方法是按纬度或经度排序,然后可以进行二分查找以找到可能要检查的位置,而不必进行完整扫描。有更好的方式来排序数据(四叉树),但对于大约2500个条目,我不会费心思考。


0

这里有两个问题,1)如何计算两个经纬度对之间的距离,2)如何找到距离给定点最近的点。

  1. 网上有一些公式,有些更准确,例如http://www.movable-type.co.uk/scripts/latlong.html

  2. 这是一个(地理)空间索引问题(http://en.wikipedia.org/wiki/Spatial_index#Spatial_Index)。您可以使用带有lat/lng作为X/Y的四叉树(我假设您的点不太靠近极点,这会使事情复杂但仍然可行)。四叉树让您在Log(N)时间内找到汽车附近的邻居,而无需迭代所有点。

这不是精确的代码,但希望能有所帮助。


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