Chm*_*nah 107 maps android geolocation
我想制作一个应用程序来检查用户所在的最近的地方.我可以很容易地获得用户的位置,我已经有了纬度和经度的地方列表.
知道列表最近的位置与当前用户位置的最佳方法是什么.
我在谷歌API中找不到任何东西.
小智 156
Location loc1 = new Location("");
loc1.setLatitude(lat1);
loc1.setLongitude(lon1);
Location loc2 = new Location("");
loc2.setLatitude(lat2);
loc2.setLongitude(lon2);
float distanceInMeters = loc1.distanceTo(loc2);
Run Code Online (Sandbox Code Playgroud)
参考:http://developer.android.com/reference/android/location/Location.html#distanceTo(android.location.Location)
has*_*man 122
http://developer.android.com/reference/android/location/Location.html
查看distanceTo或distanceBetween.您可以从纬度和经度创建Location对象:
Location location = new Location("");
location.setLatitude(lat);
location.setLongitude(lon);
Run Code Online (Sandbox Code Playgroud)
Lau*_*ire 31
近似解(基于等距矩形投影),更快(它只需要1个trig和1个平方根).
如果你的点不是太远,那么这种近似是相关的.与真实的半径距离相比,它总是高估.例如,如果两点之间的三角洲纬度或经度不超过4个十进制度,它将向实际距离添加不超过0.05382%.
标准公式(Haversine)是精确的公式(也就是说,它适用于地球上任何一个经度/纬度)但速度要慢得多,因为它需要7个三角和2个平方根.如果你的几个点不是太远,并且绝对精度不是最重要的,你可以使用这个近似版本(Equirectangular),因为它只使用一个三角函数和一个平方根,速度要快得多.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式进一步优化:
有关详细信息,请参阅:http://www.movable-type.co.uk/scripts/latlong.html
以下是几种语言的Haversine公式的很好的参考实现:http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
Dwa*_*ley 11
您可以使用几种方法,但要确定哪种方法最好,我们首先需要知道您是否了解用户的高度以及其他点的高度?
根据您所追求的准确程度,您可以查看Haversine或Vincenty公式......
这些页面详细说明了公式,并且对于数学上较少的公式也提供了如何在脚本中实现它们的说明!
Haversine Formula:http://www.movable-type.co.uk/scripts/latlong.html
Vincenty Formula:http://www.movable-type.co.uk/scripts/latlong-vincenty.html
如果你对公式中的任何含义有任何问题,只需评论,我会尽我所能回答它们:)
| 归档时间: |
|
| 查看次数: |
139395 次 |
| 最近记录: |