我需要像导航器一样从osmdroid制作MapView。司机乘坐从服务器取出的路线乘车。地图应该为他旋转,因为路线总是在地图上的点前面。问题是我无法为每次旋转获得直角。有时它有效,有时不行。例如,如何定义旋转将在1米?也许,osmdroid中的一些库或类可以帮助我解决这些问题吗?
答案 0 :(得分:0)
我认为你要做的最好的事情是根据设备指南针和/或gps标题来定位地图。 Osmdroid没有内置任何东西。
当您从服务器获得路线时,您能计算出您所在的路段吗?如果是这样,您应该能够确定何时旋转地图。
答案 1 :(得分:0)
我找到了解决方案。此方法计算旋转地图的正确程度。我把路线切成了直线。当前位置靠近下一行时,我称之为
public double rotateToNextCheckPoint() {
int lineId = OfferPreference.getInstance().getCurrentLineId();
if (rotates != null && lineId >= 0 && road.mRouteHigh.size() > 0) {
if (lineId < (rotates.size() - 1)) {
GeoPoint nextPoint = rotates.get(lineId).getLast();
GeoPoint currPoint = rotates.get(lineId).getFirst();
if (nextPoint == null || currPoint == null) {
return 0;
}
double lat1 = Math.toRadians(currPoint.getLatitude());
double lon1 = Math.toRadians(currPoint.getLongitude());
double lat2 = Math.toRadians(nextPoint.getLatitude());
double lon2 = Math.toRadians(nextPoint.getLongitude());
double cos1 = Math.cos(lat1);
double cos2 = Math.cos(lat2);
double sin1 = Math.sin(lat1);
double sin2 = Math.sin(lat2);
double delta = lon2 - lon1;
double deltaCos = Math.cos(delta);
double deltaSin = Math.sin(delta);
double x = (cos1 * sin2) - (sin1 * cos2 * deltaCos);
double y = deltaSin * cos2;
double z = Math.toDegrees(Math.atan((-y / x)));
if (x < 0) {
z += 180;
}
double z2 = (z + 180) % 360 - 180;
z2 = -Math.toRadians(z2);
double angleRad = z2 - (Math.PI * 2 * Math.floor(z2 / (2 * Math.PI)));
double angle = Math.toDegrees(angleRad);
rotationGestureOverlay.onRotate(-(float) angle, false);
return angle;
}
}
return 0;
}