Flutter地理位置编码插件location_geocoder的使用

Flutter地理位置编码插件 location_geocoder 的使用

location_geocoder 是一个用于在Flutter应用中进行地理编码和反向地理编码的插件。它可以帮助你将经纬度转换为地址,或将地址转换为经纬度。该插件基于Google Maps API实现。

开始使用

添加依赖

首先,在你的 pubspec.yaml 文件中添加 location_geocoder 依赖:

dependencies:
  flutter:
    sdk: flutter
  location_geocoder: ^latest_version

然后运行 flutter pub get 来安装依赖。

获取API密钥

你需要从 Google Cloud Console 获取一个有效的API密钥,并确保已经启用了 Geocoding APIMaps SDK for Android/iOS

示例代码

以下是一个完整的示例,展示了如何使用 location_geocoder 插件来获取地址和坐标。

完整示例 Demo

import 'dart:developer';

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

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

class MyApp extends StatelessWidget {
  /// Main App
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  /// Sub page
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // TODO: Add your Google Maps API Key here
    const _apiKey = "YOUR_GOOGLE_MAPS_API_KEY";
    final LocatitonGeocoder geocoder = LocatitonGeocoder(_apiKey);

    /// Converts `coordinates` to actual `address` using Google Maps API
    Future<void> _getAddress() async {
      try {
        final address = await geocoder.findAddressesFromCoordinates(Coordinates(9.9312, 76.2673));
        var message = address.first.addressLine;
        if (message == null) return;
        log(message);
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(message),
          ),
        );
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('Something went wrong\nDid you add the API key?'),
          ),
        );
        rethrow;
      }
    }

    /// Converts `address` to actual `coordinates` using Google Maps API
    Future<void> _getLatLang() async {
      try {
        final address = await geocoder.findAddressesFromQuery('kochi,kerala');
        var message = address.first.coordinates.toString();
        log(message);
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(message),
          ),
        );
      } catch (e) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(
            content: Text('Something went wrong\nDid you add the API key?'),
          ),
        );
        rethrow;
      }
    }

    return Scaffold(
      appBar: AppBar(
        title: const Text('Location Geocoder'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextButton(
              onPressed: _getAddress,
              child: const Text('Get Address from Lat/Lng'),
            ),
            TextButton(
              onPressed: _getLatLang,
              child: const Text('Get Coordinates from Address'),
            ),
          ],
        ),
      ),
    );
  }
}

关键点说明

  1. API Key: 在上面的代码中,你需要将 YOUR_GOOGLE_MAPS_API_KEY 替换为你从 Google Cloud Console 获取的实际API密钥。

  2. 地理编码: 使用 findAddressesFromCoordinates 方法可以根据经纬度获取地址信息。例如:

    final address = await geocoder.findAddressesFromCoordinates(Coordinates(9.9312, 76.2673));
    
  3. 反向地理编码: 使用 findAddressesFromQuery 方法可以根据地址查询对应的经纬度。例如:

    final address = await geocoder.findAddressesFromQuery('kochi,kerala');
    

更多关于Flutter地理位置编码插件location_geocoder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理位置编码插件location_geocoder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用location_geocoder插件进行地理位置编码(即根据地址获取经纬度)和逆地理编码(即根据经纬度获取地址)的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了location_geocoder依赖:

dependencies:
  flutter:
    sdk: flutter
  location_geocoder: ^2.0.0  # 请注意版本号,根据实际情况调整

然后,运行flutter pub get来获取依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤使用location_geocoder插件:

1. 导入必要的包

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

注意:location_geocoder通常与geolocator插件一起使用,因为geolocator可以帮助你获取设备的当前位置。

2. 获取设备位置权限和当前位置

Future<Position> _getCurrentLocation() async {
  bool serviceEnabled;
  LocationPermission permission;

  // 测试位置服务是否可用
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    return Future.error('位置服务不可用');
  }

  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission == LocationPermission.denied) {
      return Future.error('位置权限被拒绝');
    }
  }

  if (permission == LocationPermission.deniedForever) {
    // 处理权限被永久拒绝的情况
    return Future.error('位置权限被永久拒绝');
  }

  // 获取当前位置
  return await Geolocator.getCurrentPosition(
    desiredAccuracy: LocationAccuracy.high,
  );
}

3. 使用location_geocoder进行地理编码和逆地理编码

void _geocodeAndReverseGeocode() async {
  // 获取当前位置
  Position position = await _getCurrentLocation();

  // 创建Geocoder实例
  Geocoder geocoder = GeocoderPlatform();

  // 逆地理编码:根据经纬度获取地址
  List<Placemark> placemarks = await geocoder.placemarkFromCoordinates(
    position.latitude,
    position.longitude,
  );

  placemarks.forEach((Placemark placemark) {
    print("${placemark.locality}, ${placemark.postalCode}, ${placemark.country}");
  });

  // 地理编码:根据地址获取经纬度(示例地址)
  String address = "1600 Amphitheatre Parkway, Mountain View, CA";
  List<Location> locations = await geocoder.coordinatesFromAddress(address);

  locations.forEach((Location location) {
    print("${location.latitude}, ${location.longitude}");
  });
}

4. 在Flutter Widget中调用上述函数

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('地理位置编码示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _geocodeAndReverseGeocode().catchError((error) {
                print("Error: $error");
              });
            },
            child: Text('获取位置并编码'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,当你点击按钮时,应用会请求设备的位置权限(如果尚未授予),获取当前位置,然后使用location_geocoder插件进行逆地理编码和地理编码,并将结果显示在控制台中。

请确保在实际应用中处理错误和异常情况,并根据需要更新UI以显示结果或错误信息。

回到顶部