繁体   English   中英

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

[英]Get the latitude and longitude of multiple addresses using Google API

我有一个包含大约 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>

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

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

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

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

谷歌地理编码的使用限制是 2,500(不是你所说的 25k)。

Google Geocoding API 有以下限制:每 24 小时 2,500 个请求。

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

这是关于SO的问题。

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

但是,如果您从后面的代码中使用地理编码 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 并将它们保存在数据库中。

我们可以使用以下代码直接在 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;
                    }
                }

            }
        }
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM