移动互联网发展到今天,地图应用已非常广泛,比如:
- 实时定位:打开地图App,它会自动定位你的坐标,并显示出具体地址信息。
- 车辆/资产追踪:监控系统收到一个GPS坐标,需要将其转换为“车辆正在京港澳高速保定段”这样的可读信息,方便管理员理解。
- 地图搜索与导航:用户在导航App中输入目的地地址,App将其转换为坐标后才能进行路径规划。
- 物流与配送:将收件人的地址转换为坐标,用于优化配送路线和跟踪。
- 位置服务注册:为商家或服务地点在线上地图进行标注。
- 照片地理标记:用手机拍摄的照片包含了GPS坐标,相册或社交软件可以通过逆地理编码自动为照片添加地点标签
要实现以上功能,采用地理编码、逆地理编码就是最好的解决方法:
- 地理编码,又称经纬度解析,是指将人类可读的地址信息转换为地理坐标(经纬度)
- 逆地理编码,又称经纬度解析,是地理编码的逆向过程,是指将地理坐标(经纬度)转换为人类可读的地址描述的过程
地图基于坐标系,目前主流的坐标系有:
- GCJ02:火星坐标系,国内使用,比如:腾讯、高德
- WGS84 :国际通用坐标系,比如:手机GPS设备、Google
- BD09:百度坐标系
对于开发者,不需要自己建立庞大的地理数据库,而是调用成熟的API服务
本文介绍基于火星坐标系的高德地图和百度坐标系的百度地图
高德地图
地理编码
请求参数
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| address | String | 是 | 规则遵循:国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦,如:北京市朝阳区阜通东大街6号。 |
| city | String | 否 | 可选输入内容包括:指定城市的中文(如北京)、指定城市的中文全拼(beijing)、citycode(010)、adcode(110000),不支持县级市。当指定城市查询内容为空时,会进行全国范围内的地址转换检索。 |
| output | String | 否 | 可选输入内容包括:JSON,XML。设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。 |
| callback | String | 否 | callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效。 |
详细参阅这里
返回样例
{
"msg": "成功",
"success": true,
"code": 200,
"taskNo": "74848319667949359984",
"charge": true,
"data": {
"count": 1,//返回结果数目
"geocodes": [//地理编码信息列表
{
"country": "中国",//国家
"formatted_address": "浙江省杭州市萧山区美哉美城",//格式化的地址
"province": "浙江省",//地址所在的省份名
"city": "杭州市",//地址所在的市区名称
"citycode": "0571",//城市编码
"district": "萧山区",//地址所在的区
"street": "街道",//街道
"number": "门牌",//门牌
"adcode": "330109",//区域编码
"location": "120.256544,30.224111",//经度,纬度
"level": "兴趣点",//匹配级别
}
]
}
}
逆地理编码
请求参数
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| location | String | 是 | 传入内容规则:经度在前,纬度在后,经纬度间以“,”分割,经纬度小数点后不要超过 6 位。 |
| poitype | String | 否 | 支持传入POI TYPECODE及名称;支持传入多个POI类型,多值间用"|"分隔 |
| radius | String | 否 | 搜索半径。radius取值范围在0~3000,默认是1000。单位:米 |
| extensions | String | 否 | 返回结果控制。extensions 参数默认取值是 base,也就是返回基本地址信息; extensions 参数取值为 all 时会返回基本地址信息、附近 POI 内容、道路信息以及道路交叉口信息。 |
| roadlevel | String | 否 | 道路等级。以下内容需要 extensions 参数为 all 时才生效。 可选值:0,1 当roadlevel=0时,显示所有道路 当roadlevel=1时,过滤非主干道路,仅输出主干道路数据 |
| output | String | 否 | 返回数据格式类型。可选输入内容包括:JSON,XML。设置 JSON 返回结果数据将会以JSON结构构成;如果设置 XML 返回结果数据将以 XML 结构构成。 |
| callback | String | 否 | 回调函数。callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效 |
| homeorcorp | String | 否 | 是否优化POI返回顺序。以下内容需要 extensions 参数为 all 时才生效。 homeorcorp 参数的设置可以影响召回 POI 内容的排序策略,目前提供三个可选参数: 0:不对召回的排序策略进行干扰。 1:综合大数据分析将居家相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 2:综合大数据分析将公司相关的 POI 内容优先返回,即优化返回结果中 pois 字段的poi顺序。 |
详细参阅这里
返回样例
{
"msg": "成功",
"success": true,
"code": 200,
"taskNo": "25247068960117401139",
"charge": true,
"data": {
"regeocodes": [{
//逆地理编码列表
"formatted_address": "浙江省杭州市萧山区盈丰街道顺发·美哉美城",//坐标地址
"addressComponent": {
//地址元素列表
"country": "中国",//国家
"province": "浙江省",//坐标点所在省名称
"citycode": "0571",//城市编码
"city": "杭州市",//坐标点所在城市名称
"adcode": "330109",//行政区编码
"towncode": "330109015000",//乡镇街道编码
"district": "萧山区",//坐标点所在区
"township": "盈丰街道",//坐标点所在乡镇/街道
"seaArea": "所属海域信息",//所属海域信息
"neighborhood": {
//社区信息列表
"name": [],//社区名称
"type": []//POI类型
},
"building": {
//楼信息列表
"name": [],//建筑名称
"type": []//类型
},
"streetNumber": {
//门牌信息列表
"number": "281号",//门牌号
"distance": "52.8425",//门牌地址到请求坐标的距离
"street": "民和路",//街道名称
"location": "120.257076,30.224231",//坐标点 经度,纬度
"direction": "东"//方向
},
"businessAreas": [//经纬度所属商圈列表
{
"businessArea":"",//商圈信息
"name": "宁围",//商圈名称
"location": "120.273765,30.225767",//商圈中心点经纬度 经度,纬度
"id": "330109"//商圈所在区域的adcode
}
]
},
"roads": [//道路信息列表 请求参数 extensions 为 all 时返回
{
"id": "",//道路id
"name": "",//道路名称
"distance": "",//道路到请求坐标的距离 米
"direction": "",//方位
"location": ""//坐标点 经度,纬度
}
],
"roadinters": [//道路交叉口列表 请求参数 extensions 为 all 时返回
{
"distance": "",//交叉路口到请求坐标的距离 米
"direction": "",//方位
"location": "",//路口经纬度 经度,纬度
"first_id": "",//第一条道路名称
"first_name": "",//第二条道路id
"second_id": "",//第二条道路名称
"second_name": ""//第二条道路id
}
],
"pois":[//poi信息列表
{
"id": "",//poi的id
"name": "",//poi点名称
"type": "",//poi类型
"tel": "",//电话
"distance": "",//该POI的中心点到请求坐标的距离 米
"direction": "",//方向
"address": "",//poi地址信息
"location": "",//坐标点 经度,纬度
"businessarea": ""//poi所在商圈名称
}
],
"aois":[//aoi信息列表
{
"id": "",//aoi的id
"name": "",//aoi点名称
"adcode": "",//所属 aoi 所在区域编码
"location": "",//所属 aoi 中心点坐标 经度,纬度
"area": "",//所属aoi点面积
"distance": ""//输入经纬度是否在aoi面之中
}
]
}]
}
}
百度地图
地理编码
请求参数
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| address | String | 是 | 待解析的地址。最多支持84个字节。可以输入两种样式的值,分别是:1、标准的结构化地址信息,北京市海淀区上地十街十号【推荐,地址结构越完整,解析精度越高】2、支持“路与路交叉口”描述方式,如北一环路和阜阳路的交叉路口第二种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。 |
| city | String | 否 | 地址所在的城市名。用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用,但不限制坐标召回城市。 |
| retCoordtype | String | 否 | 添加后返回国测局经纬度坐标或百度米制坐标。示例:gcj02(国测局坐标,仅限中国)、bd09mc(百度墨卡托坐标)。默认bd09ll。 |
| output | String | 否 | 输出格式为json或者xml,默认json |
| callback | String | 否 | 将json格式的返回值通过callback函数返回以实现jsonp功能 |
详细参阅这里
返回样例
{
"charge": true,//计费标志
"code": 200,//返回码,详见返回码说明
"msg": "成功",//返回码对应描述
"taskNo": "340833941206534747872156",//本次请求号
"data": {
"confidence": 75,//描述打点绝对精度(即坐标点的误差范围)。confidence=100,解析误差绝对精度小于20m;confidence≥90,解析误差绝对精度小于50m;confidence≥80,解析误差绝对精度小于100m;confidence≥75,解析误差绝对精度小于200m;confidence≥70,解析误差绝对精度小于300m;confidence≥60,解析误差绝对精度小于500m;confidence≥50,解析误差绝对精度小于1000m;confidence≥40,解析误差绝对精度小于2000m;confidence≥30,解析误差绝对精度小于5000m;confidence≥25,解析误差绝对精度小于8000m;confidence≥20,解析误差绝对精度小于10000m;
"analys_level": "POI",//可以解析地址文本中的最小地址结构,例如问题地址:北京市海淀区北京路百度大厦,analys_level:"POI",能精确理解的地址类型包含: 省 市 区县 乡镇 道路 门址 POI 。
"level": "商务大厦",//可以打点到地址文本中的真实地址结构,例如问题地址:北京市海淀区北京路百度大厦,level:"道路",能精确理解的地址类型,包含:UNKNOWN、国家、省、城市、区县、乡镇、村庄、道路、地产小区、商务大厦、政府机构、交叉路口、商圈、生活服务、休闲娱乐、餐饮、宾馆、购物、金融、教育、医疗 、工业园区 、旅游景点 、汽车服务、火车站、长途汽车站、桥 、停车场/停车区、港口/码头、收费区/收费站、飞机场 、机场 、收费处/收费站 、加油站、绿地、门址
"location": {
"lng": 120.00135828539837,//经度值
"lat": 30.287874445189647 //纬度值
},
"precise": 1,//位置的附加信息,是否精确查找。1为精确查找,即准确打点;0为不精确,即模糊打点。
"comprehension": 35 //描述地址理解程度。分值范围0-100,分值越大,服务对地址理解程度越高(建议以该字段作为解析结果判断标准),当comprehension值为以下值时,对应的准确率如下:comprehension=100,解析误差100m内概率为91%,误差500m内概率为96%;comprehension≥90,解析误差100m内概率为89%,误差500m内概率为96%;comprehension≥80,解析误差100m内概率为88%,误差500m内概率为95%;comprehension≥70,解析误差100m内概率为84%,误差500m内概率为93%;comprehension≥60,解析误差100m内概率为81%,误差500m内概率为91%;comprehension≥50,解析误差100m内概率为79%,误差500m内概率为90%,解析误差:地理编码服务解析地址得到的坐标位置,与地址对应的真实位置间的距离。
}
}
逆地理编码
输入参数
| 名称 | 类型 | 必须 | 说明 |
|---|---|---|---|
| location | String | 是 | 根据经纬度坐标获取地址,格式:纬度,经度。例如:120.067824,31.413068。 |
| coordtype | String | 否 | 坐标的类型,目前支持的坐标类型包括:bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标,仅限中国)、wgs84( GPS经纬度)。默认bd09ll。 |
| retCoordtype | String | 否 | 添加后返回国测局经纬度坐标或百度米制坐标。示例:gcj02(国测局坐标,仅限中国)、bd09mc(百度墨卡托坐标)。默认bd09ll。 |
| extensionsPoi | String | 否 | extensions_poi=0,不召回pois数据。extensions_poi=1,返回pois数据(默认显示周边1000米内的poi),并返回sematic_description语义化数据。 |
| extensionsRoad | String | 否 | 当取值为true时,召回坐标周围最近的3条道路数据。默认false。 |
| extensionsTown | String | 否 | 当取值为true时,行政区划返回乡镇级数据(town),仅国内召回乡镇数据。当取值为false时,行政区划不返回乡镇级数据(town)。默认true。 |
| radius | String | 否 | 以下内容需要 extensionsPoi=1时才生效;poi召回半径,允许设置区间为0-1000米,超过1000米按1000米召回。默认1000。 |
| callback | String | 否 | 将json格式的返回值通过callback函数返回以实现jsonp功能。 |
| poiTypes | String | 否 | 以下内容需要 extensionsPoi=1时才生效;可以选择poi类型召回不同类型的poi,例如poiTypes=酒店,如想召回多个POI类型数据,可以|分割,例如poiTypes=酒店|房地产,不添加该参数则默认召回全部POI分类数据。 |
| language | String | 否 | 指定召回的行政区划语言类型。 召回行政区划语言list(全量支持的语言见示例)。 当language=local时,根据请求中坐标所对应国家的母语类型,自动选择对应语言类型的行政区划召回。目前支持多语言的行政区划区划包含country、province、city、district。包含:el gu en vi ca it iw sv eu ar cs gl id es en-GB ru sr nl pt tr tl lv en-AU lt th ro fil ta fr bg hr bn de hu fa hi pt-BR fi da ja te pt-PT ml ko kn sk zh-CN pl uk sl mr local |
| languageAuto | String | 否 | 当用户指定language参数时,是否自动填充行政区划。1填充,0不填充。填充:当服务按某种语言类别召回时,若某一行政区划层级的语言数据未覆盖,则按照“英文→中文→本地语言”类别行政区划数据对该层级行政区划进行填充,保证行政区划数据召回完整性。 |
详细参阅这里
返回样例
{
"charge": true,//计费标志
"code": 200,//返回码,详见返回码说明
"msg": "成功",//返回码对应描述
"taskNo": "007493807239868764046631",//本次请求号
"data": {
"formatted_address": "江苏省无锡市滨湖区",//结构化地址(不包含POI信息)。如果需要标准的结构化地址,比如获取XX路XX号,推荐使用这个参数
"business": "",//坐标所在商圈信息,如 "人民大学,中关村,苏州街"。最多返回3个。
"sematic_description": "梨梨园上草土菜馆客栈西888米",//当前位置结合POI的语义化结果描述。需设置extensionsPoi=1才能返回。
"roads": [
{
"name": "",//周边道路名称
"distance": ""//传入的坐标点距离道路的大概距离
}
],
"formatted_address_poi": "江苏省无锡市滨湖区马山街道梨梨园上草土菜馆客栈西888米",//结构化地址(包含POI信息)。需设置extensions_poi=1才能返回。如果需要详细的地址描述,推荐使用这个参数。
"location": {
"lng": 120.06782399999993,//经度值
"lat": 31.413067895001422 //纬度值
},
"edz": {
//所属开发区
"name": "" //
},
"poiRegions": [
{
"direction_desc": "",//请求中的坐标与所归属区域面的相对位置关系
"name": "",//归属区域面名称
"tag": "",//归属区域面类型
"distance": "",//离坐标点距离
"uid": "",//poi唯一标识
}
],
"pois": [
{
"zip": "",//邮编
"uid": "60c55c3bd4fbb98c276e98a7",//poi唯一标识
"distance": "888",//离坐标点距离
"poiType": "美食",//
"name": "梨梨园上草土菜馆客栈",//poi名称
"tel": "",//电话
"parent_poi": {
//poi对应的主点poi(如,海底捞的主点为上地华联,该字段则为上地华联的poi信息。如无,该字段为空),包含子字段和pois基础召回字段相同。
"uid": "",//
"distance": "",//
"name": "",//
"tag": "",//
"addr": "",//
"point": {
"x": 0,//
"y": 0 //
},
"direction": ""//
},
"tag": "美食",//poi类型,如’美食;中餐厅’。tag与poiType字段均为poi类型,建议使用tag字段,信息更详细
"addr": "江苏省无锡市滨湖区马山镇和平村北门环山西路91号",//地址信息
"cp": " ",//
"point": {
//poi坐标
"x": 120.07520393899887,//
"y": 31.410457606202677 //
},
"direction": "西"//和当前坐标点的方向
}
],
"addressComponent": {
//注意,国外行政区划,字段仅代表层级
"city_level": 2,//城市所在级别(仅国外有参考意义。国外行政区划与中国有差异,城市对应的层级不一定为『city』。country、province、city、district、town分别对应0-4级,若city_level=3,则district层级为该国家的city层级)
"country": "中国",//国家
"town": "马山街道",//乡镇名,需设置extensions_town=true时才会返回
"distance": "",//区县名
"city": "无锡市",//城市名
"adcode": "320211",//行政区划代码
"country_code_iso": "CHN",//国家英文缩写(三位)
"country_code_iso2": "CN",//国家英文缩写(两位)
"country_code": 0,//国家编码
"town_code": "320211009",//乡镇id
"province": "江苏省",//省名
"street": "",//道路名
"district": "滨湖区",//相对当前坐标点的距离,当有门牌号的时候返回数据
"street_number": "",//道路门牌号
"direction": ""//相对当前坐标点的方向,当有门牌号的时候返回数据
}
}
}