在之前的一篇文章中使用google地图API开发了一个“查找指定地点1公里范围之内的地铁站”的程序,其中用到了地址解析服务,当时通过传递一个地址给google maps api,然后返回一个坐标给程序,这样做逻辑上没有什么问题,但是可能会引起两方面的问题:
1、稳定性
访问解析服务有可能中断,特别是国内;
2、可持续性
解析服务每天只允许2500个请求,高级用户10000个请求,一般人都不是高级用户,如果网站访问量比较大,这就成了一个大问题。
有问题,就要有解决办法。
既然全都是google的问题,那么把坐标数据保存在本地数据库好了,这样出了问题就是自己的的了,而自己的相对是好解决的。
当然坐标数据还得从google查询,一开始想的是通过ajax的方式来更新坐标:在页面上输出数据库中保存的坐标信息,如果判断为空,则调用google解析服务获取坐标,然后通过ajax的方式更新数据库,这样正常情况下没问题。但是通过ajax的方式更新坐标很危险,说不定谁调用接口更新下,就废了;即使采用防范跨站提交的措施,也不能百分百的保证没问题吧。
既然客户端的方式解决不了,那就用服务器端来处理吧:首先查询数据,如果坐标没有设置,请求google地理位置解析服务,获取坐标,更新数据,将坐标发到页面进行标注处理。
这是从网上找到的一个php程序,用户请求地址解析的:
$url = 'http://maps.google.com/maps/geo?q=EC3M,+UK&output=csv&sensor=false'; $data = @file_get_contents($url); $result = explode(",", $data); echo $result[0]; // status code echo $result[1]; // accuracy echo $result[2]; // 纬度 echo $result[3]; // 经度
参数q:要解析的地址,空格需要用%20或+号替换。
参数output:输出格式为csv就好了,方便处理。
不明白的请看原文。
原文地址:http://stackoverflow.com/questions/2296087/using-php-and-google-maps-api-to-work-out-distance-between-2-post-codes-uk
为了更保险,在页面中增加一个判断,如果服务器端获取坐标处理失败,发到页面的坐标将是空的,这时候再通过javascript去请求解析。
function markAddress() { // 已经有坐标,直接标注 var lat='34.0711174'; var lng='-118.2574005'; if(lat!=""&&lng!=""){ var myLatlng = new google.maps.LatLng(lat, lng); map.setCenter(myLatlng); var marker = new google.maps.Marker({ map: map, position: myLatlng }); // 返回,不再进行解析 return; } // 再获取地址,请求地理位置解析 var address = $("address:eq(0)").text(); geocoder.geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { map.setCenter(results[0].geometry.location); var marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert("地址解析失败,原因: " + status); } }); }
这个处理还可以再完善下,如果地址变更了,在服务器端程序中同时调用google地址解析服务获取新的坐标。很多容错处理这里就不一一提出来了,具体的系统应该有更细化的目标。
这里只贴出来部分代码,仅供参考。如有问题,请留言。
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论