[flutter] 플러터 geolocator와 네이버지도 API를 이용한 길 안내 애플리케이션 개발

지금은 모바일 애플리케이션이 필수가 되어가는 시대입니다. 우리는 위치 정보를 기반으로 한 길 안내 애플리케이션을 개발하여 사용자들에게 편의를 제공할 수 있습니다. 이번 포스트에서는 Flutter의 geolocator 패키지와 네이버지도 API를 이용하여 길 안내 애플리케이션을 개발하는 방법에 대해 알아보겠습니다.

1. geolocator 패키지 설치

첫째로, 우리는 Flutter 애플리케이션에서 위치 정보를 사용할 수 있도록 geolocator 패키지를 설치해야 합니다.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^7.6.0

위와 같이 pubspec.yaml 파일에 geolocator 패키지를 추가하고 flutter packages get 명령어를 실행하여 패키지를 다운로드 받아야 합니다.

2. 위치 권한 체크 및 요청

앱에서 위치 정보를 사용하기 위해서는 사용자의 위치 권한이 필요합니다. geolocator 패키지를 사용하여 위치 권한을 체크하고 요청할 수 있습니다.

import 'package:geolocator/geolocator.dart';

void checkLocationPermission() async {
  LocationPermission permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
  }
  if (permission == LocationPermission.deniedForever) {
    // 위치 권한이 영구적으로 거부됨
    // 처리 로직 추가
  }
  if (permission == LocationPermission.whileInUse ||
      permission == LocationPermission.always) {
    // 위치 권한이 승인됨
    // 처리 로직 추가
  }
}

위의 코드에서는 checkLocationPermission 함수를 작성하여 위치 권한을 체크하고 요청하는 과정을 담고 있습니다. 위치 권한이 승인되었을 때와 거부되었을 때의 처리 로직은 각각 추가해 주시면 됩니다.

3. 현재 위치 가져오기

geolocator 패키지를 사용하여 현재 위치를 가져올 수 있습니다. 현재 위치를 가져오는 방법은 여러 가지가 있지만, 가장 기본적인 방법을 알아보겠습니다.

import 'package:geolocator/geolocator.dart';

void getCurrentLocation() async {
  Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high);
  double latitude = position.latitude;
  double longitude = position.longitude;
  
  // 현재 위치의 위도와 경도를 사용하여 필요한 작업 처리
}

위의 코드에서는 getCurrentPosition 함수를 사용하여 현재 위치를 가져옵니다. desiredAccuracy 매개변수를 사용하여 위치의 정확도를 설정할 수 있습니다. 가져온 위치의 위도와 경도를 사용하여 필요한 작업을 처리할 수 있습니다.

4. 네이버지도 API 사용하기

플러터 애플리케이션에서 네이버지도 API를 사용하여 길 안내 기능을 구현할 수 있습니다. 네이버지도 API를 사용하기 위해서는 네이버 개발자 센터에서 API 키를 발급받아야 합니다.

import 'package:http/http.dart' as http;
import 'dart:convert';

void searchRoute(double startLat, double startLng, double endLat, double endLng) {
  String apiKey = 'API_KEY';
  
  String url =
      'https://naveropenapi.apigw.ntruss.com/map-direction/v1/driving?start=$startLng,$startLng&goal=$endLat,$endLng&option=trafast&format=json';
      
  http.get(Uri.parse(url), headers: {"X-NCP-APIGW-API-KEY-ID": apiKey}).then((
    http.Response response) {
    if (response.statusCode == 200) {
      Map<String, dynamic> data = json.decode(response.body);
      // 응답 데이터를 이용하여 길 안내 정보를 처리
    } else {
      // 응답이 실패한 경우의 처리 로직
    }
  });
}

위의 코드에서는 searchRoute 함수를 작성하여 네이버지도 API를 사용하여 출발지와 도착지 사이의 길 안내 정보를 가져옵니다. startLat, startLng, endLat, endLng 매개변수에 출발지와 도착지의 위도와 경도를 전달하여 API 요청을 보냅니다. 응답 데이터를 이용하여 길 안내 정보를 처리할 수 있습니다.

5. 앱 화면에 길 안내 정보 표시하기

네이버지도 API에서 받은 길 안내 정보를 플러터 앱 화면에 표시해야 합니다.

import 'package:flutter/material.dart';

class DirectionsScreen extends StatefulWidget {
  final List<Steps> steps;
  
  DirectionsScreen({required this.steps});
  
  @override
  _DirectionsScreenState createState() => _DirectionsScreenState();
}

class _DirectionsScreenState extends State<DirectionsScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('길 안내'),
      ),
      body: ListView.builder(
        itemCount: widget.steps.length,
        itemBuilder: (context, index) {
          return ListTile(
            leading: Text('${index + 1}'),
            title: Text('${widget.steps[index].instruction}'),
          );
        },
      ),
    );
  }
}

class Steps {
  final String instruction;
  
  Steps({required this.instruction});
}

위의 코드에서는 DirectionsScreen 클래스를 작성하여 길 안내 정보를 표시하는 화면을 구성합니다. Steps 클래스는 API에서 받은 길 안내 정보를 담는 클래스입니다. ListView.builder를 사용하여 각각의 길 안내 정보를 리스트 형태로 화면에 표시할 수 있습니다.

마무리

지금까지 Flutter의 geolocator 패키지와 네이버지도 API를 이용하여 길 안내 애플리케이션을 개발하는 방법에 대해 알아보았습니다. 위치 권한 체크 및 요청, 현재 위치 가져오기, 네이버지도 API 사용하기, 앱 화면에 길 안내 정보 표시하기의 과정을 순서대로 따라가며 개발하시면 됩니다. 좀 더 심화된 기능을 구현하고 싶다면 API 응답 데이터를 파싱하여 주요 정보를 추출하거나, 지도 위에 경로를 표시하는 등의 추가적인 작업을 할 수 있습니다. 개발을 진행하시면서 어려움이 있다면 공식 문서나 커뮤니티를 참고하여 문제를 해결해보세요. 플러터를 통해 멋진 길 안내 애플리케이션을 개발하시기를 바랍니다!