地址解析与逆解析

来源:互联网 发布:java h5微信支付demo 编辑:程序博客网 时间:2024/06/05 06:03

地址解析与地址逆解析参考百度地图开放平台

说明:以下是百度地图开放平台官方说明,耐心看下去会有代码示例。

参考路径
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

什么是Geocoding?

Geocoding API 是一类接口,用于提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务,用户可以使用C# 、C++、Java等开发语言发送请求且接收JSON、XML的返回数据。

Geocoding API 已全面支持HTTP/HTTPS两种请求形式。后文介绍中以HTTP请求为例。

这里写图片描述

Geocoding API包括地址解析和逆地址解析功能:

地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”。同时,地理编码也支持名胜古迹、标志性建筑名称直接解析返回百度经纬度,例如:“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885” ,通用的POI检索需求,建议使用Place API。

逆地理编码:即逆地址解析,由百度经纬度信息得到结构化地址信息,例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。
坐标系说明

WGS84:为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。

GCJ02:是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。

BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标

Geocoding API默认输入输出坐标类型为百度坐标(BD09),同时可通过参数(”coord_type”,”ret_coordtype”)控制输入输出坐标类型。

输入坐标支持以上三种坐标系,输出坐标支持-国测局坐标(GCJ02)和百度坐标(BD09)

注意:不同类型坐标如需转换,请使用百度地图开放平台提供的标准坐标转换接口。请勿使用其他渠道提供的坐标转换方法,以免影响坐标转换精度。
使用说明

使用限制:

使用Geocoding API服务前,首先需要登录API控制台申请密钥ak。

每个开发者账号每天调用Geocoding API服务的总次数(即配额)是有限的。

每个开发者账号每分钟调用Geocoding API服务的次数(即并发量)是有限的。

若需更高配额和并发量,请申请开发者认证以获取更高配额和更及时的技术支持。

同一个帐号下的HTTP/HTTPS请求,配额、并发共享。

默认配额及并发量说明如下:
分类 未认证 个人认证 企业认证
日配额(次) 6,000 300,000 3000,000
分钟并发量(次/分钟) 3,000 10,000 60,000

使用方法:

第一步:申请ak(即获取密钥),若无百度账号则首先需要注册百度账号。

第二步,拼写发送HTTP/HTTPS请求的url,注意需使用第一步申请的ak。

第三步,接收HTTP/HTTPS请求返回的数据(支持json和xml格式)。

Hello, World示例:

发送一个地址是“百度大厦”的请求,返回该地址对应的地理坐标。示例URL如下:

http://api.map.baidu.com/geocoder/v2/?address=北京市海淀区上地十街10号&output=json&ak=E4805d16520de693a3fe707cdc962045&callback=showLocation

服务地址

服务地址:

http://api.map.baidu.com/geocoder/v2/

组成说明:

域名:api.map.baidu.com

服务名:geocoder

服务版本号:较之前版本,v2版本新增参数。
通用接口参数
参数 是否必须 默认值 格式举例 含义
output 否 xml json或xml 输出格式为json或者xml
ret_coordtype 否 无 gcj02ll、bd09mc 可选参数,添加后返回国测局经纬度坐标或百度米制坐标
ak 是 无 E4805d16520de693a3fe707cdc962045 用户申请注册的key,自v2开始参数修改为“ak”,之前版本参数为“key”
sn 否 无 若用户所用ak的校验方式为sn校验时该参数必须。 (sn生成算法)
callback 否 无 callback=showLocation(JavaScript函数名) 将json格式的返回值通过callback函数返回以实现jsonp功能
地理编码服务

地理编码专属请求参数:
参数 是否必须 默认值 格式举例 含义 参数
address 是 无 北京市海淀区上地十街10号

根据指定地址进行坐标的反定向解析,最多支持100个字节输入。

可以输入三种样式的值,分别是:
1、标准的地址信息,如北京市海淀区上地十街十号
2、名胜古迹、标志性建筑物,如天安门,百度大厦
3、支持“路与路交叉口”描述方式,如北一环路和阜阳路的交叉路口

注意:后两种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。

最多支持84个字节
city 否 “北京市” “广州市”

地址所在的城市名。用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用。

对于address字段可能会出现中文或其它一些特殊字符(如:空格),对于类似的字符要进行编码处理,编码成 UTF-8 字符的二字符十六进制值,凡是不在下表中的字符都要进行编码。
字符集合 字符
URL非保留字 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 - _ . ~
URL保留字 ! * ’ ( ) ; : @ & = + $ , / ? % # [ ]

附注:

1、javascript中一般采用encodeURIComponent函数对特殊字符进行编码;

2、Java中可以使用函数URLEncoder.encode对特殊字符进行编码;

3、C#中可以使用函数HttpUtility.UrlEncode对特殊字符进行编码;

4、php中可以使用函数urlencode对特殊字符进行编码。

地理编码示例:

以下是关于地理编码参数使用方法的示例。发送请求显示结果的JavaScript代码此处查看。
请求示例:对北京市百度大厦进行地理编码查询;

http://api.map.baidu.com/geocoder/v2/?callback=renderOption&output=json&address=百度大厦&city=北京市&ak=您的ak

地理编码返回结果字段:
名称 类型 说明
status Int 返回结果状态值, 成功返回0,其他值请查看下方返回码状态表。
location object 经纬度坐标
lat float 纬度值
lng float 经度值
precise Int 位置的附加信息,是否精确查找。1为精确查找,即准确打点;0为不精确,即模糊打点。
confidence Int 可信度,描述打点准确度
level string 地址类型

json格式的返回值:

不带回调函数的值没有renderOption&&renderOption()

特别说明: 若解析status字段为OK,但结果内容为空,原因分析及可尝试方法: 1、地址库里无此数据,本次结果为空; 2、加入city字段重新解析; 3、将过于详细或简单的地址更改至省市区县街道重新解析。
逆地理编码服务

逆地理编码专属请求参数:
参数 是否必须 默认值 格式举例 含义
coordtype 否 bd09ll bd09ll 百度经纬度坐标 坐标的类型,目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标)、wgs84ll( GPS经纬度)
location 是 无 38.76623,116.43213

lat<纬度>,lng<经度>
根据经纬度坐标获取地址。支持批量,多组坐标间用|分隔,单次请求最多解析20组坐标。超过20组取前20组解析。批量解析需使用batch参数。批量解析仅召回行政区划数据。
batch 否 false true、false 请求为批量时必须,batch=true;若batch=false或为空,请求只解析第一组坐标。批量解析仅召回行政区划数据。
extensions_poi 否 无 null 区别于pois参数,pois=0,不召回pois数据,但底层仍访问poi相应服务;extensions_poi=null时,底层不调用poi相关服务,可减少服务访问时延。
extensions_road 否 false false、true 当取值为true时,召回坐标周围最近的3条道路数据。区别于行政区划中的street参数(该参数为行政区划中的街道,和普通道路不对应)。
pois 否 0 0 是否显示指定位置周边的poi,0为不显示,1为显示。当值为1时,默认显示周边1000米内的poi。
radius 否 1000 500 poi召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。
latest_admin 否 0 0、1 是否访问最新版行政区划数据,1(访问),0(不访问)

状态字段:
名称 类型 说明
status constant 返回结果状态值, 成功返回0,其他值请查看附录。
location lat 纬度坐标
lng 经度坐标
formatted_address 结构化地址信息
business 所在商圈信息,如 “人民大学,中关村,苏州街”
addressComponent country 国家
province 省名
city 城市名
district 区县名
street 街道名
street_number 街道门牌号
adcode 行政区划代码
country_code 国家代码
direction 和当前坐标点的方向,当有门牌号的时候返回数据
distance 和当前坐标点的距离,当有门牌号的时候返回数据
pois(周边poi数组) addr 地址信息
cp 数据来源
direction 和当前坐标点的方向
distance 离坐标点距离
name poi名称
poiType poi类型,如’ 办公大厦,商务大厦’
point poi坐标{x,y}
tel 电话
uid poi唯一标识
zip 邮编
parent_poi 该poi对应的主点poi(如,海底捞的主点为上地华联,该字段则为上地华联的poi信息。如无,该字段为空),包含子字段和poi基础召回字段相同。
roads(周边road数组) name 道路名称
distance 道路相对坐标点的距离。
sematic_description constant 当前位置结合POI的语义化结果描述。
poiRegions direction_desc 命中区域面与坐标位置关系
name 命中区域面名称
tag 命中区域面类型
cityCode 城市id(不再更新)

json示例:

http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=39.983424,116.322987&output=json&pois=1&ak=您的ak

xml示例:

http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=39.983424,116.322987&output=xml&pois=1&ak=您的ak

特别说明:

1、因为Geocoding和反Geocoding使用的门址数据以及算法都不是一样的,所以会出现不能一一对应的现象。

2、逆地址解析location参数传入的参数格式是(纬度lat,经度lng)。
返回码状态表
返回码 定义
0 正常
1 服务器内部错误
2 请求参数非法
3 权限校验失败
4 配额校验失败
5 ak不存在或者非法
101 服务禁用
102 不通过白名单或者安全码不对
2xx 无权限
3xx 配额错误
升级说明

v2版本较之v1版本,功能更新详见更新日志。若需查看v1文档,请点击目录 “Geocoding APIv1.0”。
若v1版本升级至v2版本,地理/逆地理编码的请求url,参数:新增版本号“v2”,修改“key”为“ak”。v2不兼容v1版本的key,若需升级,请重新获取密钥。

代码部分

一、地址解析
//地址转换ak
public static final String KEY_1 = “eIs3GtIksL1sf6FEeo2MDsqhwhOG6lW2”;

这里写图片描述

这里写代码片/**      * 返回输入地址的经纬度坐标      * key lng(经度),lat(纬度)      */      public Map<String,String> getGeocoderLatitude(String address){          BufferedReader in = null;          try {              //将地址转换成utf-8的16进制              address = URLEncoder.encode(address, "UTF-8");              //如果有代理,要设置代理,没代理可注释              //System.setProperty("http.proxyHost","192.168.1.188");              //System.setProperty("http.proxyPort","3128");              URL tirc = new URL("http://api.map.baidu.com/geocoder/v2/?callback=renderOption&output=json&address="+ address +"&ak="+ KEY_1);              in = new BufferedReader(new InputStreamReader(tirc.openStream(),"UTF-8"));              String res;              StringBuilder sb = new StringBuilder("");              while((res = in.readLine())!=null){                  sb.append(res.trim());              }              String str = sb.toString();              Map<String,String> map = null;              if(StringUtils.isNotEmpty(str)){                  int lngStart = str.indexOf("lng\":");                  int lngEnd = str.indexOf(",\"lat");                  int latEnd = str.indexOf("},\"precise");                  if(lngStart > 0 && lngEnd > 0 && latEnd > 0){                      String lng = str.substring(lngStart+5, lngEnd);                      String lat = str.substring(lngEnd+7, latEnd);                      map = new HashMap<String,String>();                      map.put("lng", lng);                      map.put("lat", lat);                      return map;                  }              }          }catch (Exception e) {              e.printStackTrace();          }finally{              try {                  in.close();              } catch (IOException e) {                  e.printStackTrace();              }          }          return null;      }  

成功后返回的就是所传地址的经纬度。

二、逆地址解析

 //逆地址转换akpublic static final String KEY_2 = "ec0MDHC5Hci0zDf20pZNBH0r2p42Hiqg";  

这里写图片描述

这里写代码片/**     * 根据经纬度你解析地址     */    public Map<String, String> testPost(String lat, String lng) throws IOException {        URL url = new URL("http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location="+ lat + "," + lng + "&output=json&pois=1&ak="+KEY_2);        URLConnection connection = url.openConnection();        /**         * 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。         * 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做:         */        connection.setDoOutput(true);        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "utf-8");        // remember to clean up        out.flush();        out.close();        // 一旦发送成功,用以下方法就可以得到服务器的回应:        String res;        InputStream l_urlStream;        l_urlStream = connection.getInputStream();        BufferedReader in = new BufferedReader(new InputStreamReader(                l_urlStream,"UTF-8"));        StringBuilder sb = new StringBuilder("");        while ((res = in.readLine()) != null) {            sb.append(res.trim());        }        String str = sb.toString();        Map<String,String> map = new HashMap<String,String>();        if(StringUtils.isNotEmpty(str)) {            int addStart = str.indexOf("formatted_address\":");            int addEnd = str.indexOf("\",\"business");            if(addStart > 0 && addEnd > 0) {                String address = str.substring(addStart+20, addEnd);                map.put("address", address);            }            int addss = str.indexOf("city\":");            int added = str.indexOf("\",\"district");            if(addss > 0 && added > 0) {                String city = str.substring(addss+7, added);                map.put("city", city);            }            return map;         }        return null;    }

根据经纬度逆解析成详细地址。

备注:以上是本人在工作中所用的,仅供参考,希望对大家有所帮助。谢谢!