Aktuális pozíciót jelzésének javítása
This commit is contained in:
parent
0257beec38
commit
a9316b9b8d
@ -42,6 +42,7 @@ import 'package:terepi_seged/services/gnss/gnss_service.dart';
|
|||||||
import 'package:terepi_seged/services/ntrip_service.dart';
|
import 'package:terepi_seged/services/ntrip_service.dart';
|
||||||
import 'package:terepi_seged/services/project_service.dart';
|
import 'package:terepi_seged/services/project_service.dart';
|
||||||
import 'package:terepi_seged/widgets/map_edit_tools/map_feature_save_sheet.dart';
|
import 'package:terepi_seged/widgets/map_edit_tools/map_feature_save_sheet.dart';
|
||||||
|
import 'package:terepi_seged/widgets/shared_map_widgets.dart';
|
||||||
|
|
||||||
class MapSurveyController extends GetxController {
|
class MapSurveyController extends GetxController {
|
||||||
static MapSurveyController get to => Get.find();
|
static MapSurveyController get to => Get.find();
|
||||||
@ -123,6 +124,7 @@ class MapSurveyController extends GetxController {
|
|||||||
RxBool mapIsInitialized = false.obs;
|
RxBool mapIsInitialized = false.obs;
|
||||||
|
|
||||||
final MapController mapController = MapController();
|
final MapController mapController = MapController();
|
||||||
|
bool _isMapProgrammaticMove = false;
|
||||||
|
|
||||||
final polylineHitNotifier = ValueNotifier<LayerHitResult<int>?>(null);
|
final polylineHitNotifier = ValueNotifier<LayerHitResult<int>?>(null);
|
||||||
final polygonHitNotifier = ValueNotifier<LayerHitResult<int>?>(null);
|
final polygonHitNotifier = ValueNotifier<LayerHitResult<int>?>(null);
|
||||||
@ -232,6 +234,7 @@ class MapSurveyController extends GetxController {
|
|||||||
polygonEditorController.addListener(() {
|
polygonEditorController.addListener(() {
|
||||||
editorPointCount.value = polygonEditorController.points.length;
|
editorPointCount.value = polygonEditorController.points.length;
|
||||||
});
|
});
|
||||||
|
await _setInitialPositionFromPhone();
|
||||||
|
|
||||||
mapIsInitialized.value = true;
|
mapIsInitialized.value = true;
|
||||||
}
|
}
|
||||||
@ -266,6 +269,46 @@ class MapSurveyController extends GetxController {
|
|||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> _setInitialPositionFromPhone() async {
|
||||||
|
try {
|
||||||
|
// Engedély ellenőrzés
|
||||||
|
final permission = await Geolocator.checkPermission();
|
||||||
|
if (permission == LocationPermission.denied ||
|
||||||
|
permission == LocationPermission.deniedForever) {
|
||||||
|
await Geolocator.requestPermission();
|
||||||
|
}
|
||||||
|
|
||||||
|
// getLastKnownPosition → azonnal visszatér (cache)
|
||||||
|
// Nem vár új GPS fixre → nem lassítja az indulást
|
||||||
|
Position? pos = await Geolocator.getLastKnownPosition();
|
||||||
|
|
||||||
|
// Ha nincs cache → gyors egyszeri lekérés (max 3 mp)
|
||||||
|
pos ??= await Geolocator.getCurrentPosition(
|
||||||
|
locationSettings: const LocationSettings(
|
||||||
|
accuracy: LocationAccuracy.low, // gyors, kevésbé pontos
|
||||||
|
timeLimit: Duration(seconds: 3),
|
||||||
|
),
|
||||||
|
).timeout(
|
||||||
|
const Duration(seconds: 3),
|
||||||
|
onTimeout: () => throw Exception('GPS timeout'),
|
||||||
|
);
|
||||||
|
|
||||||
|
currentLatitude.value = pos.latitude;
|
||||||
|
currentLongitude.value = pos.longitude;
|
||||||
|
|
||||||
|
// Térkép mozgatása — csak ha már inicializálva van a widget
|
||||||
|
// mapIsInitialized előtt hívjuk, de a controller már kész
|
||||||
|
// A move() biztonságos ha a mapController már csatolt
|
||||||
|
mapController.move(
|
||||||
|
LatLng(pos.latitude, pos.longitude),
|
||||||
|
currentZoom.value,
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
// Hiba esetén marad a default pozíció — nem kritikus
|
||||||
|
debugPrint('Kezdő pozíció lekérés sikertelen: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ─────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────
|
||||||
// GnssService frissítés kezelése
|
// GnssService frissítés kezelése
|
||||||
// ─────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────
|
||||||
@ -395,19 +438,38 @@ class MapSurveyController extends GetxController {
|
|||||||
// ─────────────────────────────────────────────────────────────────
|
// ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
void mapZoomIn() {
|
void mapZoomIn() {
|
||||||
if (currentZoom.value >= maxZoomValue) return;
|
final newZoom = (mapController.camera.zoom + 1).clamp(0.0, maxZoomValue);
|
||||||
currentZoom.value++;
|
// if (currentZoom.value >= maxZoomValue) return;
|
||||||
|
// currentZoom.value++;
|
||||||
|
currentZoom.value = newZoom;
|
||||||
|
_isMapProgrammaticMove = true;
|
||||||
_moveMap();
|
_moveMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
void mapZoomOut() {
|
void mapZoomOut() {
|
||||||
if (currentZoom.value <= 0) return;
|
final newZoom = (mapController.camera.zoom - 1).clamp(0.0, maxZoomValue);
|
||||||
currentZoom.value--;
|
// if (currentZoom.value <= 0) return;
|
||||||
|
// currentZoom.value--;
|
||||||
|
currentZoom.value = newZoom;
|
||||||
|
_isMapProgrammaticMove = true;
|
||||||
_moveMap();
|
_moveMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setIsMapMoveToCenter() =>
|
void setIsMapMoveToCenter() {
|
||||||
isMapMoveToCenter.value = !isMapMoveToCenter.value;
|
isMapMoveToCenter.value = !isMapMoveToCenter.value;
|
||||||
|
|
||||||
|
// Bekapcsoláskor azonnal ugrik az aktuális pozícióra
|
||||||
|
if (isMapMoveToCenter.value &&
|
||||||
|
currentLatitude.value != 0.0 &&
|
||||||
|
currentLongitude.value != 0.0) {
|
||||||
|
_isMapProgrammaticMove = true;
|
||||||
|
mapController.move(
|
||||||
|
LatLng(currentLatitude.value, currentLongitude.value),
|
||||||
|
currentZoom.value,
|
||||||
|
);
|
||||||
|
// Ez MapEventSource.mapController → NEM kapcsolja ki a követést ✓
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _moveMap() {
|
void _moveMap() {
|
||||||
final lat = isMapMoveToCenter.value
|
final lat = isMapMoveToCenter.value
|
||||||
@ -419,25 +481,64 @@ class MapSurveyController extends GetxController {
|
|||||||
mapController.move(LatLng(lat, lon), currentZoom.value);
|
mapController.move(LatLng(lat, lon), currentZoom.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onMapPositionChanged(MapCamera camera, bool hasGesture) {
|
||||||
|
if (hasGesture) {
|
||||||
|
currentZoom.value = camera.zoom;
|
||||||
|
}
|
||||||
|
if (_isMapProgrammaticMove) {
|
||||||
|
_isMapProgrammaticMove = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasGesture && isMapMoveToCenter.value) {
|
||||||
|
isMapMoveToCenter.value = false;
|
||||||
|
}
|
||||||
|
// if (isMapMoveToCenter.value) {
|
||||||
|
// isMapMoveToCenter.value = false;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
void _updateCurrentLocationMarker() {
|
void _updateCurrentLocationMarker() {
|
||||||
|
// Koordináta validáció — 0,0 = nincs fix
|
||||||
|
final lat = currentLatitude.value;
|
||||||
|
final lon = currentLongitude.value;
|
||||||
|
if (lat == 0.0 && lon == 0.0) {
|
||||||
|
currentLocationMarker.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final color = _gnss.hasValidData
|
||||||
|
? getCurrentLocationMarkerColor(_gnss.gpsQuality.value)
|
||||||
|
: Colors.blue; // telefon GPS: kék
|
||||||
|
|
||||||
currentLocationMarker.assignAll([
|
currentLocationMarker.assignAll([
|
||||||
Marker(
|
Marker(
|
||||||
point: LatLng(currentLatitude.value, currentLongitude.value),
|
point: LatLng(lat, lon),
|
||||||
width: 15.0,
|
width: 16,
|
||||||
height: 15.0,
|
height: 16,
|
||||||
child: Container(
|
child: PulsingDot(color: color), // ← shared_map_widgets.dart-ból
|
||||||
width: 15.0,
|
),
|
||||||
height: 15.0,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: getCurrentLocationMarkerColor(_gnss.gpsQuality.value),
|
|
||||||
shape: BoxShape.circle,
|
|
||||||
border: Border.all(width: 1.5, color: Colors.white),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// currentLocationMarker.assignAll([
|
||||||
|
// Marker(
|
||||||
|
// point: LatLng(currentLatitude.value, currentLongitude.value),
|
||||||
|
// width: 15.0,
|
||||||
|
// height: 15.0,
|
||||||
|
// child: Container(
|
||||||
|
// width: 15.0,
|
||||||
|
// height: 15.0,
|
||||||
|
// decoration: BoxDecoration(
|
||||||
|
// color: getCurrentLocationMarkerColor(_gnss.gpsQuality.value),
|
||||||
|
// shape: BoxShape.circle,
|
||||||
|
// border: Border.all(width: 1.5, color: Colors.white),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// )
|
||||||
|
// ]);
|
||||||
|
|
||||||
if (isMapMoveToCenter.value) {
|
if (isMapMoveToCenter.value) {
|
||||||
|
_isMapProgrammaticMove = true;
|
||||||
mapController.move(
|
mapController.move(
|
||||||
LatLng(currentLatitude.value, currentLongitude.value),
|
LatLng(currentLatitude.value, currentLongitude.value),
|
||||||
currentZoom.value,
|
currentZoom.value,
|
||||||
@ -1150,6 +1251,7 @@ class MapSurveyController extends GetxController {
|
|||||||
|
|
||||||
await updateNoteItem(updated);
|
await updateNoteItem(updated);
|
||||||
_editingNoteItemId = null;
|
_editingNoteItemId = null;
|
||||||
|
activeEditTool.value = MapEditTool.none;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteEditingItem() async {
|
Future<void> deleteEditingItem() async {
|
||||||
|
|||||||
@ -9,6 +9,8 @@ import 'package:terepi_seged/enums/map_survey_mode.dart';
|
|||||||
import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart';
|
import 'package:terepi_seged/pages/map_survey/presentations/controllers/map_survey_controller.dart';
|
||||||
import 'package:terepi_seged/pages/map_survey/presentations/views/settings_dialog.dart';
|
import 'package:terepi_seged/pages/map_survey/presentations/views/settings_dialog.dart';
|
||||||
import 'package:terepi_seged/pages/tracking/presentation/controllers/tracking_controller.dart';
|
import 'package:terepi_seged/pages/tracking/presentation/controllers/tracking_controller.dart';
|
||||||
|
import 'package:terepi_seged/services/gnss/gnss_device_service.dart';
|
||||||
|
import 'package:terepi_seged/services/gnss/gnss_service.dart';
|
||||||
import 'package:terepi_seged/utils/rive_utils.dart';
|
import 'package:terepi_seged/utils/rive_utils.dart';
|
||||||
import 'package:terepi_seged/widgets/coordinate_panel.dart';
|
import 'package:terepi_seged/widgets/coordinate_panel.dart';
|
||||||
import 'package:terepi_seged/widgets/map_bottom_panel.dart';
|
import 'package:terepi_seged/widgets/map_bottom_panel.dart';
|
||||||
@ -27,11 +29,24 @@ class MapSurveyView extends GetView<MapSurveyController> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Stack(children: [
|
return Stack(children: [
|
||||||
SharedMapWidget(
|
SharedMapWidget(
|
||||||
|
controls: const MapControls(),
|
||||||
mapController: controller.mapController,
|
mapController: controller.mapController,
|
||||||
|
isFollowing: controller.isMapMoveToCenter,
|
||||||
|
initialCenter: LatLng(
|
||||||
|
// ← nem fix érték
|
||||||
|
controller.currentLatitude.value != 0.0
|
||||||
|
? controller.currentLatitude.value
|
||||||
|
: 47.5,
|
||||||
|
controller.currentLongitude.value != 0.0
|
||||||
|
? controller.currentLongitude.value
|
||||||
|
: 19.0,
|
||||||
|
),
|
||||||
|
initialZoom: controller.currentZoom.value,
|
||||||
currentZoom: controller.currentZoom,
|
currentZoom: controller.currentZoom,
|
||||||
onZoomIn: controller.mapZoomIn,
|
onZoomIn: controller.mapZoomIn,
|
||||||
onZoomOut: controller.mapZoomOut,
|
onZoomOut: controller.mapZoomOut,
|
||||||
onCenterOnGps: controller.isMapMoveToCenter,
|
onPositionChanged: controller.onMapPositionChanged,
|
||||||
|
onCenterOnGps: controller.setIsMapMoveToCenter,
|
||||||
onLongPress: (tapPosition, point) {
|
onLongPress: (tapPosition, point) {
|
||||||
if (controller.activeEditTool.value == MapEditTool.point) {
|
if (controller.activeEditTool.value == MapEditTool.point) {
|
||||||
controller.saveEditedPoint(point: point);
|
controller.saveEditedPoint(point: point);
|
||||||
@ -59,8 +74,15 @@ class MapSurveyView extends GetView<MapSurveyController> {
|
|||||||
controller.clearNoteItemSelection();
|
controller.clearNoteItemSelection();
|
||||||
},
|
},
|
||||||
layers: [
|
layers: [
|
||||||
Obx(() =>
|
Obx(() {
|
||||||
MarkerLayer(markers: controller.currentLocationMarker.toList())),
|
final isGpsActive = GnssService.to.activeConnectionType.value !=
|
||||||
|
GnssConnectionType.none;
|
||||||
|
if (isGpsActive) {
|
||||||
|
return MarkerLayer(
|
||||||
|
markers: controller.currentLocationMarker.toList());
|
||||||
|
}
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}),
|
||||||
|
|
||||||
// Track polyline
|
// Track polyline
|
||||||
Obx(() {
|
Obx(() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user