You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中借助Google Maps API为存储的地点Item添加位置信息?

解决方法:获取地点经纬度并存入Item

你当前调用的是Google Places Autocomplete API,这个接口仅返回地点建议和对应的place_id,并不包含具体的经纬度信息。要获取位置坐标并存入你的Item,需要分两步走:


步骤1:解析Autocomplete响应,提取place_id

首先你需要完善Autocomplete API的响应解析,拿到每个建议地点的place_id。这里以System.Text.Json为例(如果用Newtonsoft.Json逻辑类似):

search.TextChanged += async (sender, e) => 
{
    try 
    {
        if (DatabaseManager.IsOnline()) 
        {
            var searchBar = (SearchBar)sender;
            // 注意:要对搜索文本进行URL编码,避免特殊字符导致请求失败
            var encodedInput = Uri.EscapeDataString(searchBar.Text);
            var url = $"https://maps.googleapis.com/maps/api/place/autocomplete/json?input={encodedInput}&types=geocode&key={API_KEY}";
            
            var client = new HttpClient();
            var json = await client.GetStringAsync(url);
            
            // 解析Autocomplete响应,提取place_id
            var autoCompleteResponse = JsonSerializer.Deserialize<AutoCompleteResponse>(json);
            if (autoCompleteResponse?.Predictions != null && autoCompleteResponse.Predictions.Any())
            {
                // 这里取第一个建议的地点,你也可以让用户选择具体项
                var firstPrediction = autoCompleteResponse.Predictions.First();
                var placeId = firstPrediction.PlaceId;
                
                // 步骤2:用place_id调用Place Details API获取经纬度
                await GetPlaceDetailsAndSaveToItem(placeId);
            }
        }
    }
    catch (Exception ex)
    {
        // 处理异常:网络错误、API调用失败等
        Console.WriteLine($"Error: {ex.Message}");
    }
};

需要定义对应的模型类来解析JSON:

// Autocomplete API响应模型
public class AutoCompleteResponse
{
    [JsonPropertyName("predictions")]
    public List<PlacePrediction> Predictions { get; set; }
}

public class PlacePrediction
{
    [JsonPropertyName("place_id")]
    public string PlaceId { get; set; }
    
    [JsonPropertyName("description")]
    public string Description { get; set; }
}

// Place Details API响应模型
public class PlaceDetailsResponse
{
    [JsonPropertyName("result")]
    public PlaceResult Result { get; set; }
}

public class PlaceResult
{
    [JsonPropertyName("geometry")]
    public PlaceGeometry Geometry { get; set; }
}

public class PlaceGeometry
{
    [JsonPropertyName("location")]
    public PlaceLocation Location { get; set; }
}

public class PlaceLocation
{
    [JsonPropertyName("lat")]
    public double Latitude { get; set; }
    
    [JsonPropertyName("lng")]
    public double Longitude { get; set; }
}

步骤2:调用Place Details API获取经纬度并存入Item

实现GetPlaceDetailsAndSaveToItem方法,用拿到的place_id请求详细信息,提取经纬度后存入你的Item对象:

private async Task GetPlaceDetailsAndSaveToItem(string placeId)
{
    var client = new HttpClient();
    var detailsUrl = $"https://maps.googleapis.com/maps/api/place/details/json?place_id={placeId}&key={API_KEY}";
    
    var detailsJson = await client.GetStringAsync(detailsUrl);
    var detailsResponse = JsonSerializer.Deserialize<PlaceDetailsResponse>(detailsJson);
    
    if (detailsResponse?.Result?.Geometry?.Location != null)
    {
        var location = detailsResponse.Result.Geometry.Location;
        
        // 假设你的Item类有Latitude和Longitude属性
        var yourItem = new Item();
        yourItem.Latitude = location.Latitude;
        yourItem.Longitude = location.Longitude;
        yourItem.PlaceName = detailsResponse.Result.Name; // 也可以存入地点名称
        
        // 这里添加保存Item的逻辑,比如存入数据库或本地存储
        // DatabaseManager.SaveItem(yourItem);
    }
}

注意事项

  • URL编码:一定要对搜索输入文本做Uri.EscapeDataString处理,避免空格、特殊字符导致请求URL无效。
  • API权限:确保你的Google Cloud项目已经启用了Places API,并且API_KEY拥有对应的调用权限,同时注意配额限制。
  • 用户选择:上面的示例直接取了第一个建议地点,实际场景中你可能需要把所有建议展示给用户,让用户选择后再去获取详情。
  • 异常处理:要完善异常捕获,处理网络中断、API返回错误(比如无效的place_id、密钥错误)等情况。

内容的提问来源于stack exchange,提问作者user8495266

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:50