Skip to main content
 首页 » 编程设计

c#之GeoCoding Maps API 是否仅对网站有效

2024年02月05日38luoye11

我有一个当前运行 .Net Framework 4.6.1 并在 Visual Studio 2015 中维护的 Windows 窗体 (WinForm) 计费产品。

我们被要求修改获取物理地址并返回纬度/经度网格坐标的映射工具。

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

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> 

可以在 Windows 窗体应用程序中使用 Google GeoCoding API 吗?

请您参考如下方法:

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

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

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

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