Flutter地理编码插件geocode的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter地理编码插件geocode的使用

Geocode library

workflow likes popularity pub points

Introduction

geocode包用于执行地理编码请求。它提供了两个方法,可以将坐标转换为位置或将地址转换为坐标。

这是对以下API的基本实现:geocode.xyz。它是免费的,每秒允许一个请求的配额。在上述网站注册以获取API密钥,并将请求数量增加到每秒10个。这些是付费计划,允许每秒更多的请求。有关更多信息,请查看该网站。

Installation

在您的pubspec.yaml文件中添加依赖项:

dependencies:
  geocode: ^1.0.3

然后运行命令:

flutter pub get

Example

下面是一个完整的示例代码,演示了如何使用geocode插件进行正向地理编码(从地址获取经纬度)和反向地理编码(从经纬度获取地址):

main.dart

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: GeoCodeDemo(),
    );
  }
}

class GeoCodeDemo extends StatefulWidget {
  @override
  _GeoCodeDemoState createState() => _GeoCodeDemoState();
}

class _GeoCodeDemoState extends State<GeoCodeDemo> {
  final TextEditingController _addressController = TextEditingController();
  String _latitude = '';
  String _longitude = '';
  String _formattedAddress = '';

  final GeoCode geoCode = GeoCode();

  Future<void> _forwardGeocoding() async {
    try {
      Coordinates coordinates = await geoCode.forwardGeocoding(
        address: _addressController.text,
      );

      setState(() {
        _latitude = coordinates.latitude.toString();
        _longitude = coordinates.longitude.toString();
      });
    } catch (e) {
      print(e);
    }
  }

  Future<void> _reverseGeocoding() async {
    try {
      Address address = await geoCode.reverseGeocoding(
        latitude: double.parse(_latitude),
        longitude: double.parse(_longitude),
      );

      setState(() {
        _formattedAddress = '${address.streetNumber} ${address.streetName}, '
            '${address.city}, ${address.state}, ${address.countryCode}';
      });
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Geocode Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _addressController,
              decoration: InputDecoration(labelText: 'Enter an address'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _forwardGeocoding,
              child: Text('Get Coordinates'),
            ),
            SizedBox(height: 20),
            Text('Latitude: $_latitude'),
            Text('Longitude: $_longitude'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                if (_latitude.isNotEmpty && _longitude.isNotEmpty) {
                  _reverseGeocoding();
                }
              },
              child: Text('Get Address'),
            ),
            SizedBox(height: 20),
            Text('Formatted Address: $_formattedAddress'),
          ],
        ),
      ),
    );
  }
}

Methods

  • Constructor: GeoCode({this.apiKey})

    • 可选参数apiKey用于设置API密钥。
  • Reverse Geocode: Future<Address> reverseGeocoding({double latitude, double longitude})

    • 将一对latitudelongitude坐标转换为实际地址。
  • Forward Geocode: Future<Coordinates> forwardGeocoding({String address})

    • 将地址转换为一对latitudelongitude坐标。

Responses

  • Reverse Geocode

    Attribute Type Description
    elevation double 海拔高度(米)。
    timezone String 时区。
    geoNumber int 地理编号,表示纬度和经度的一个值。附近点将有相似的地理编号。
    streetNumber int 格式化的街道地址编号。
    streetAddress String 格式化的街道地址。
    city String 格式化的城市名称。
    countryCode String 格式化的国家代码。
    countryName String 格式化的国家名称。
    region String 格式化的地区。
    postal String 格式化的邮政编码。
    distance double 结果位置与输入位置之间的距离。
  • Forward Geocode

    Attribute Type Description
    latitude double 纬度坐标值。
    longitude double 经度坐标值。

Exceptions

  • AccountOutOfCreditsException: 账户已用完信用额度。
  • AuthTokenNotFoundException: 未找到身份验证令牌。
  • PostalCodeFormatException: 邮政编码格式不正确。
  • RequestThrottledException: 请求被限制。
  • InvalidQueryException: 提供有效的查询。
  • EmptyResultException: 您的请求未产生任何结果。请检查拼写并重试。
  • UnknownErrorException: 未知错误。

Dependencies

http: '>=0.13.0 <2.0.0'

License

BSD 3-Clause License

以上就是geocode插件的详细使用说明及示例代码。希望对您有所帮助!如果有任何问题,欢迎随时提问。


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

1 回复

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


在Flutter中,geocoding插件可以用于将地理坐标(经纬度)转换为地址(反向地理编码),或将地址转换为地理坐标(正向地理编码)。以下是如何在Flutter项目中使用geocoding插件的示例代码。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  geocoding: ^2.0.0  # 请注意版本号,根据实际情况选择最新版本

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

2. 配置Android和iOS权限

由于地理编码涉及到位置信息,你需要在AndroidManifest.xmlInfo.plist中配置相应的权限。

Android (AndroidManifest.xml)

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <!-- Add the following permissions -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- Other configurations -->

</manifest>

iOS (Info.plist)

Info.plist中添加以下键和值:

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when in use.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location always.</string>
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

3. 使用地理编码插件

以下是一个简单的示例,展示了如何进行正向和反向地理编码:

import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:location/location.dart'; // 用于获取当前位置(可选)

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

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

class _MyAppState extends State<MyApp> {
  List<Placemark> placemarks = [];
  bool _serviceEnabled;
  LocationData _locationData;
  Location _location = Location();

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

  Future<void> _getCurrentLocation() async {
    bool serviceStatus = await Location().serviceEnabled();
    if (!serviceStatus) {
      return Future.error('Location services are disabled.');
    }

    _serviceEnabled = serviceStatus;

    LocationData locationData = await _location.getLocation();
    _locationData = locationData;

    List<Placemark> p = await placemarkFromCoordinates(
      _locationData.latitude!,
      _locationData.longitude!,
    );

    setState(() {
      placemarks = p;
    });
  }

  Future<void> _getFromAddress() async {
    String address = "1600 Amphitheatre Parkway, Mountain View, CA";
    List<Placemark> p = await placemarkFromAddress(address);

    setState(() {
      placemarks = p;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Geocoding Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: _getCurrentLocation,
                child: Text('Get Current Location'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _getFromAddress,
                child: Text('Get Address from Coordinates'),
              ),
              SizedBox(height: 20),
              if (placemarks.isNotEmpty)
                Text(
                  'Placemark: ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}',
                  style: TextStyle(fontSize: 18),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 权限请求:在实际应用中,你需要处理权限请求逻辑,确保在尝试获取位置信息之前用户已经授予了相应的权限。
  2. 错误处理:添加适当的错误处理逻辑,以处理地理编码失败的情况。
  3. 插件依赖:上述示例中使用了location插件来获取当前位置,你需要确保也添加了该依赖并在pubspec.yaml中进行了配置。

这个示例展示了如何使用geocoding插件进行基本的地理编码操作。根据你的实际需求,你可能需要调整代码以满足特定要求。

回到顶部