Flutter와 Google Maps, Location 패키지를 활용하여 간단하게 경로 추적 기능을 구현하는 방법을 정리하겠습니다.
google_maps_flutter
https://pub.dev/packages/google_maps_flutter
Location
https://pub.dev/packages/location
android, ios 설정은 pub.dev의 readme에 있으니 따라 설정하시면 됩니다.
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
GoogleMapController? _controller;
Location _location = Location();
bool _tracking = false; // 경로 추적 상태
List<LatLng> _route = []; // 경로를 저장할 리스트
Set<Polyline> _polylines = {}; // 지도에 표시할 Polyline
@override
void initState() {
super.initState();
}
// 경로 추적 시작
void _startTracking() {
_route.clear(); // 이전 경로 초기화
_polylines.clear(); // 지도에서 경로 초기화
setState(() {
_tracking = true; // 추적 상태로 변경
});
// 위치 추적 시작
_location.onLocationChanged.listen((LocationData currentLocation) {
if (_tracking) {
setState(() {
print("latitude : "+currentLocation.latitude!.toString());
print("longitude : "+currentLocation.longitude!.toString());
LatLng position = LatLng(currentLocation.latitude!, currentLocation.longitude!);
_route.add(position); // 새로운 좌표 추가
_polylines.add(Polyline(
polylineId: PolylineId("route"),
points: _route,
color: Colors.blue,
width: 5,
));
_controller?.animateCamera(CameraUpdate.newLatLng(position)); // 카메라 위치 이동
});
}
});
}
// 경로 추적 중지
void _stopTracking() {
setState(() {
_tracking = false; // 추적 중지 상태로 변경
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("맵 루트 표시 테스트"),
centerTitle: true,
),
body: Column(
children: [
Expanded(
flex: 2,
child: GoogleMap(
initialCameraPosition: CameraPosition(
target: LatLng(35.1691, 129.0874), // 초기 카메라 위치
zoom: 17,
),
myLocationEnabled: true, // 현재 위치 표시
onMapCreated: (GoogleMapController controller) {
_controller = controller;
},
polylines: _polylines, // 경로를 지도에 표시
),
// child: Container(),
),
Expanded(
child: Center(
child: ElevatedButton(
onPressed: _tracking ? _stopTracking : _startTracking,
child: Text(_tracking ? '중지' : '시작'),
),
),
),
],
),
);
}
}
CameraPositionvoid Function(GoogleMapController controller)boolfalsebooltrueSet을 사용해 여러 마커를 추가할 수 있습니다.Set<Marker>Polyline 객체들을 설정합니다Set<Polyline>void Function(CameraPosition position)void Function()booltrueMapTypeMapType.normalMapType.normal : 기본 지도MapType.satellite : 위성 이미지 지도MapType.terrain : 지형 지도MapType.hybrid : 위성과 도로 혼합 지도boolfalsevoid Function(LatLng position)void Function(LatLng position)onLocationChanged 메서드를 사용하여 실시간으로 사용자의 위치 변화를 추적합니다.