mirror of
https://github.com/immich-app/immich.git
synced 2024-12-24 10:37:28 +02:00
e6c0f0e3aa
* chore: maplibre gl pubspec * refactor(wip): maplibre for maps * refactor(wip): dual pane + location button * chore: remove flutter_map and deps * refactor(wip): map zoom to location * refactor: location picker * open gallery_viewer on marker tap * remove detectScaleGesture param * test: debounce and throttle * chore: rename get location method * feat(mobile): Adds gps locator to map prompt for easy geolocation (#6282) * Refactored get gps coords * Use var for linter's sake, should handle errors better * Cleanup * Fix linter issues * chore(dep): update maplibre to official lib --------- Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Co-authored-by: Joshua Herrera <joshua.herrera227@gmail.com>
72 lines
2.2 KiB
Dart
72 lines
2.2 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:flutter/services.dart';
|
|
import 'package:immich_mobile/modules/map/models/map_marker.dart';
|
|
import 'package:immich_mobile/modules/map/utils/map_utils.dart';
|
|
import 'package:maplibre_gl/maplibre_gl.dart';
|
|
|
|
extension MapMarkers on MaplibreMapController {
|
|
Future<void> addGeoJSONSourceForMarkers(List<MapMarker> markers) async {
|
|
return addSource(
|
|
MapUtils.defaultSourceId,
|
|
GeojsonSourceProperties(
|
|
data: MapUtils.generateGeoJsonForMarkers(markers.toList()),
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> reloadAllLayersForMarkers(List<MapMarker> markers) async {
|
|
// !! Make sure to remove layers before sources else the native
|
|
// maplibre library would crash when removing the source saying that
|
|
// the source is still in use
|
|
final existingLayers = await getLayerIds();
|
|
if (existingLayers.contains(MapUtils.defaultHeatMapLayerId)) {
|
|
await removeLayer(MapUtils.defaultHeatMapLayerId);
|
|
}
|
|
|
|
final existingSources = await getSourceIds();
|
|
if (existingSources.contains(MapUtils.defaultSourceId)) {
|
|
await removeSource(MapUtils.defaultSourceId);
|
|
}
|
|
|
|
await addGeoJSONSourceForMarkers(markers);
|
|
|
|
await addHeatmapLayer(
|
|
MapUtils.defaultSourceId,
|
|
MapUtils.defaultHeatMapLayerId,
|
|
MapUtils.defaultHeatMapLayerProperties,
|
|
);
|
|
}
|
|
|
|
Future<Symbol?> addMarkerAtLatLng(LatLng centre) async {
|
|
// no marker is displayed if asset-path is incorrect
|
|
try {
|
|
final ByteData bytes = await rootBundle.load("assets/location-pin.png");
|
|
await addImage("mapMarker", bytes.buffer.asUint8List());
|
|
return addSymbol(
|
|
SymbolOptions(
|
|
geometry: centre,
|
|
iconImage: "mapMarker",
|
|
iconSize: 0.15,
|
|
iconAnchor: "bottom",
|
|
),
|
|
);
|
|
} finally {
|
|
// no-op
|
|
}
|
|
}
|
|
|
|
Future<LatLngBounds> getBoundsFromPoint(
|
|
Point<double> point,
|
|
double distance,
|
|
) async {
|
|
final southWestPx = Point(point.x - distance, point.y + distance);
|
|
final northEastPx = Point(point.x + distance, point.y - distance);
|
|
|
|
final southWest = await toLatLng(southWestPx);
|
|
final northEast = await toLatLng(northEastPx);
|
|
|
|
return LatLngBounds(southwest: southWest, northeast: northEast);
|
|
}
|
|
}
|