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
更多关于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");
}
}
}