Files
AndroidAisMap/app/src/main/java/com/grigowashere/aismap/maps/RadarMapHelper.java
T
2026-05-20 08:49:14 +03:00

104 lines
3.4 KiB
Java

package com.grigowashere.aismap.maps;
import android.util.Log;
import org.maplibre.android.camera.CameraPosition;
import org.maplibre.android.camera.CameraUpdateFactory;
import org.maplibre.android.geometry.LatLng;
import org.maplibre.android.maps.MapLibreMap;
import org.maplibre.android.maps.MapView;
/**
* Минимальная инициализация MapLibre для режима картплоттера:
* только береговые тайлы, без маркеров AIS и без жестов.
*/
public class RadarMapHelper {
private static final String TAG = "RadarMapHelper";
private static final String STYLE_URL =
"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json";
private final MapView mapView;
private MapLibreMap map;
private boolean styleLoaded;
public RadarMapHelper(MapView mapView) {
this.mapView = mapView;
}
public void initialize(Runnable onReady) {
mapView.getMapAsync(loadedMap -> {
map = loadedMap;
try {
if (map.getUiSettings() != null) {
map.getUiSettings().setCompassEnabled(false);
map.getUiSettings().setAttributionEnabled(false);
map.getUiSettings().setLogoEnabled(false);
map.getUiSettings().setRotateGesturesEnabled(false);
map.getUiSettings().setScrollGesturesEnabled(false);
map.getUiSettings().setZoomGesturesEnabled(false);
map.getUiSettings().setTiltGesturesEnabled(false);
}
} catch (Exception e) {
Log.w(TAG, "UI settings: " + e.getMessage());
}
map.setStyle(STYLE_URL, style -> {
styleLoaded = true;
if (onReady != null) onReady.run();
});
});
}
public void onStart() {
mapView.onStart();
}
public void onResume() {
mapView.onResume();
}
public void onPause() {
mapView.onPause();
}
public void onStop() {
mapView.onStop();
}
public void onDestroy() {
mapView.onDestroy();
}
public void onSaveInstanceState(android.os.Bundle outState) {
mapView.onSaveInstanceState(outState);
}
public void onLowMemory() {
mapView.onLowMemory();
}
/**
* Центрирует карту на собственном судне; bearing задаёт режим «курс вверх».
*
* @param rangeMeters радиус PPI для подбора зума
*/
public void centerOnOwnShip(double lat, double lon, float bearingDeg, double rangeMeters) {
if (map == null || !styleLoaded) return;
if (Double.isNaN(lat) || Double.isNaN(lon)) return;
double zoom = zoomForRangeMeters(rangeMeters);
CameraPosition position = new CameraPosition.Builder()
.target(new LatLng(lat, lon))
.zoom(zoom)
.bearing(bearingDeg)
.tilt(0.0)
.build();
map.easeCamera(CameraUpdateFactory.newCameraPosition(position), 400);
}
/** Подбирает зум так, чтобы весь радиус PPI помещался в круговой области. */
static double zoomForRangeMeters(double rangeMeters) {
double nm = Math.max(0.25, rangeMeters / 1852.0);
return 14.8 - Math.log10(nm) * 2.35;
}
}