【发布时间】:2014-03-19 15:00:19
【问题描述】:
我正在编写一个 Android 应用程序并集成 GoogleMapsV2 API。我在地图上锚点周围的不同位置有一系列标记。
我希望这些标记逐渐收敛到锚点的位置。
我有一个循环运行,它将调用每个标记 B,并从 B 的位置计算到锚点 A 的方位角。然后我计算沿该方位角的固定距离的目标坐标并更新。
这是我正在使用的两个函数(取自堆栈帖子和地理地图站点的合并,以供全面披露):
public double calcBearing(double lat1, double lon1, double lat2, double lon2){
double longitude1 = lon1;
double longitude2 = lon2;
double latitude1 = Math.toRadians(lat1);
double latitude2 = Math.toRadians(lat2);
double longDiff= Math.toRadians(longitude2-longitude1);
double y= Math.sin(longDiff)*Math.cos(latitude2);
double x=Math.cos(latitude1)*Math.sin(latitude2)-Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(longDiff);
double calcBearing = (Math.toDegrees(Math.atan2(y, x))+360)%360;
return calcBearing;
}
public Coordinate calcCoordFromPointBearing(double lat1, double lon1, double bearing, double distance){
double rEarth = 6371.01; // Earth's average radius in km
double epsilon = 0.000001; // threshold for floating-point equality
double rLat1 = deg2rad(lat1);
double rLon1 = deg2rad(lon1);
double rbearing = deg2rad(bearing);
double rdistance = distance / rEarth;
double rlat = Math.asin( Math.sin(rLat1) * Math.cos(rdistance) + Math.cos(rLat1) * Math.sin(rdistance) * Math.cos(rbearing) );
double rlon;
if (Math.cos(rlat) == 0 || Math.abs(Math.cos(rlat)) < epsilon) // Endpoint a pole
rlon=rLon1;
else
rlon = ( (rLon1 - Math.asin( Math.sin(rbearing)* Math.sin(rdistance) / Math.cos(rlat) ) + Math.PI ) % (2*Math.PI) ) - Math.PI;
double lat = rad2deg(rlat);
double lon = rad2deg(rlon);
return new Coordinate(lat,lon);
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
简而言之,我认为我已经搞砸了上述计算。我看到的行为是标记不规律地移动,并且以高频率最终朝向两个方位:90 和 270。因此,它们倾向于远离我的锚点而不是朝向它。
有人可以帮我找出错误吗?我将度数传递给方位函数和坐标计算函数,但我会立即将它们转换为弧度以供算法使用,然后转换回度数以供其他地方使用。
[更新:
大部分代码来自这个例子:
Calculating coordinates given a bearing and a distance
在我看来,输出经度正被归一化为 -180 到 180,我在 360 度空间上绘制,导致输出指向方位 90 和 270。关于三角数学更改的任何建议都需要解决这个问题?]
【问题讨论】:
-
我已经按照movable-type.co.uk/scripts/latlong.html之前的计算。
标签: android algorithm google-maps geolocation geometry