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

时间:2014-01-03 15:15:46

标签: c# javascript asp.net google-maps

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

我已尝试将所有记录导出到Excel工作表中,然后创建一个宏以获得lat和lang值。它适用于80%的地址,但谷歌地图api将返回比Bing地图更多的结果,因为我在谷歌地图中尝试了几个地址(没有使用bing地图),谷歌正在返回准确的值。

我喜欢使用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>

3 个答案:

答案 0 :(得分:0)

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

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

  

(c)没有大量下载或批量内容。您不得以允许您或任何其他人访问任何内容的大量下载或批量订阅的方式使用本服务,包括但不限于数字纬度或经度坐标,图像,可见地图数据,或放置数据(包括商家列表)。例如,您不得提供使用Maps API中包含的内容的批量地理编码服务。

我认为16k坐标肯定会被视为批量。

答案 1 :(得分:0)

地理编码的

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限制,因为它在客户端计算机上运行。

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

答案 2 :(得分:0)

我们可以使用以下代码直接在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对Geo请求/日有限制。请查看此链接以了解使用限制和结算 - https://developers.google.com/maps/documentation/javascript/usage?hl=en。根据您的需求联系谷歌。

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