我使用了以下链接中的教程在Android应用中显示Google地图路线。我的问题是如何计算地图上折线点的距离?就像我使用谷歌地图应用程序时,它告诉我们街道转弯何时接近。我想在我的应用程序中实现类似的功能。我可以在地图上显示路线折线,当我沿着它行驶时它会自动更新,但我希望它在转弯前提醒我500英尺。我怎样才能做到这一点?
这是链接:
答案 0 :(得分:0)
我将此方法用于标记。假设您具有构成折线的点的纬度和经度,则应执行以下操作:
public class MapUtils {
public static float distBetween(LatLng pos1, LatLng pos2) {
return distBetween(pos1.latitude, pos1.longitude, pos2.latitude,
pos2.longitude);
}
/** distance in meters **/
public static float distBetween(double lat1, double lng1, double lat2, double lng2) {
double earthRadius = 3958.75;
double dLat = Math.toRadians(lat2 - lat1);
double dLng = Math.toRadians(lng2 - lng1);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(lat1))
* Math.cos(Math.toRadians(lat2)) * Math.sin(dLng / 2)
* Math.sin(dLng / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double dist = earthRadius * c;
int meterConversion = 1609;
return (float) (dist * meterConversion);
}
}
为了确定道路是否正在转动,我将研究向量之间的欧氏角度(x是当前位置,y是折线点)
为此,只需从前方一定距离拿走当前位置和LatLng。
计算基于:http://en.wikipedia.org/wiki/Euclidean_space#Angle
Location currentLocation; // obtained somewhere in your code
LatLng polylinePoint; // a point further ahead
double cLat = currentLocation.getLatitude();
double cLon = currentLocation.getLongitude();
double pLat = polylinePoint.latitude;
double pLon = polylinePoint.longitude;
double angle = Math.acos(
(cLat*pLat+cLon+pLon) / norm(cLat,cLon)*norm(pLat,cLon));
private double norm(double x, double y) {
return Math.sqrt(Math.pow(x, 2)*Math.pow(y, 2));
}
这是未经测试的,因此可能包含错误。