通过路由在osmdroid中旋转MapView
Rotate MapView in osmdroid by route
我需要像在导航器中一样从 osmdroid 制作 MapView。 driver 按照从服务器获取的路线骑车。地图应该为他旋转,因为路线总是在他在地图上的点之前。问题是我无法为每次旋转都获得正确的角度。有时有效,有时无效。例如,如何定义旋转以 1 米为单位?也许,osmdroid 中的某些库或 类 可以帮助我解决这些问题?
我认为您最好根据设备罗盘 and/or gps 航向定位地图。 Osmdroid 没有为此内置任何东西。
当你从服务器获取路线后,你能计算出你在哪条路段吗?如果是这样,您应该能够确定何时旋转地图。
我找到了解决办法。此方法计算出我旋转地图的正确度数。我把路线剪成直线。当当前位置靠近下一行时,我调用此方法
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;
}
我需要像在导航器中一样从 osmdroid 制作 MapView。 driver 按照从服务器获取的路线骑车。地图应该为他旋转,因为路线总是在他在地图上的点之前。问题是我无法为每次旋转都获得正确的角度。有时有效,有时无效。例如,如何定义旋转以 1 米为单位?也许,osmdroid 中的某些库或 类 可以帮助我解决这些问题?
我认为您最好根据设备罗盘 and/or gps 航向定位地图。 Osmdroid 没有为此内置任何东西。
当你从服务器获取路线后,你能计算出你在哪条路段吗?如果是这样,您应该能够确定何时旋转地图。
我找到了解决办法。此方法计算出我旋转地图的正确度数。我把路线剪成直线。当当前位置靠近下一行时,我调用此方法
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;
}