Flutter地理编码插件scrumlab_geocoder的使用
Flutter地理编码插件scrumlab_geocoder的使用
scrumlab_geocoder
是一个用于实现正向和逆向地理编码的 Flutter 插件。通过该插件,您可以将地址转换为坐标(正向地理编码),或将坐标转换为地址(逆向地理编码)。
使用方法
首先,确保在 pubspec.yaml
文件中添加了以下依赖项:
dependencies:
scrumlab_geocoder: ^版本号
然后运行 flutter pub get
来安装插件。
接下来,导入 package:scrumlab_geocoder/scrumlab_geocoder.dart
并使用 Geocoder.local
或 Geocoder.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
更多关于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
对象,包含 latitude
和 longitude
。
getAddressFromCoordinates
方法返回一个 Address
对象,包含 addressLine
、locality
、adminArea
、countryName
等字段。
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");
}
}
}