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

g6baxovj  于 2023-01-18  发布在  .NET
关注(0)|答案(3)|浏览(199)

我有一个大约16000条记录的数据库,我喜欢通过每个地址,并得到他们的纬度和经度值。
我试过将所有记录导出到Excel工作表中,然后创建一个宏来拥有LAT和lang值。它适用于80%的地址,但谷歌MapAPI将返回比必应Map更多的结果,因为我已经尝试了谷歌Map中的几个地址(不适用于必应Map),谷歌正在返回准确的值。
我喜欢使用API来获取纬度和经度值,因为它每天的请求数限制为25 k。
我已经得到了这个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>
wsewodh2

wsewodh21#

Google地理编码的使用限制是2,500(不是您所说的25k)。
Google地理编码API具有以下限制:每24小时2 500次请求。
Google Maps API for Business客户有更高的限制:每24小时100,000个请求。
这里是关于SO中的my question
您的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/天,并将其保存在数据库中。

vaj7vani

vaj7vani2#

您需要为每个地址调用此函数,然后存储结果long和lat。您还需要限制请求(可能使用setTimeout()),因为API也有一个rate limit。您每秒只能发出这么多请求。
请记住,地理编码服务结果的存储和后续显示违反了Google的服务条款。根据第10.1.3 c节,您将违反许可协议而不付费订阅。
(c)禁止内容的批量下载或批量馈送。您使用本服务的方式不得使您或任何其他人获得任何内容的批量下载或批量馈送,包括但不限于数字纬度或经度坐标、图像、可见Map数据或地点数据(包括企业名录)。例如,您不得提供使用MapAPI中包含的内容的批量地理编码服务。
我认为16k坐标肯定会算作批量。

deyfvvtc

deyfvvtc3#

我们可以使用以下代码直接在C#中对地址进行地理编码。循环通过Excel记录,并将地址转换为以下格式:“1600+圆形剧场+百老汇,+山景+视图,+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。根据您的需要与Google联系。

还添加线程睡眠1或2毫秒,只是为了确保我们没有超载的谷歌服务器。

相关问题