GeoCoding Maps API仅对网站有效吗?

时间:2016-12-21 15:02:38

标签: c# google-maps google-geocoding-api

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

我们被要求修改采用物理地址并返回纬度/经度网格坐标的地图工具。

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

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 GeoCoding API可以在Windows窗体应用程序中使用吗?

1 个答案:

答案 0 :(得分:4)

当然,您可以使用WinForms应用程序中的地理编码API。对于API来说,发送请求并不重要。重要的是请求参数是正确的,API密钥是有效的。

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

因此,请尝试按照以下步骤创建新的

  1. 登录developer console
  2. 选择您的项目或创建一个新项目(1)
  3. 转到Library(2)并搜索Geocoding API(3)
  4. 在内部点击Enable(4)启用它
  5. 转到凭据并点击Create credentials按钮(5)
  6. 从凭据类型(6)
  7. 中选择API key

    enter image description here

    enter image description here

    enter image description here