You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用C#结合Google API向谷歌地图添加批量数据库地点

使用C#结合Google API批量向谷歌地图添加地点的实现方案

兄弟,刚好我之前做过类似的需求,给你梳理下完整的实现流程,一步步来就没问题~

一、前期准备工作

首先得搞定谷歌那边的API权限和配置:

  • 登录Google Cloud Console,创建一个新项目(或者用现有项目),找到并启用Places API(如果是商家自有地点,更推荐用Google My Business API,后面会说区别)。
  • 生成API密钥,记得给密钥设置使用限制(比如绑定服务器IP、限制API调用范围),防止被盗用产生不必要的费用。
  • 检查你的数据库数据:谷歌对提交的地点信息要求很严,除了你现有的经纬度、名称、网站、电话,必须补充完整的地址信息(街道、城市、国家代码、邮编),不然提交大概率会被审核拒绝。

二、核心实现思路

我们要用到Google Places API的places:create接口(V1版本,是目前的最新稳定版),流程是:

  1. 把数据库里的地点数据转换成谷歌要求的JSON格式请求体。
  2. 用C#的HttpClient批量发送POST请求到API端点。
  3. 处理返回的操作ID,后续可以用它查询地点的审核状态。

三、C#代码实现

1. 定义请求模型类

先写几个对应谷歌API请求格式的模型类,方便序列化JSON:

public class PlaceRequest
{
    public string DisplayName { get; set; }
    public AddressComponent Address { get; set; }
    public Location Location { get; set; }
    public string[] FormattedAddress { get; set; }
    public string WebsiteUri { get; set; }
    public string[] PhoneNumbers { get; set; }
    public string LanguageCode { get; set; } = "zh-CN"; // 根据你的地区调整,比如en-US
}

public class AddressComponent
{
    public string StreetAddress { get; set; }
    public string Locality { get; set; } // 城市名称
    public string RegionCode { get; set; } // 国家代码,比如CN、US
    public string PostalCode { get; set; } // 邮编
}

public class Location
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

2. 封装API调用服务

写一个服务类来处理单个地点提交和批量提交的逻辑:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // 需要通过NuGet安装Newtonsoft.Json包

public class GooglePlacesService
{
    private readonly HttpClient _httpClient;
    private readonly string _apiKey;

    public GooglePlacesService(string apiKey)
    {
        _apiKey = apiKey;
        _httpClient = new HttpClient();
        _httpClient.BaseAddress = new Uri("https://places.googleapis.com/v1/");
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    // 提交单个地点
    public async Task<string> AddSinglePlaceAsync(PlaceRequest place)
    {
        try
        {
            var requestJson = JsonConvert.SerializeObject(place);
            var content = new StringContent(requestJson, Encoding.UTF8, "application/json");

            var response = await _httpClient.PostAsync($"places:create?key={_apiKey}", content);
            response.EnsureSuccessStatusCode(); // 如果请求失败,直接抛出异常

            var responseContent = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<dynamic>(responseContent);
            return result.name.ToString(); // 返回谷歌生成的操作ID,用于后续查询审核状态
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine($"提交地点【{place.DisplayName}】失败: {ex.Message}");
            return null;
        }
    }

    // 批量提交地点
    public async Task<List<string>> BatchAddPlacesAsync(List<PlaceRequest> places)
    {
        var operationIds = new List<string>();
        foreach (var place in places)
        {
            var opId = await AddSinglePlaceAsync(place);
            if (!string.IsNullOrEmpty(opId))
            {
                operationIds.Add(opId);
            }
            // 谷歌API有请求频率限制,这里加1秒延迟,避免被限流
            await Task.Delay(1000);
        }
        return operationIds;
    }
}

3. 使用示例

从你的数据库读取数据,转换成PlaceRequest列表,然后调用服务提交:

// 这里模拟从数据库读取的地点数据,实际项目中替换成你的数据库查询逻辑
var placesFromDb = new List<PlaceRequest>
{
    new PlaceRequest
    {
        DisplayName = "我的咖啡小店",
        Address = new AddressComponent
        {
            StreetAddress = "朝阳区建国路88号",
            Locality = "北京",
            RegionCode = "CN",
            PostalCode = "100022"
        },
        Location = new Location
        {
            Latitude = 39.9088,
            Longitude = 116.4325
        },
        WebsiteUri = "https://www.mycoffeeshop.com",
        PhoneNumbers = new[] {"13900139000"}
    },
    // 更多地点数据...
};

// 初始化服务,替换成你的API密钥
var placesService = new GooglePlacesService("你的Google API密钥");
var submittedOperationIds = await placesService.BatchAddPlacesAsync(placesFromDb);

// 保存这些操作ID,后续可以用来查询审核状态
foreach (var id in submittedOperationIds)
{
    Console.WriteLine($"地点提交成功,操作ID: {id}");
}

四、关键注意事项

  • API费用与配额:Google Places API是收费服务,记得在Google Cloud Console设置预算预警。另外有请求频率限制,批量提交时一定要加延迟,不然会被谷歌限流甚至封禁密钥。
  • 审核机制:提交的地点不会立刻显示在谷歌地图上,需要经过谷歌的审核。你可以用返回的操作ID调用https://places.googleapis.com/v1/{operationId}?key={apiKey}来查询审核状态。
  • 商家自有地点的替代方案:如果这些地点是你自己的商家店铺,更推荐使用Google My Business API,它专门用于管理商家的谷歌地图信息,功能更全面,但需要OAuth2.0授权(比API密钥复杂一点),而不是简单的API密钥。
  • 数据准确性:一定要确保提交的经纬度、地址、名称等信息完全准确,谷歌的审核很严格,错误的信息会直接被拒绝。

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

火山引擎 最新活动