Flutter地理编码插件geocode的使用
Flutter地理编码插件geocode的使用
Geocode library
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})
- 将一对
latitude
和longitude
坐标转换为实际地址。
- 将一对
-
Forward Geocode:
Future<Coordinates> forwardGeocoding({String address})
- 将地址转换为一对
latitude
和longitude
坐标。
- 将地址转换为一对
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
以上就是geocode
插件的详细使用说明及示例代码。希望对您有所帮助!如果有任何问题,欢迎随时提问。
更多关于Flutter地理编码插件geocode的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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.xml
和Info.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),
),
],
),
),
),
);
}
}
注意
- 权限请求:在实际应用中,你需要处理权限请求逻辑,确保在尝试获取位置信息之前用户已经授予了相应的权限。
- 错误处理:添加适当的错误处理逻辑,以处理地理编码失败的情况。
- 插件依赖:上述示例中使用了
location
插件来获取当前位置,你需要确保也添加了该依赖并在pubspec.yaml
中进行了配置。
这个示例展示了如何使用geocoding
插件进行基本的地理编码操作。根据你的实际需求,你可能需要调整代码以满足特定要求。