[flutter] 플러터 geolocator를 이용한 위치 기반 실시간 미세먼지 정보 애플리케이션 개발 방법

안녕하세요! 이번에는 플러터(Flutter)를 이용하여 위치 기반 실시간 미세먼지 정보를 제공하는 애플리케이션을 개발하는 방법에 대해 알아보겠습니다.

Geolocator 라이브러리

먼저, 위치 정보를 가져오기 위해 Geolocator 라이브러리를 사용합니다. Geolocator는 Flutter에서 위치 정보를 쉽게 사용할 수 있도록 도와주는 라이브러리로, GPS를 통해 사용자의 위치를 확인할 수 있습니다.

Geolocator 라이브러리를 사용하기 위해서는 geolocator 패키지를 pubspec.yaml 파일에 추가해야 합니다. 다음은 pubspec.yaml 파일에 geolocator 패키지를 추가하는 예시입니다.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^7.4.0

이제 패키지를 추가했으니, import 'package:geolocator/geolocator.dart';를 통해 라이브러리를 불러옵니다.

위치 정보 가져오기

Geolocator를 사용하여 위치 정보를 가져오는 방법은 아주 간단합니다. 다음은 위치 정보를 가져오는 간단한 예시 코드입니다.

void getLocation() async {
  // 위치 정보를 가져오기 전에 권한을 확인합니다.
  LocationPermission permission = await Geolocator.requestPermission();
  if (permission == LocationPermission.denied) {
    // 권한이 거부된 경우 처리 로직
  } else if (permission == LocationPermission.deniedForever) {
    // 권한이 영구적으로 거부된 경우 처리 로직
  } else {
    // 권한이 허용된 경우 위치 정보를 가져옵니다.
    Position position = await Geolocator.getCurrentPosition();

    // 가져온 위치 정보를 사용하여 추가적인 작업을 수행합니다.
    // ...
  }
}

위 코드에서는 requestPermission 메서드를 사용하여 위치 정보에 대한 권한을 확인하고, 권한이 허용된 경우 getCurrentPosition 메서드를 사용하여 현재 위치를 가져옵니다. 가져온 위치 정보는 Position 객체로 반환됩니다.

위치 정보를 가져오는 동안 비동기 방식을 사용하므로 void 앞에 async를 붙여 비동기 메서드로 선언해야 합니다.

실시간 미세먼지 정보 API 사용

위치 정보를 가져왔으면 이제 해당 위치의 실시간 미세먼지 정보를 가져오는 API를 사용해야 합니다. 현재 대한민국에서 가장 많이 사용되는 실시간 미세먼지 정보 API 중 하나는 ‘에어코리아’ API입니다.

에어코리아 API를 사용하기 위해서는 해당 사이트에 가입하고 API 키를 발급받아야 합니다. API 키를 얻으면 이를 사용하여 해당 위치의 실시간 미세먼지 정보를 가져올 수 있습니다.

API 요청의 URL 형식은 다음과 같습니다.

http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName={측정소명}&dataTerm=daily&pageNo=1&numOfRows=1&ServiceKey={API 키}&ver=1.3&_returnType=json

위 URL에 측정소명과 API 키를 넣으면 해당 위치의 실시간 미세먼지 정보를 가져올 수 있습니다.

애플리케이션 개발

위치 정보와 실시간 미세먼지 정보를 가져오는 기능을 이용해 애플리케이션을 개발해봅시다. 다음은 위치 정보와 실시간 미세먼지 정보를 가져와 화면에 표시하는 간단한 예제 코드입니다.

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Position _currentPosition;
  String _currentAddress;
  String _dustStatus;

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

  void getLocation() async {
    // 위치 정보를 가져오기 전에 권한을 확인합니다.
    LocationPermission permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      // 권한이 거부된 경우 처리 로직
    } else if (permission == LocationPermission.deniedForever) {
      // 권한이 영구적으로 거부된 경우 처리 로직
    } else {
      // 권한이 허용된 경우 위치 정보를 가져옵니다.
      Position position = await Geolocator.getCurrentPosition();

      setState(() {
        _currentPosition = position;
      });

      // 현재 위치로부터 주소 정보를 가져옵니다.
      await getAddress();

      // 가져온 위치 정보를 사용하여 실시간 미세먼지 정보를 가져옵니다.
      await getDustStatus();
    }
  }

  Future<void> getAddress() async {
    List<Placemark> placemarks =
        await Geolocator.placemarkFromCoordinates(_currentPosition.latitude, _currentPosition.longitude);
    _currentAddress = placemarks[0].administrativeArea +
        ' ' +
        placemarks[0].locality +
        ' ' +
        placemarks[0].name;
  }

  Future<void> getDustStatus() async {
    String apiUrl =
        'http://openapi.airkorea.or.kr/openapi/services/rest/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName=&dataTerm=daily&pageNo=1&numOfRows=1&ServiceKey={API 키}&ver=1.3&_returnType=json';

    http.Response response = await http.get(Uri.parse(apiUrl));
    var data = jsonDecode(response.body);
    _dustStatus = data['list'][0]['pm10Grade1h'];
    print('Dust status: $_dustStatus');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Dust Info'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Current Position:',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 10),
              Text(
                _currentAddress ?? 'Loading...',
                style: TextStyle(fontSize: 16),
              ),
              SizedBox(height: 20),
              Text(
                'Dust Status:',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 10),
              Text(
                _dustStatus ?? 'Loading...',
                style: TextStyle(fontSize: 16),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

위 예제 코드에서는 getLocation 메서드를 통해 위치 정보를 가져온 후, getAddress 메서드를 통해 현재 위치의 주소 정보를 가져오고, getDustStatus 메서드를 통해 실시간 미세먼지 정보를 가져옵니다. 이후 화면에 현재 위치와 실시간 미세먼지 정보를 출력합니다.

위 예제 코드에서 {API 키} 부분에 발급받은 에어코리아 API 키를 넣어야 합니다.

마무리

이렇게 플러터의 Geolocator 라이브러리와 에어코리아 API를 활용하여 위치 기반 실시간 미세먼지 정보 애플리케이션을 개발하는 방법을 알아보았습니다. 위 예제 코드를 기반으로 필요한 기능을 추가하면 좀 더 다양한 정보를 제공하는 애플리케이션을 개발할 수 있을 것입니다.

더 자세한 내용은 Geolocator 라이브러리에어코리아 공식 홈페이지를 참고하시기 바랍니다.

감사합니다!