波斯马BOSSMA Information Technology

使用Google地图解析服务进行地址解析的改进

发布时间:2011年10月21日 / 分类:JavaScript, PHP / 10,815 次浏览 / 评论

在之前的一篇文章中使用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地址解析服务获取新的坐标。很多容错处理这里就不一一提出来了,具体的系统应该有更细化的目标。

这里只贴出来部分代码,仅供参考。如有问题,请留言。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《使用Google地图解析服务进行地址解析的改进

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论