如何在 Android 中的倾斜地图上将相机定位在屏幕底部
How can I position the camera on the bottom of the screen on a tilted Map in Android
我想在我的 android 应用程序中渲染地图,以 3D 方式引导用户。
为此,我使用 com.google.android.gms.maps.GoogleMap
对象。
更新 GoogleMap
的位置时,它以提供的位置为中心。我希望地图将提供的位置放在屏幕的 底部 上。
我找到了一些关于如何实现这一点的例子。
这是我用来更新地图位置的代码:
private static final int ZOOM_LEVEL = 20;
private static final int TILT = 90;
private float bearing; // from censors
private MapView gMapView;
private void updatePosition(final LatLng pos){
GoogleMap map = gMapView.getMap();
Point p = map.getProjection().toScreenLocation(pos);
p.set(p.x, p.y - (gMapView.getHeight()/2));
LatLng target = map.getProjection().fromScreenLocation(p);
CameraPosition cap = new CameraPosition.Builder().target(target)
.bearing(bearing).tilt(TILT).zoom(ZOOM_LEVEL).build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(cap));
}
如果我不使用倾斜,或者如果变换是反向的(如p.set(p.x, p.y + (gMapView.getHeight()/2));
),这工作正常,但是当像上面的代码那样将中心变换到屏幕底部时,定位跳回位置之间来回。
我找到了一种可以正确放置相机的替代解决方案:
CameraPosition cap = new CameraPosition.Builder().target(pos)
.bearing(bearing).tilt(TILT).zoom(ZOOM_LEVEL).build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(cap));
map.moveCamera(CameraUpdateFactory.scrollBy(0, -gMapView.getHeight()/2));
但是渲染了两次,导致地图闪烁。
有没有人有关于如何在屏幕底部渲染带有参考点的倾斜地图的解决方案?
我使用 Java Geodesy Library 解决了这个问题。
当地图倾斜时,用地图变换原点不准确。
所以使用地图来计算转换是 FUBAR。但是,使用独立的 api 效果很好。
private LatLng currentLatLng;
private float AR_MAP_TRANSLATE = 100f;
private CameraUpdate arCamera() {
GlobalCoordinates start = new GlobalCoordinates(currentLatLng.latitude, currentLatLng.longitude);
GlobalCoordinates target = geoCalc.calculateEndingGlobalCoordinates(
Ellipsoid.WGS84, start, mapBearing, AR_MAP_TRANSLATE);
LatLng mapTarget = new LatLng(target.getLatitude(), target.getLongitude());
CameraPosition cap = new CameraPosition(mapTarget,
AR_MAP_ZOOM, AR_MAP_TILT, mapBearing);
return CameraUpdateFactory.newCameraPosition(cap);
}
我想在我的 android 应用程序中渲染地图,以 3D 方式引导用户。
为此,我使用 com.google.android.gms.maps.GoogleMap
对象。
更新 GoogleMap
的位置时,它以提供的位置为中心。我希望地图将提供的位置放在屏幕的 底部 上。
我找到了一些关于如何实现这一点的例子。
这是我用来更新地图位置的代码:
private static final int ZOOM_LEVEL = 20;
private static final int TILT = 90;
private float bearing; // from censors
private MapView gMapView;
private void updatePosition(final LatLng pos){
GoogleMap map = gMapView.getMap();
Point p = map.getProjection().toScreenLocation(pos);
p.set(p.x, p.y - (gMapView.getHeight()/2));
LatLng target = map.getProjection().fromScreenLocation(p);
CameraPosition cap = new CameraPosition.Builder().target(target)
.bearing(bearing).tilt(TILT).zoom(ZOOM_LEVEL).build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(cap));
}
如果我不使用倾斜,或者如果变换是反向的(如p.set(p.x, p.y + (gMapView.getHeight()/2));
),这工作正常,但是当像上面的代码那样将中心变换到屏幕底部时,定位跳回位置之间来回。
我找到了一种可以正确放置相机的替代解决方案:
CameraPosition cap = new CameraPosition.Builder().target(pos)
.bearing(bearing).tilt(TILT).zoom(ZOOM_LEVEL).build();
map.moveCamera(CameraUpdateFactory.newCameraPosition(cap));
map.moveCamera(CameraUpdateFactory.scrollBy(0, -gMapView.getHeight()/2));
但是渲染了两次,导致地图闪烁。
有没有人有关于如何在屏幕底部渲染带有参考点的倾斜地图的解决方案?
我使用 Java Geodesy Library 解决了这个问题。
当地图倾斜时,用地图变换原点不准确。 所以使用地图来计算转换是 FUBAR。但是,使用独立的 api 效果很好。
private LatLng currentLatLng;
private float AR_MAP_TRANSLATE = 100f;
private CameraUpdate arCamera() {
GlobalCoordinates start = new GlobalCoordinates(currentLatLng.latitude, currentLatLng.longitude);
GlobalCoordinates target = geoCalc.calculateEndingGlobalCoordinates(
Ellipsoid.WGS84, start, mapBearing, AR_MAP_TRANSLATE);
LatLng mapTarget = new LatLng(target.getLatitude(), target.getLongitude());
CameraPosition cap = new CameraPosition(mapTarget,
AR_MAP_ZOOM, AR_MAP_TILT, mapBearing);
return CameraUpdateFactory.newCameraPosition(cap);
}