具体需求:根据地理坐标:39.831782,116.347120,向用户展示地理位置:丰台区
我们可以参考百度,阿里等的web服务api进行逆地理编码。
阿里:http://gc.ditu.aliyun.com/jsdoc/geocode_api.html#a1_5
百度:http://developer.baidu.com/map/index.php?title=webapi/guide/webservice-geocoding
百度地图Geocoding API是一套免费对外开放的API,无使用次数限制。但是它必须首先申请一个ak(即获取密钥),返回的数据支持json和xml格式。
它的逆地理编码请求如下:
http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderReverse&location=39.983424,116.322987&output=json&pois=1
http://api.map.baidu.com/geocoder/v2/?ak=E4805d16520de693a3fe707cdc962045&callback=renderReverse&location=39.983424,116.322987&output=xml&pois=1
http://gc.ditu.aliyun.com/regeocoding?l=39.938133,116.395739&type=001
其中的
type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)它返回的结果如下:
{
"queryLocation":[39.938133,116.395739],
"addrList":[{
"type":"doorPlate",
"status":1,
"name":"地安门外大街31号",
"admCode":"110102",
"admName":"北京市,西城区",
"nearestPoint":[116.39573,39.93813],
"distance":0.000
}]
}
如果只获得行政区域,可以使用:
http://recode.ditu.aliyun.com/dist_query?l=39.938133,116.395739
返回结果如下:
{
"report":0,
"ad_code":"110102",
"dist":"中国,北京市,北京城区,西城区"
}
接下来,就可以使用HttpURLConnection来获得行政区域,代码示例如下:
@Test
public void rtnArea() throws Exception{
//type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
String path="http://recode.ditu.aliyun.com/dist_query?l=39.938133,116.395739";
//参数直接加载url后面
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(20000);
conn.setDoOutput(true);
conn.connect();
InputStream ins = conn.getInputStream();
String charset = "gb2312";
InputStreamReader inr = new InputStreamReader(ins, charset);
BufferedReader br = new BufferedReader(inr);
String line = "";
StringBuffer sb = new StringBuffer();
do{
sb.append(line);
line = br.readLine();
}while(line != null);
JSONObject obj = JSON.parseObject(sb.toString());
String dist = obj.getString("dist");
System.out.println(dist);//返回结果为“中国,北京市,北京城区,西城区”
}
注意这里的编码为“gb2312”,不是“utf-8”。