Flutter中如何通过名称、经纬度坐标获取Google PlaceID?
解决方法
问题原因
- 你当前使用的
geolocator库中placemarkFromCoordinates方法调用的是设备系统原生的逆地理编码能力,返回的Placemark结构体本身没有设计Google PlaceID字段,自然无法获取对应值。 - 要获取Google官方的PlaceID,必须调用Google Maps平台提供的公开API接口。
实现步骤
1. 前置准备
- 登录Google Cloud控制台,开通「Geocoding API」或「Places API」服务,生成对应的API密钥。
- 在Flutter项目的
pubspec.yaml中添加依赖:
dependencies: flutter: sdk: flutter geolocator: ^最新稳定版本 google_maps_webservice: ^0.0.20-nullsafety.5 # 封装好的Google Maps服务调用库
2. 代码修改
你可以直接在现有逻辑基础上新增调用Google API的逻辑,示例代码如下:
首先导入对应库:
import 'package:google_maps_webservice/geocoding.dart';
然后修改_getAddressFromLatLng方法:
// 替换为你自己的Google Cloud API密钥 const googleApiKey = "你的API密钥"; _getAddressFromLatLng() async { try { // 原有获取Placemark逻辑可保留,用于基础地址展示 List<Placemark> p = await geolocator.placemarkFromCoordinates( _currentPosition.latitude, _currentPosition.longitude); Placemark place = p[0]; // 新增调用Google Geocoding API获取PlaceID final geocoding = GoogleMapsGeocoding(apiKey: googleApiKey); final response = await geocoding.searchByLocation( Location(lat: _currentPosition.latitude, lng: _currentPosition.longitude), ); String placeId = ""; if (response.isOkay && response.results.isNotEmpty) { // 取返回的第一个结果的PlaceID placeId = response.results.first.placeId; } setState(() { _currentAddress = "${place.locality}, ${place.postalCode}, ${place.country}\nPlaceID: $placeId"; }); } catch (e) { print(e); } }
注意事项
- 调用Google API需要设备网络可以正常访问Google服务,中国大陆地区使用需要做特殊网络处理。
- 务必在Google Cloud控制台对API密钥做访问限制,限定仅你的应用可以调用,避免密钥泄露产生超额费用。
- 要在Android和iOS的配置文件中添加对应的网络权限,避免接口调用被拦截。
内容的提问来源于stack exchange,提问作者Apurv Jha
相关产品推荐
相关产品推荐

