使用 Google API 获取多个地址的经纬度

Posted

技术标签:

【中文标题】使用 Google API 获取多个地址的经纬度【英文标题】:Get the latitude and longitude of multiple addresses using Google API 【发布时间】:2014-01-21 07:21:19 【问题描述】:

我有一个包含大约 16000 条记录的数据库,我喜欢遍历每个地址并获取它们的纬度和经度值。

我尝试将所有记录导出到 Excel 工作表中,然后创建一个宏来获取 lat 和 lang 值。它适用于 80% 的地址,但 google map api 会返回比 Bing map 更多的结果,因为我在 google map 中尝试了很少的地址(不能使用 bing map)并且 google 正在返回准确的值。

我喜欢使用 Google Map API 来获取纬度和经度值,因为它每天的请求限制为 25k。

我有这个运行良好的 java 脚本,但我不知道如何将它用于多个地址?我可以遍历数据集,但不确定是否需要在代码隐藏页面中针对每个地址调用这个 java 脚本函数?

最好的方法是什么?

<script type="text/javascript">
<!--
    function GetLocation() 
        var geocoder = new google.maps.Geocoder();
        var address = document.getElementById("txtAddress").value;
        geocoder.geocode( 'address': address , function (results, status) 
            if (status == google.maps.GeocoderStatus.OK) 
                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
                alert("Latitude: " + latitude + "\nLongitude: " + longitude);
             else 
                alert("Request failed.")
            
        );
    ;
    //-->
</script>

【问题讨论】:

简单优雅:***.com/a/14355156/4802664 【参考方案1】:

我们可以使用以下代码直接在 c# 中对地址进行地理编码。循环遍历excel记录,将地址转换成如下格式“1600+Amphitheatre+Parkway,+Mountain+View,+CA”。

示例代码:根据您的需要更改此代码

string url = "http://maps.googleapis.com/maps/api/geocode/" + "xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false";

WebResponse response = null;
bool is_geocoded = true;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
response = request.GetResponse();
string lat = "";
string lng = "";
string loc_type = "";
if (response != null)

    XPathDocument document = new XPathDocument(response.GetResponseStream());
    XPathNavigator navigator = document.CreateNavigator();

    // get response status
    XPathNodeIterator statusIterator = navigator.Select("/GeocodeResponse/status");
    while (statusIterator.MoveNext())
    
        if (statusIterator.Current.Value != "OK")
        
            is_geocoded = false;
        
    

    // get results
    if (is_geocoded)
    
        XPathNodeIterator resultIterator = navigator.Select("/GeocodeResponse/result");
        while (resultIterator.MoveNext())
        


            XPathNodeIterator geometryIterator = resultIterator.Current.Select("geometry");
            while (geometryIterator.MoveNext())
            
                XPathNodeIterator locationIterator = geometryIterator.Current.Select("location");
                while (locationIterator.MoveNext())
                
                    XPathNodeIterator latIterator = locationIterator.Current.Select("lat");
                    while (latIterator.MoveNext())
                    
                        lat = latIterator.Current.Value;
                    

                    XPathNodeIterator lngIterator = locationIterator.Current.Select("lng");
                    while (lngIterator.MoveNext())
                    
                        lng = lngIterator.Current.Value;

                    
                    XPathNodeIterator locationTypeIterator = geometryIterator.Current.Select("location_type");
                    while (locationTypeIterator.MoveNext())
                    
                        loc_type = locationTypeIterator.Current.Value;
                    
                

            
        
    

注意: 谷歌对地理请求/天有限制。检查此链接以了解使用限制和计费 - https://developers.google.com/maps/documentation/javascript/usage?hl=en。根据您的需要联系谷歌。

还添加 1 或 2 毫秒的线程睡眠,以确保我们不会超载 google 服务器。

【讨论】:

感谢您的示例。我知道如何从页面后面的代码中做到这一点,但我认为可以在一天内发出 25k 请求只是为了验证旧地址。现在很明显限制每天只有2500个,我想我们会研究营业执照。我们只需要验证 16k 个地址一次,之后 2500 个就足够了。【参考方案2】:

您需要为每个地址调用此函数,然后存储结果的 long 和 lat。您还需要限制请求(可能使用 setTimeout()),因为 API 也有 rate limit。您每秒只能发出这么多请求。

请记住,地理编码服务结果的存储和随后显示违反了 Google 的TOS。根据第 10.1.3 c 节,如果没有付费订阅,您将违反许可协议。

(c) 禁止大量下载或批量提供内容。您使用服务的方式不得让您或任何其他人访问任何内容的大量下载或批量提要,包括但不限于数字纬度或经度坐标、图像、可见地图数据,或放置数据(包括商家信息)。例如,您不得提供使用 Maps API 中包含的内容的批量地理编码服务。

我认为 16k 坐标肯定会算作批量。

【讨论】:

【参考方案3】:

Google Usage Limits 用于地理编码是 2,500(不是您所说的 25k)。

Google 地理编码 API 有以下限制:2,500 每 24 小时的请求次数。

Google Maps API for Business 客户有更高的限制:100,000 每 24 小时的请求次数。

这里是 my question 关于 SO。

您的 JavaScript 代码不会计入 2,500 个限制,因为它是在客户端计算机上运行的。

但是,如果您使用 Geocoding API 从后面的代码进行地理编码,则它计入 2,500 个限制。

protected void Button1_Click(object sender, EventArgs e)

    var uri = "http://maps.googleapis.com/maps/api/geocode/json?address=dallas&sensor=false";
    var result = new WebClient().DownloadString(uri);

回答您的问题

我有大约 16000 条记录的数据库,我喜欢浏览 每个地址并获取它们的纬度和经度值。

最简单的方法是使用 WebClient 和 Geocode 2,500/days 并将它们保存在数据库中。

【讨论】:

•Google 地理编码服务:每天 2,500 个请求•Google Maps Javascript API:每个服务每天最多加载 25,000 个地图。 所以你是说如果你在浏览器中用 javascript 执行所有的地理编码请求,那么 API 对数量没有限制(只有频率)?还是每个客户 2.5k?如果是后者,那么我认为这不会让我对这个问题有所不同。我相信其目的是无论如何都由单个客户执行。 遍历每个地址并获取它们的纬度和经度值是地理编码(不是地图加载)。您想使用 WebClient 并通过 GeoEncode API 从后面的代码中对那些 16000 地址进行地理编码。 @user1263981 我们已经通过电话与 Google 进行了交谈。营业执照费用 每年 17,000 美元。这是我对my question 的更新。你没有很多记录,所以每天运行 2500 条,连续 7 天就可以了。 @Win Again。只是为了澄清。这违反了 API 的 TOS,他们可能会禁止您。就像公布价格一样(当我们为客户许可支付费用时,Google 让我们意识到了这一点)。

以上是关于使用 Google API 获取多个地址的经纬度的主要内容,如果未能解决你的问题,请参考以下文章

Google Geolocation API - 使用经度和纬度在文本框中获取地址?

使用google API访问地址,经纬度状态

如何使用 Google API 从具有坐标的数据集中获取地址?

根据地址api获取纬度经度[关闭]

python中的地理编码使用API​​密钥从地址获取纬度和经度

使用地理编码器和 android Google Maps API v2 获取纬度和经度