Flutter地理编码与反地理编码插件geocoder的使用

Flutter地理编码与反地理编码插件geocoder的使用

geocoder 是一个用于实现地理编码(Geocoding)和反地理编码(Reverse Geocoding)功能的 Flutter 插件。它允许开发者将地址转换为经纬度坐标(地理编码),或将经纬度坐标转换为地址信息(反地理编码)。

使用方法

首先,导入 package:geocoder/geocoder.dart,然后使用 Geocoder.local 来访问设备系统提供的地理编码服务。

示例代码

以下是一个完整的示例代码,展示了如何使用 geocoder 插件进行地理编码和反地理编码。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _query = "";
  String _result = "";

  Future<void> _geocodeFromQuery() async {
    try {
      // 从查询字符串获取地址信息
      var addresses = await Geocoder.local.findAddressesFromQuery(_query);
      var first = addresses.first;
      setState(() {
        _result = "${first.featureName} : ${first.coordinates}";
      });
    } catch (e) {
      setState(() {
        _result = "Error: $e";
      });
    }
  }

  Future<void> _geocodeFromCoordinates() async {
    try {
      // 从经纬度获取地址信息
      var coordinates = new Coordinates(1.10, 45.50);
      var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
      var first = addresses.first;
      setState(() {
        _result = "${first.featureName} : ${first.addressLine}";
      });
    } catch (e) {
      setState(() {
        _result = "Error: $e";
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Geocoder Example"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              onChanged: (value) => _query = value,
              decoration: InputDecoration(hintText: "Enter an address or coordinates"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _geocodeFromQuery,
              child: Text("Geocode from Query"),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _geocodeFromCoordinates,
              child: Text("Geocode from Coordinates"),
            ),
            SizedBox(height: 20),
            Text(_result),
          ],
        ),
      ),
    );
  }
}

完整示例 DEMO

以下是一个完整的示例 DEMO,展示了如何在 Flutter 应用中集成 geocoder 插件,并实现地理编码和反地理编码功能。

示例代码

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:geocoder/geocoder.dart';
import 'package:geocoder/services/base.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController _controller = TextEditingController();
  List<Address> results = [];
  bool isLoading = false;

  Future search() async {
    setState(() {
      isLoading = true;
    });

    try {
      var addresses = await Geocoder.local.findAddressesFromQuery(_controller.text);
      setState(() {
        results = addresses;
      });
    } catch (e) {
      print("Error occurred: $e");
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Geocoder Example"),
      ),
      body: Column(
        children: <Widget>[
          Card(
            child: Padding(
              padding: const EdgeInsets.all(10.0),
              child: Row(
                children: <Widget>[
                  Expanded(
                    child: TextField(
                      controller: _controller,
                      decoration: InputDecoration(hintText: "Enter an address"),
                    ),
                  ),
                  IconButton(
                    icon: Icon(Icons.search),
                    onPressed: search,
                  ),
                ],
              ),
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: results.length,
              itemBuilder: (context, index) {
                var address = results[index];
                return ListTile(
                  title: Text("${address.featureName} : ${address.addressLine}"),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


在Flutter中,geocoder 插件可以帮助你进行地理编码(将地址转换为经纬度)和反地理编码(将经纬度转换为地址)。以下是如何使用 geocoder 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  geocoder: ^0.2.1

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

2. 导入包

在你的 Dart 文件中导入 geocoder 包:

import 'package:geocoder/geocoder.dart';

3. 地理编码(地址转经纬度)

地理编码是将地址转换为经纬度的过程。以下是一个示例:

Future<void> geocodeAddress(String address) async {
  try {
    // 地理编码,将地址转换为经纬度
    var addresses = await Geocoder.local.findAddressesFromQuery(address);
    var first = addresses.first;

    print("Latitude: ${first.coordinates.latitude}");
    print("Longitude: ${first.coordinates.longitude}");
  } catch (e) {
    print("Error: $e");
  }
}

你可以调用这个函数并传入一个地址字符串来获取经纬度。

4. 反地理编码(经纬度转地址)

反地理编码是将经纬度转换为地址的过程。以下是一个示例:

Future<void> reverseGeocode(double latitude, double longitude) async {
  try {
    // 反地理编码,将经纬度转换为地址
    var coordinates = Coordinates(latitude, longitude);
    var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
    var first = addresses.first;

    print("Address: ${first.addressLine}");
  } catch (e) {
    print("Error: $e");
  }
}

你可以调用这个函数并传入经纬度来获取地址。

5. 使用示例

以下是一个完整的示例,展示如何在 Flutter 应用中使用 geocoder 插件进行地理编码和反地理编码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Geocoder Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  geocodeAddress("1600 Amphitheatre Parkway, Mountain View, CA");
                },
                child: Text('Geocode Address'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  reverseGeocode(37.4219999, -122.0840575);
                },
                child: Text('Reverse Geocode'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> geocodeAddress(String address) async {
    try {
      var addresses = await Geocoder.local.findAddressesFromQuery(address);
      var first = addresses.first;

      print("Latitude: ${first.coordinates.latitude}");
      print("Longitude: ${first.coordinates.longitude}");
    } catch (e) {
      print("Error: $e");
    }
  }

  Future<void> reverseGeocode(double latitude, double longitude) async {
    try {
      var coordinates = Coordinates(latitude, longitude);
      var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
      var first = addresses.first;

      print("Address: ${first.addressLine}");
    } catch (e) {
      print("Error: $e");
    }
  }
}
回到顶部