最近由于需要,完成了一个地址批量解析的工具,有一些收获,在这做一些记录
地址解析分为地址正向解析(从地址得到对应的经纬度)和反向解析(通过经纬度得到对应位置),反响解析还好说,毕竟通过经纬度在地图上进行标注,只要和地图相关的软件都支持,如fusionMap和ammapMap。
地址正向解析,简称地址解析,我使用的是google提供的api。 具体内容可参考官网。其中有 Api2和Api1,对于免费用户我感觉区别不大。
我写了两个程序,一个是服务器端,一个是客户端。当时写flex客户端是为了进行测试。服务器端才是为了批量解析,但是在批量解析过程中,碰到一个问题: 解析地址过多会出现错误,刚开始我加入了间隔2秒,没有效果,当时猜测:难道自己解析太频繁,google把我给封了,后来在不同的时间段运行效果并未好转,后来从新将间隔改为2min才搞定,切记切记。而且有些不能批量解析的,在客户端手动却能实现解析,很奇怪。
客户端代码:
var geocoder:ClientGeocoder = new ClientGeocoder();
geocoder.geocode(address.text);
geocoder.addEventListener(
GeocodingEvent.GEOCODING_SUCCESS,
function(event:GeocodingEvent):void {
var placemarks:Array = event.response.placemarks;
for(var i:int=0;ivar placemark:Placemark=placemarks[0];
result.text=event.target+": "+placemark.address+","+placemark.point;trace(event.target+": "+placemark.address+","+placemark.point);}});geocoder.addEventListener(GeocodingEvent.GEOCODING_FAILURE,function(event:GeocodingEvent):void {trace(event.target+"Geocoding failed");result.text=event.toString();
});loader.addEventListener(Event.COMPLETE,function(event:Event) {var loader:URLLoader=URLLoader(event.target);var datas:XML=XML(loader.data) ;
for each (var data:XML in datas.province) {geocoder.geocode(data.@NAME);}});
说明: 通过text组件输入地址,在EventComplete事件中实现监听,完成地址的解析。
服务器端代码:
private String geoCodeByGoogle(String address) throws IOException, ClientProtocolException { String result="解析失败"; String key="ABQIAAAA0AL-b41DvVq2yvYvsRu7iBTwM0brOpm-All5BF6PoaKBxRWWERQkkZEcWl9sx6981Q5nE3NYh4sd7w"; StringBuilder urlStr=new StringBuilder("http://maps.google.com/maps/geo"); urlStr.append("?q="+address); urlStr.append("&sensor=false&output=csv"); urlStr.append("&key="+key); HttpClient client=new DefaultHttpClient(); if(logger.isDebugEnabled()) { logger.debug("url字符串"+urlStr.toString()); } //System.out.println("url字符串"+urlStr.toString()); HttpGet get=new HttpGet(urlStr.toString()); HttpResponse response=client.execute(get); HttpEntity entity=response.getEntity(); if(entity != null) { result=EntityUtils.toString(entity); entity.consumeContent(); } if(logger.isDebugEnabled()) { logger.debug("google传回结果"+result); } return result; }