最近因为项目需求,需要把 酒店地址和 经纬度互相转换,于是就学习使用了高德地图WEB服务端API-地理编码/逆地理编码,下面分享出来。
产品介绍
地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。
结构化地址的定义: 首先,地址肯定是一串字符,内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意:针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略,但省、市、城镇等级别的地址构成是不能忽略的。
适用场景
- 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。
结构化地址举例:
北京市朝阳区姚家园路观湖国际1座
转换后经纬度:116.500748, 39.941108
- 地标性建筑举例:
天安门
转换后经纬度:116.397499,39.908722
- 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。
例如:
116.500748, 39.941108
转换地址描述后:北京市朝阳区姚家园路观湖国际1座
使用说明
第一步,申请Web服务API类型Key;
第二步,参考接口参数文档发起HTTP/HTTPS请求,第一步申请的 Key 需作为必填参数一同发送;
第三步,接收请求返回的数据(JSON或XML格式),参考返回参数文档解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为 UTF-8 编码方式。
parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。
逆地理编码API服务地址
https://restapi.amap.com/v3/geocode/geo?parameters
address 是需要获取坐标的结构化地址,Key是用户请求数据的身份标识,city为指定查询的城市(为可选参数)
逆地理编码API服务地址
https://restapi.amap.com/v3/geocode/regeo?parameters
Key 是高德Web服务 Key
location(116.310003,39.991957) 是所需要转换的坐标点经纬度
radius(1000)为返回的附近POI的范围,单位:米
extensions(all)为返回的数据内容,output(XML)用于指定返回数据的格式
本次DEMO在laravel框架中实现(其他框架均可用相同方式实现)
/**
* 将详细的结构化地址转换为高德经纬度坐标-高德地图-地理编码
* @param string $address 填写结构化地址信息:省份+城市+区县+城镇+乡村+街道+门牌号码
* @param string $city 查询城市,可选:城市中文、中文全拼、citycode、adcode
* @return array
*/
public function geo($address = '', $city = '北京')
{
$key = config('app.amap_key');
/**
* url:https://restapi.amap.com/v3/geocode/geo?address=北京市朝阳区阜通东大街6号&output=XML&key=<用户的key>
* output(XML/JSON)用于指定返回数据的格式
*/
$url = "https://restapi.amap.com/v3/geocode/geo?output=JSON&key={$key}&address={$address}&city={$city}";
// 执行请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
$result = json_decode($data, true);
return $result;
}
地理编码响应参数
{
"status":"1",
"info":"OK",
"infocode":"10000",
"count":"1",
"geocodes":[
{
"formatted_address":"北京市朝阳区观湖国际|1号楼",
"country":"中国",
"province":"北京市",
"citycode":"010",
"city":"北京市",
"district":"朝阳区",
"township":[
],
"neighborhood":{
"name":[
],
"type":[
]
},
"building":{
"name":[
],
"type":[
]
},
"adcode":"110105",
"street":[
],
"number":[
],
"location":"116.493921,39.934769",
"level":"门牌号"
}
]
}
逆地理编码
/**
* 根据经纬度获取地理位置-高德地图-逆地理编码
* @param string $lon 经度
* @param string $lat 纬度
* @return array
*/
public function regeo($lon, $lat)
{
// Key 是高德Web服务 Key。详细可以参考上方的请求参数说明。
$key = config('app.amap_key');
// location(116.310003,39.991957) 是所需要转换的坐标点经纬度,经度在前,纬度在后,经纬度间以“,”分割
$location = $lon . "," . $lat;
/**
* url:https://restapi.amap.com/v3/geocode/regeo?output=xml&location=116.310003,39.991957&key=<用户的key>&radius=1000&extensions=all
* radius(1000)为返回的附近POI的范围,单位:米
* extensions 参数默认取值是 base,也就是返回基本地址信息
* extensions 参数取值为 all 时会返回基本地址信息、附近 POI 内容、道路信息以及道路交叉口信息。
* output(XML/JSON)用于指定返回数据的格式
*/
$url = "https://restapi.amap.com/v3/geocode/regeo?output=JSON&location={$location}&key={$key}&radius=1000&extensions=base";
// 执行请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
$result = json_decode($data, true);
return $result;
}
逆地理编码响应参数
{
"status":"1",
"regeocode":{
"addressComponent":{
"city":[
],
"province":"北京市",
"adcode":"110105",
"district":"朝阳区",
"towncode":"110105030000",
"streetNumber":{
"number":"105号",
"location":"116.493684,39.93485",
"direction":"西",
"distance":"22.1467",
"street":"姚家园路"
},
"country":"中国",
"township":"东风镇",
"businessAreas":[
{
"location":"116.47783322317072,39.939610408536595",
"name":"朝阳公园",
"id":"110105"
},
{
"location":"116.50446511643838,39.93298831849312",
"name":"石佛营",
"id":"110105"
},
{
"location":"116.5050424917301,39.91928580279891",
"name":"十里堡",
"id":"110105"
}
],
"building":{
"name":[
],
"type":[
]
},
"neighborhood":{
"name":"国兴·观湖国际南院",
"type":"商务住宅;住宅区;住宅小区"
},
"citycode":"010"
},
"formatted_address":"北京市朝阳区东风镇国兴·观湖国际南院国兴·观湖国际1座"
},
"info":"OK",
"infocode":"10000"
}
代码示例:
<?php
/**
* Created by PhpStorm.
* User: wangsl
* Date: 2019/03/12
* Time: 17:52
* 高德地图-地理编码/逆地理编码(地址和经纬度转换)
*/
namespace App\Services;
class MapGDHelper
{
public $key;
public $requestGeo;
public $requestReGeo;
public function __construct()
{
$this->key = 'b88461ab5da66a8d6fae228239b07fa4';
$this->requestGeo = 'https://restapi.amap.com/v3/geocode/geo';
$this->requestReGeo = 'https://restapi.amap.com/v3/geocode/regeo';
}
/**
* 将详细的结构化地址转换为高德经纬度坐标--地理编码
* @param string $address 填写结构化地址信息:省份+城市+区县+城镇+乡村+街道+门牌号码
* @param string $city 查询城市,可选:城市中文、中文全拼、citycode、adcode,不填,会进行全国范围内搜索
* @param string $output output(XML/JSON)用于指定返回数据的格式
* @return array
*/
public function geo($address = '', $city = '', $output = 'JSON')
{
$url = $this->requestGeo . "?output={$output}&key={$this->key}&address={$address}&city={$city}";
if ($city == '') {
$url = $this->requestGeo . "?output={$output}&key={$this->key}&address={$address}";
}
// 执行请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
$result = json_decode($data, true);
return $result;
}
/**
* 根据经纬度获取地理位置--逆地理编码
* @param string $lon 经度
* @param string $lat 纬度
* @param string $output output(XML/JSON)用于指定返回数据的格式
* @return array
*/
public function regeo($lon, $lat, $output = 'JSON')
{
// location(116.310003,39.991957) 是所需要转换的坐标点经纬度,经度在前,纬度在后,经纬度间以“,”分割
$location = $lon . "," . $lat;
/**
* url:https://restapi.amap.com/v3/geocode/regeo?output=xml&location=116.310003,39.991957&key=<用户的key>&radius=1000&extensions=all
* radius(1000)为返回的附近POI的范围,单位:米
* extensions 参数默认取值是 base,也就是返回基本地址信息
* extensions 参数取值为 all 时会返回基本地址信息、附近 POI 内容、道路信息以及道路交叉口信息。
* output(XML/JSON)用于指定返回数据的格式
*/
$url = $this->requestReGeo . "?output={$output}&location={$location}&key={$this->key}&radius=1000&extensions=base";
// 执行请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
$result = json_decode($data, true);
return $result;
}
}