Flutter如何通过经纬度免费获取街道信息
在Flutter中,我想通过经纬度免费获取街道名称等详细信息,有哪些可用的API或方法?Google Maps API需要付费,是否有免费的替代方案?最好能提供具体的代码实现示例。
2 回复
可通过geocoding包实现。使用placemarkFromCoordinates方法传入经纬度,返回包含街道、城市等信息的Placemark对象。需注意:免费服务有调用次数限制,建议缓存结果。
更多关于Flutter如何通过经纬度免费获取街道信息的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中可以通过以下方式免费获取经纬度对应的街道信息:
1. 使用高德地图逆地理编码API(推荐)
高德地图提供免费的逆地理编码服务,每天有5000次免费调用额度。
import 'package:http/http.dart' as http;
import 'dart:convert';
class LocationService {
static const String AMAP_KEY = '你的高德地图API_KEY'; // 需要申请
static Future<Map<String, dynamic>> getAddressFromCoordinates(
double latitude, double longitude) async {
final url = Uri.parse(
'https://restapi.amap.com/v3/geocode/regeo?'
'key=$AMAP_KEY&location=$longitude,$latitude&output=json'
);
try {
final response = await http.get(url);
if (response.statusCode == 200) {
final data = json.decode(response.body);
if (data['status'] == '1') {
return data['regeocode']['addressComponent'];
}
}
throw Exception('获取地址信息失败');
} catch (e) {
throw Exception('网络请求失败: $e');
}
}
}
// 使用示例
void getStreetInfo() async {
try {
final addressInfo = await LocationService.getAddressFromCoordinates(
39.908823, 116.397470
);
print('街道: ${addressInfo['street']}');
print('街道编号: ${addressInfo['streetNumber']}');
print('区县: ${addressInfo['district']}');
print('城市: ${addressInfo['city']}');
} catch (e) {
print('错误: $e');
}
}
2. 使用OpenStreetMap Nominatim API
完全免费的开源解决方案:
Future<Map<String, dynamic>> getOSMAddress(double lat, double lng) async {
final url = Uri.parse(
'https://nominatim.openstreetmap.org/reverse?'
'format=json&lat=$lat&lon=$lng&zoom=18&addressdetails=1'
);
final response = await http.get(url);
if (response.statusCode == 200) {
return json.decode(response.body);
}
throw Exception('获取地址失败');
}
3. 申请高德地图API Key步骤
- 访问高德开放平台 (https://lbs.amap.com)
- 注册账号并实名认证
- 进入控制台创建新应用
- 为应用添加「Web服务」类型的Key
注意事项
- 高德地图有调用频率限制,请合理使用
- OpenStreetMap完全免费但响应较慢
- 生产环境建议添加错误处理和重试机制
- 注意用户隐私和数据安全
推荐使用高德地图API,因为它针对国内地址优化更好,响应速度更快。

