[flutter] 플러터 geolocator를 이용한 반경 내 위치 탐색

플러터는 크로스 플랫폼 모바일 앱 개발을 위한 프레임워크로, 위치 기반 서비스를 구현하는 것은 중요한 요소입니다. 이번 포스트에서는 플러터의 geolocator 패키지를 사용하여 반경 내 위치를 탐색하는 방법에 대해 알아보겠습니다.

geolocator 패키지란?

geolocator는 플러터에서 제공하는 위치 정보를 얻는 라이브러리입니다. 이 패키지를 사용하면 GPS 또는 네트워크를 통해 디바이스의 위치 정보를 얻을 수 있습니다. 반경 내 위치 탐색을 위해서는 geolocator 패키지를 추가하여 사용해야 합니다.

geolocator 패키지 설치하기

프로젝트의 pubspec.yaml 파일에 다음과 같이 geolocator 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^7.0.3  # 최신 버전 확인 필요

터미널에서 flutter pub get 명령을 실행하여 패키지를 다운로드 및 설치합니다.

반경 내 위치 탐색 구현하기

먼저, 위치 권한을 얻기 위해 android/app/src/main/AndroidManifest.xml 파일에서 다음 코드를 추가합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.your_app">
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
    <application
        ...
    </application>
</manifest>

위치 권한은 안드로이드에서만 필요합니다. iOS는 별도의 설정이 필요하지 않습니다.

다음으로, 위치 정보를 사용할 화면에서 다음 코드를 추가하여 위치를 얻어오는 함수를 작성합니다.

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class MyLocationPage extends StatefulWidget {
  @override
  _MyLocationPageState createState() => _MyLocationPageState();
}

class _MyLocationPageState extends State<MyLocationPage> {
  Position _currentPosition;

  @override
  void initState() {
    super.initState();
    _getCurrentLocation();
  }

  void _getCurrentLocation() async {
    var position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    setState(() {
      _currentPosition = position;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('My Location'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Latitude: ${_currentPosition?.latitude}',
            ),
            Text(
              'Longitude: ${_currentPosition?.longitude}',
            ),
          ],
        ),
      ),
    );
  }
}

위의 코드는 MyLocationPage를 StatefulWidget로 선언하고, initState() 메서드에서 _getCurrentLocation() 함수를 호출하여 위치 정보를 얻어오는 예제입니다. _getCurrentLocation() 함수는 Geolocator.getCurrentPosition() 메서드를 호출하여 위치 정보를 얻어온 후 _currentPosition 변수에 저장합니다. 이후 위젯을 빌드할 때 _currentPosition 값을 화면에 출력합니다.

이제 반경 내 위치 탐색을 위해 Geolocator.distanceBetween() 메서드를 사용하여 현재 위치와 비교할 위치 사이의 거리를 구할 수 있습니다. 예를 들어, 반경 1km 이내에 있는지 확인하려면 다음과 같이 코드를 추가합니다.

void _checkDistance() async {
  var currentPosition = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high);
  
  var targetPosition = Position(
      latitude: 37.5, // 탐색할 위치의 위도
      longitude: 127.0, // 탐색할 위치의 경도
  );
  
  var distance = await Geolocator.distanceBetween(
      currentPosition.latitude, currentPosition.longitude,
      targetPosition.latitude, targetPosition.longitude);
  
  if (distance <= 1000) {  // 1km(1000m) 이내에 있는 경우
    // 반경 내에 위치함
  } else {
    // 반경 밖에 위치함
  }
}

위의 예제에서는 _checkDistance() 함수를 호출하여 현재 위치와 targetPosition의 거리를 구합니다. distanceBetween() 메서드의 인자로는 경도와 위도를 순서대로 전달해야 합니다. 이후 distance 변수의 값으로 반경 1km(1000m) 이내에 있는지 확인할 수 있습니다.

결론

이번 포스트에서는 플러터의 geolocator 패키지를 사용하여 반경 내 위치를 탐색하는 방법에 대해 알아보았습니다. geolocator를 사용하면 모바일 앱에서 위치 기반 서비스를 구현하는 것이 간단하고 편리해집니다. 위 예제를 기반으로 원하는 기능을 추가하여 위치 기반 앱을 개발해보세요!


참고: Geolocator - Flutter.dev