GeoCoding Maps API 只对网站有效吗?

Is the GeoCoding Maps API only valid for websites?

我有一个 Windows Forms (WinForm) 计费产品,目前 运行 .Net Framework 4.6.1 并在 Visual Studio 2015 年维护。

我们被要求修改采用物理地址和 returns Latitude/Longitude 网格坐标的映射工具。

我为自己准备了一个测试密钥,并将其应用到我的代码中。

private void GoogleGeoCodeSearch(LocationRecord currentRecord, String key)
{
    var street = String.Format("{0}", currentRecord.street_name).Trim();
    var city = String.Format("{0}", currentRecord.city).Trim();
    var state = String.Format("{0}", currentRecord.state).Trim();
    var postal = String.Format("{0}", currentRecord.postal_code).Trim();
    var country = (state.Length == 2 && STATES.Contains(state)) ? "USA" : String.Format("{0}", currentRecord.country).Trim();
    var address = String.Format("{0}, {1}, {2}, {3} {4}", street, city, state, postal, country).Replace("-", String.Empty).Replace("'", String.Empty);
    var requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false&region={1}&key={2}", Uri.EscapeDataString(address), country, key);

    var request = System.Net.WebRequest.Create(requestUri);
    using (var response = request.GetResponse())
    {
        var ok = false;
        var title = String.Format("{0}::Google API WebRequest", _title);
        var source = "response stream";
        var element = "XDocument";
        var xdoc = System.Xml.Linq.XDocument.Load(response.GetResponseStream());
        if (xdoc != null)
        {
            source = element;
            element = "GeocodeResponse";
            var geoResponse = xdoc.Element(element);
            if (geoResponse != null)
            {
                source = element;
                element = "result";
                var result = geoResponse.Element(element);
                if (result != null)
                {
                    source = element;
                    element = "geometry";
                    var geometry = result.Element(element);
                    if (geometry != null)
                    {
                        source = element;
                        element = "location";
                        var locationElement = geometry.Element(element);
                        if (locationElement != null)
                        {
                            source = element;
                            element = "lat/lng";
                            var lat = locationElement.Element("lat");
                            var lng = locationElement.Element("lng");
                            if ((lat != null) && (lng != null))
                            {
                                Double latitude, longitude;
                                Double.TryParse(lat.Value, out latitude);
                                Double.TryParse(lng.Value, out longitude);
                                SaveCoordinates(currentRecord, latitude, longitude);
                                ok = true;
                            }
                        }
                    }
                } else
                {
                    result = geoResponse.Element("status");
                    if (result != null)
                    {
                        var msg = result.Value;
                        result = geoResponse.Element("error_message");
                        if (result != null)
                        {
                            msg = String.Format("{0}{1}{1}{2}", msg, Environment.NewLine, result.Value);
                        }
                        MessageBox.Show(msg, title, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
            }
        }
        if (!ok)
        {
            MessageBox.Show(String.Format("No [{0}] information found in [{1}] element.", element, source), title, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

每次我到达这一行,我都会收到 NULL 回复:

var result = geoResponse.Element(element);

这是解释:

<GeocodeResponse>
  <status>REQUEST_DENIED</status>
  <error_message>The provided API key is invalid.</error_message>
</GeocodeResponse>

Google 地理编码 API 可以在 Windows 表单应用程序中使用吗?

当然,您可以在 WinForms 应用程序中使用地理编码 API。对于 API 发送请求的内容无关紧要。重要的是请求参数正确,APIkey有效

事实上,我刚刚用我自己的 API 密钥测试了您的代码,它工作正常,这让我觉得您的 API 密钥有问题。

因此尝试按照以下步骤创建一个新的:

  1. 登录developer console
  2. Select 您的项目或创建一个新项目 (1)
  3. 转到 Library (2) 并搜索 Geocoding API (3)
  4. 进入后点击 Enable (4) 启用它
  5. 转到凭据并点击 Create credentials 按钮 (5)
  6. Select API key 来自凭据类型 (6)