Ограничить камеру только на поверхности земли? Google Map Android API v2
Я пытаюсь показать наземное наложение с маркерами на нем своим пользователям. Я пытаюсь ограничить вид только этим изображением, размещенным на карте. Я хочу, чтобы пользователь видел изображение только как наложение на карту, размещенное на карте, и не смог перейти к окружающей карте. И если они пойдут через край, жесты будут заблокированы.
Я хочу что-то вроде этого:
Я не хочу, чтобы это: /questions/20532496/pokazat-tolko-nazemnyie-overlei-kartyi-android или это:
Я пытался установить мой map.setLatLngBoundsForCameraTarget()
к моему изображению, но в результате получается что-то похожее на предыдущее изображение...
Следующее, что я попробовал, это установить кучу LatLng
объекты вокруг наложения земли и проверить с curScreen.contains(customMapDetectionPoints.get(LatLng Object))
чтобы увидеть, появляются ли они в окне просмотра. Это работает, но я не могу остановить камеру, чтобы перейти через край...
Вот мой тестовый код до сих пор:
private GroundOverlay groundOverlay;
private GoogleMap globalMap;
private final int DETECTION_POINTS_CUSTOM_MAP = 20;
private List<LatLng> customMapDetectionPoints = new ArrayList<>();
//Fully Working as suppose to
@Override
public void onMapReady(GoogleMap map) {
//Other Stuff...
LatLngBounds mapBounds = groundOverlay.getBounds();
map.setLatLngBoundsForCameraTarget(mapBounds);
globalMap = map;
LatLng northwest = new LatLng( mapBounds.northeast.latitude, mapBounds.southwest.longitude);
LatLng northeast = mapBounds.northeast;
LatLng southeast = new LatLng( mapBounds.southwest.latitude, mapBounds.northeast.longitude);
LatLng southwest = mapBounds.southwest;
//My ground overlay is rectangle so I don't need to follow a path or something like that
setDetectionPoints(northwest, southwest);
setDetectionPoints(northeast, southeast);
setDetectionPoints(northwest, northeast);
setDetectionPoints(southwest, southeast);
map.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() {
@Override
public void onCameraMoveStarted(int i) {
LatLngBounds curScreen = globalMap.getProjection().getVisibleRegion().latLngBounds;
CameraPosition cameraPosition = globalMap.getCameraPosition();
for (int x =0;x<customMapDetectionPoints.size();x++) {
if (curScreen.contains(customMapDetectionPoints.get(x))) {
cancelMapMovement(cameraPosition);
Log.d("OUT", "Ground Overlay is outside viewport");
return;
} else {
globalMap.getUiSettings().setAllGesturesEnabled(true);
Log.d("IN", "Ground Overlay is inside viewport");
}
}
}
});
//Add 20 new location between two location
//Fully Working as suppose to
public void setDetectionPoints(LatLng fromPos, LatLng toPos) {
double pointLatitude = fromPos.latitude;
double pointLongitude = fromPos.longitude;
double addingValue;
if (fromPos.latitude == toPos.latitude) {
addingValue = (toPos.longitude - fromPos.longitude)/DETECTION_POINTS_CUSTOM_MAP;
for (int i = 0; i < DETECTION_POINTS_CUSTOM_MAP; i++) {
pointLongitude += addingValue;
LatLng pointsPos = new LatLng(pointLatitude, pointLongitude);
customMapDetectionPoints.add(pointsPos);
}
} else if (fromPos.longitude == toPos.longitude) {
addingValue = (toPos.latitude - fromPos.latitude)/DETECTION_POINTS_CUSTOM_MAP;
for (int i = 0; i < DETECTION_POINTS_CUSTOM_MAP; i++) {
pointLatitude += addingValue;
LatLng pointsPos = new LatLng(pointLatitude, pointLongitude);
customMapDetectionPoints.add(pointsPos);
}
}
}
//The problem is here!
public void cancelMapMovement(CameraPosition camPos ) {
//HOW CAN I STOP THE MOVEMENT OVER THE GROUND OVERLAY EDGE
//And make sure that the user dosen't see over the edge
globalMap.getUiSettings().setAllGesturesEnabled(false);
globalMap.moveCamera(CameraUpdateFactory.newCameraPosition(camPos));
}
На данный момент у меня есть два возможных решения:
1- Используйте только setLatLngBoundsForCameraTarget()
функции и установите смещение или поле для камеры. Но возможно ли это и будет ли оно работать для моего варианта использования?
2- Решите мою проблему ограничения камеры с помощью уже написанного кода
Спасибо за помощь! Предложите другое решение, если найдете его!
Я предоставлю больше информации, если хотел.