最近因?yàn)轫?xiàng)目需求谷炸,需要把 酒店地址和 經(jīng)緯度互相轉(zhuǎn)換泳梆,于是就學(xué)習(xí)使用了高德地圖WEB服務(wù)端API-地理編碼/逆地理編碼羔飞,下面分享出來狂秦。
產(chǎn)品介紹
地理編碼/逆地理編碼 API 是通過 HTTP/HTTPS 協(xié)議訪問遠(yuǎn)程服務(wù)的接口蚯涮,提供結(jié)構(gòu)化地址與經(jīng)緯度之間的相互轉(zhuǎn)化的能力治专。
結(jié)構(gòu)化地址的定義: 首先,地址肯定是一串字符遭顶,內(nèi)含國家张峰、省份、城市棒旗、區(qū)縣喘批、城鎮(zhèn)、鄉(xiāng)村铣揉、街道饶深、門牌號碼、屋邨逛拱、大廈等建筑物名稱敌厘。按照由大區(qū)域名稱到小區(qū)域名稱組合在一起的字符。一個(gè)有效的地址應(yīng)該是獨(dú)一無二的朽合。注意:針對大陸俱两、港饱狂、澳地區(qū)的地理編碼轉(zhuǎn)換時(shí)可以將國家信息選擇性的忽略,但省宪彩、市休讳、城鎮(zhèn)等級別的地址構(gòu)成是不能忽略的。
適用場景
- 地理編碼:將詳細(xì)的結(jié)構(gòu)化地址轉(zhuǎn)換為高德經(jīng)緯度坐標(biāo)尿孔。且支持對地標(biāo)性名勝景區(qū)俊柔、建筑物名稱解析為高德經(jīng)緯度坐標(biāo)。
結(jié)構(gòu)化地址舉例:北京市朝陽區(qū)姚家園路觀湖國際1座
轉(zhuǎn)換后經(jīng)緯度:116.500748, 39.941108
- 地標(biāo)性建筑舉例:
天安門
轉(zhuǎn)換后經(jīng)緯度:116.397499,39.908722
- 逆地理編碼:將經(jīng)緯度轉(zhuǎn)換為詳細(xì)結(jié)構(gòu)化的地址活合,且返回附近周邊的POI雏婶、AOI信息。
例如:116.500748, 39.941108
轉(zhuǎn)換地址描述后:北京市朝陽區(qū)姚家園路觀湖國際1座
使用說明
第一步芜辕,申請Web服務(wù)API類型Key尚骄;
第二步,參考接口參數(shù)文檔發(fā)起HTTP/HTTPS請求侵续,第一步申請的 Key 需作為必填參數(shù)一同發(fā)送倔丈;
第三步,接收請求返回的數(shù)據(jù)(JSON或XML格式)状蜗,參考返回參數(shù)文檔解析數(shù)據(jù)需五。
如無特殊聲明,接口的輸入?yún)?shù)和輸出數(shù)據(jù)編碼全部統(tǒng)一為 UTF-8 編碼方式轧坎。
parameters代表的參數(shù)包括必填參數(shù)和可選參數(shù)宏邮。所有參數(shù)均使用和號字符(&)進(jìn)行分隔。
逆地理編碼API服務(wù)地址
https://restapi.amap.com/v3/geocode/geo?parameters
address 是需要獲取坐標(biāo)的結(jié)構(gòu)化地址缸血,Key是用戶請求數(shù)據(jù)的身份標(biāo)識蜜氨,city為指定查詢的城市(為可選參數(shù))
逆地理編碼API服務(wù)地址
https://restapi.amap.com/v3/geocode/regeo?parameters
Key 是高德Web服務(wù) Key
location(116.310003,39.991957) 是所需要轉(zhuǎn)換的坐標(biāo)點(diǎn)經(jīng)緯度
radius(1000)為返回的附近POI的范圍,單位:米
extensions(all)為返回的數(shù)據(jù)內(nèi)容捎泻,output(XML)用于指定返回?cái)?shù)據(jù)的格式
本次DEMO在laravel框架中實(shí)現(xiàn)(其他框架均可用相同方式實(shí)現(xiàn))
/**
* 將詳細(xì)的結(jié)構(gòu)化地址轉(zhuǎn)換為高德經(jīng)緯度坐標(biāo)-高德地圖-地理編碼
* @param string $address 填寫結(jié)構(gòu)化地址信息:省份+城市+區(qū)縣+城鎮(zhèn)+鄉(xiāng)村+街道+門牌號碼
* @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=北京市朝陽區(qū)阜通東大街6號&output=XML&key=<用戶的key>
* output(XML/JSON)用于指定返回?cái)?shù)據(jù)的格式
*/
$url = "https://restapi.amap.com/v3/geocode/geo?output=JSON&key={$key}&address={$address}&city={$city}";
// 執(zhí)行請求
$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;
}
地理編碼響應(yīng)參數(shù)
{
"status":"1",
"info":"OK",
"infocode":"10000",
"count":"1",
"geocodes":[
{
"formatted_address":"北京市朝陽區(qū)觀湖國際|1號樓",
"country":"中國",
"province":"北京市",
"citycode":"010",
"city":"北京市",
"district":"朝陽區(qū)",
"township":[
],
"neighborhood":{
"name":[
],
"type":[
]
},
"building":{
"name":[
],
"type":[
]
},
"adcode":"110105",
"street":[
],
"number":[
],
"location":"116.493921,39.934769",
"level":"門牌號"
}
]
}
逆地理編碼
/**
* 根據(jù)經(jīng)緯度獲取地理位置-高德地圖-逆地理編碼
* @param string $lon 經(jīng)度
* @param string $lat 緯度
* @return array
*/
public function regeo($lon, $lat)
{
// Key 是高德Web服務(wù) Key。詳細(xì)可以參考上方的請求參數(shù)說明闯狱。
$key = config('app.amap_key');
// location(116.310003,39.991957) 是所需要轉(zhuǎn)換的坐標(biāo)點(diǎn)經(jīng)緯度煞赢,經(jīng)度在前,緯度在后哄孤,經(jīng)緯度間以“,”分割
$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 參數(shù)默認(rèn)取值是 base,也就是返回基本地址信息
* extensions 參數(shù)取值為 all 時(shí)會(huì)返回基本地址信息、附近 POI 內(nèi)容凝危、道路信息以及道路交叉口信息饭弓。
* output(XML/JSON)用于指定返回?cái)?shù)據(jù)的格式
*/
$url = "https://restapi.amap.com/v3/geocode/regeo?output=JSON&location={$location}&key={$key}&radius=1000&extensions=base";
// 執(zhí)行請求
$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;
}
逆地理編碼響應(yīng)參數(shù)
{
"status":"1",
"regeocode":{
"addressComponent":{
"city":[
],
"province":"北京市",
"adcode":"110105",
"district":"朝陽區(qū)",
"towncode":"110105030000",
"streetNumber":{
"number":"105號",
"location":"116.493684,39.93485",
"direction":"西",
"distance":"22.1467",
"street":"姚家園路"
},
"country":"中國",
"township":"東風(fēng)鎮(zhèn)",
"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":"商務(wù)住宅;住宅區(qū);住宅小區(qū)"
},
"citycode":"010"
},
"formatted_address":"北京市朝陽區(qū)東風(fēng)鎮(zhèn)國興·觀湖國際南院國興·觀湖國際1座"
},
"info":"OK",
"infocode":"10000"
}
代碼示例:
<?php
/**
* Created by PhpStorm.
* User: wangsl
* Date: 2019/03/12
* Time: 17:52
* 高德地圖-地理編碼/逆地理編碼(地址和經(jīng)緯度轉(zhuǎn)換)
*/
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';
}
/**
* 將詳細(xì)的結(jié)構(gòu)化地址轉(zhuǎn)換為高德經(jīng)緯度坐標(biāo)--地理編碼
* @param string $address 填寫結(jié)構(gòu)化地址信息:省份+城市+區(qū)縣+城鎮(zhèn)+鄉(xiāng)村+街道+門牌號碼
* @param string $city 查詢城市,可選:城市中文媒抠、中文全拼、citycode咏花、adcode趴生,不填,會(huì)進(jìn)行全國范圍內(nèi)搜索
* @param string $output output(XML/JSON)用于指定返回?cái)?shù)據(jù)的格式
* @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}";
}
// 執(zhí)行請求
$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;
}
/**
* 根據(jù)經(jīng)緯度獲取地理位置--逆地理編碼
* @param string $lon 經(jīng)度
* @param string $lat 緯度
* @param string $output output(XML/JSON)用于指定返回?cái)?shù)據(jù)的格式
* @return array
*/
public function regeo($lon, $lat, $output = 'JSON')
{
// location(116.310003,39.991957) 是所需要轉(zhuǎn)換的坐標(biāo)點(diǎn)經(jīng)緯度昏翰,經(jīng)度在前苍匆,緯度在后,經(jīng)緯度間以“,”分割
$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 參數(shù)默認(rèn)取值是 base浸踩,也就是返回基本地址信息
* extensions 參數(shù)取值為 all 時(shí)會(huì)返回基本地址信息、附近 POI 內(nèi)容统求、道路信息以及道路交叉口信息检碗。
* output(XML/JSON)用于指定返回?cái)?shù)據(jù)的格式
*/
$url = $this->requestReGeo . "?output={$output}&location={$location}&key={$this->key}&radius=1000&extensions=base";
// 執(zhí)行請求
$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;
}
}