Flutter地理编码插件scrumlab_geocoder的使用

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

Flutter地理编码插件scrumlab_geocoder的使用

scrumlab_geocoder 是一个用于实现正向和逆向地理编码的 Flutter 插件。通过该插件,您可以将地址转换为坐标(正向地理编码),或将坐标转换为地址(逆向地理编码)。

使用方法

首先,确保在 pubspec.yaml 文件中添加了以下依赖项:

dependencies:
  scrumlab_geocoder: ^版本号

然后运行 flutter pub get 来安装插件。

接下来,导入 package:scrumlab_geocoder/scrumlab_geocoder.dart 并使用 Geocoder.localGeocoder.google 来访问地理编码服务。

示例代码

正向地理编码(从地址到坐标)

import 'package:scrumlab_geocoder/scrumlab_geocoder.dart';

void main() async {
  // 输入地址查询
  final query = "1600 Amphitheatre Parkway, Mountain View";
  
  // 执行正向地理编码
  var addresses = await Geocoder.local.findAddressesFromQuery(query);
  var first = addresses.first;
  
  // 输出结果
  print("${first.featureName} : ${first.coordinates}");
}

逆向地理编码(从坐标到地址)

import 'package:scrumlab_geocoder/scrumlab_geocoder.dart';

void main() async {
  // 输入坐标
  final coordinates = new Coordinates(1.10, 45.50);
  
  // 执行逆向地理编码
  var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
  var first = addresses.first;
  
  // 输出结果
  print("${first.featureName} : ${first.addressLine}");
}

完整示例 Demo

以下是一个完整的 Flutter 应用程序示例,展示如何使用 scrumlab_geocoder 插件进行地理编码。

示例代码文件:main.dart

import 'dart:async';

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

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

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

class AppState extends InheritedWidget {
  const AppState({
    Key? key,
    required this.mode,
    required Widget child,
  }) : super(
          key: key,
          child: child,
        );

  final Geocoding mode;

  static AppState of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<AppState>()!;
  }

  [@override](/user/override)
  bool updateShouldNotify(AppState old) => mode != old.mode;
}

class GeocodeView extends StatefulWidget {
  GeocodeView();

  [@override](/user/override)
  _GeocodeViewState createState() => _GeocodeViewState();
}

class _GeocodeViewState extends State<GeocodeView> {
  _GeocodeViewState();

  final TextEditingController _controller = TextEditingController();

  List<Address> results = [];

  bool isLoading = false;

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

    try {
      var geocoding = AppState.of(context).mode;
      var results = await geocoding.findAddressesFromQuery(_controller.text);
      this.setState(() {
        this.results = results;
      });
    } catch (e) {
      print("Error occurred: $e");
    } finally {
      this.setState(() {
        this.isLoading = false;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return 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: AddressListView(
            this.isLoading,
            this.results,
          ),
        ),
      ],
    );
  }
}

class ReverseGeocodeView extends StatefulWidget {
  ReverseGeocodeView();

  [@override](/user/override)
  _ReverseGeocodeViewState createState() => _ReverseGeocodeViewState();
}

class _ReverseGeocodeViewState extends State<ReverseGeocodeView> {
  final TextEditingController _controllerLongitude = TextEditingController();
  final TextEditingController _controllerLatitude = TextEditingController();

  _ReverseGeocodeViewState();

  List<Address> results = [];

  bool isLoading = false;

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

    try {
      var geocoding = AppState.of(context).mode;
      var longitude = double.parse(_controllerLongitude.text);
      var latitude = double.parse(_controllerLatitude.text);
      var results = await geocoding
          .findAddressesFromCoordinates(Coordinates(latitude, longitude));
      this.setState(() {
        this.results = results;
      });
    } catch (e) {
      print("Error occurred: $e");
    } finally {
      this.setState(() {
        this.isLoading = false;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
      Card(
        child: Padding(
          padding: const EdgeInsets.all(10.0),
          child: Row(
            children: <Widget>[
              Expanded(
                child: Column(
                  children: <Widget>[
                    TextField(
                      controller: _controllerLatitude,
                      decoration: InputDecoration(
                        hintText: "Latitude",
                      ),
                    ),
                    TextField(
                      controller: _controllerLongitude,
                      decoration: InputDecoration(
                        hintText: "Longitude",
                      ),
                    ),
                  ],
                ),
              ),
              IconButton(
                icon: Icon(Icons.search),
                onPressed: () => search(),
              )
            ],
          ),
        ),
      ),
      Expanded(
        child: AddressListView(
          this.isLoading,
          this.results,
        ),
      ),
    ]);
  }
}

class _MyAppState extends State<MyApp> {
  Geocoding geocoding = Geocoder.local;

  final Map<String, Geocoding> modes = {
    "Local": Geocoder.local,
    "Google (distant)": Geocoder.google("<API-KEY>"),
  };

  void _changeMode(Geocoding mode) {
    this.setState(() {
      geocoding = mode;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return AppState(
      mode: this.geocoding,
      child: MaterialApp(
        home: DefaultTabController(
          length: 2,
          child: Scaffold(
            appBar: AppBar(
              title: Text('Geocoder'),
              actions: <Widget>[
                PopupMenuButton<Geocoding>(
                  // 弹出菜单
                  onSelected: _changeMode,
                  itemBuilder: (BuildContext context) {
                    return modes.keys.map((String mode) {
                      return CheckedPopupMenuItem<Geocoding>(
                        checked: modes[mode] == this.geocoding,
                        value: modes[mode],
                        child: Text(mode),
                      );
                    }).toList();
                  },
                ),
              ],
              bottom: TabBar(
                tabs: [
                  Tab(
                    text: "Query",
                    icon: Icon(Icons.search),
                  ),
                  Tab(
                    text: "Coordinates",
                    icon: Icon(Icons.pin_drop),
                  ),
                ],
              ),
            ),
            body: TabBarView(
              children: <Widget>[
                GeocodeView(),
                ReverseGeocodeView(),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


scrumlab_geocoder 是一个用于 Flutter 的地理编码插件,它可以帮助你将地址转换为地理坐标(经度和纬度),或者将地理坐标转换为地址。以下是使用 scrumlab_geocoder 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 scrumlab_geocoder 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  scrumlab_geocoder: ^0.0.1  # 请确保使用最新版本

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

2. 导入包

在你的 Dart 文件中导入 scrumlab_geocoder

import 'package:scrumlab_geocoder/scrumlab_geocoder.dart';

3. 地理编码(地址转坐标)

使用 Geocoder 类将地址转换为地理坐标:

void getCoordinatesFromAddress() async {
  Geocoder geocoder = Geocoder();
  String address = "1600 Amphitheatre Parkway, Mountain View, CA";

  try {
    Coordinates coordinates = await geocoder.getCoordinatesFromAddress(address);
    print("Latitude: ${coordinates.latitude}, Longitude: ${coordinates.longitude}");
  } catch (e) {
    print("Error: $e");
  }
}

4. 反向地理编码(坐标转地址)

使用 Geocoder 类将地理坐标转换为地址:

void getAddressFromCoordinates() async {
  Geocoder geocoder = Geocoder();
  double latitude = 37.4220041;
  double longitude = -122.0862462;

  try {
    Address address = await geocoder.getAddressFromCoordinates(latitude, longitude);
    print("Address: ${address.addressLine}");
  } catch (e) {
    print("Error: $e");
  }
}

5. 处理结果

getCoordinatesFromAddress 方法返回一个 Coordinates 对象,包含 latitudelongitude

getAddressFromCoordinates 方法返回一个 Address 对象,包含 addressLinelocalityadminAreacountryName 等字段。

6. 错误处理

在使用地理编码服务时,可能会遇到网络问题或无效的地址/坐标。确保在 try-catch 块中处理可能出现的异常。

7. 其他功能

scrumlab_geocoder 插件可能还提供其他功能,如批量地理编码、设置语言偏好等。请参考插件的官方文档或源代码以获取更多信息。

8. 注意事项

  • 确保在使用地理编码服务时,设备已连接到互联网。
  • 某些地理编码服务可能对请求频率有限制,因此请合理使用。

示例代码

以下是一个完整的示例代码,展示了如何使用 scrumlab_geocoder 进行地理编码和反向地理编码:

import 'package:flutter/material.dart';
import 'package:scrumlab_geocoder/scrumlab_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: [
              ElevatedButton(
                onPressed: getCoordinatesFromAddress,
                child: Text('Get Coordinates from Address'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: getAddressFromCoordinates,
                child: Text('Get Address from Coordinates'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void getCoordinatesFromAddress() async {
    Geocoder geocoder = Geocoder();
    String address = "1600 Amphitheatre Parkway, Mountain View, CA";

    try {
      Coordinates coordinates = await geocoder.getCoordinatesFromAddress(address);
      print("Latitude: ${coordinates.latitude}, Longitude: ${coordinates.longitude}");
    } catch (e) {
      print("Error: $e");
    }
  }

  void getAddressFromCoordinates() async {
    Geocoder geocoder = Geocoder();
    double latitude = 37.4220041;
    double longitude = -122.0862462;

    try {
      Address address = await geocoder.getAddressFromCoordinates(latitude, longitude);
      print("Address: ${address.addressLine}");
    } catch (e) {
      print("Error: $e");
    }
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!