PHP實(shí)現(xiàn)高德地圖的地理/逆地理編碼

最近因?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尚骄;

高德地圖-控制臺(tái).png

第二步,參考接口參數(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;
    }
}

參考文檔:高德開發(fā)平臺(tái).WEB服務(wù)API文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市码邻,隨后出現(xiàn)的幾起案子折剃,更是在濱河造成了極大的恐慌,老刑警劉巖像屋,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕犁,死亡現(xiàn)場離奇詭異,居然都是意外死亡己莺,警方通過查閱死者的電腦和手機(jī)奏甫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌受,“玉大人阵子,你說我怎么就攤上這事⌒布瑁” “怎么了款筑?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腾么。 經(jīng)常有香客問我奈梳,道長,這世上最難降的妖魔是什么解虱? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任攘须,我火速辦了婚禮,結(jié)果婚禮上殴泰,老公的妹妹穿的比我還像新娘于宙。我一直安慰自己浮驳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布捞魁。 她就那樣靜靜地躺著至会,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谱俭。 梳的紋絲不亂的頭發(fā)上奉件,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音昆著,去河邊找鬼县貌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凑懂,可吹牛的內(nèi)容都是我干的煤痕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼接谨,長吁一口氣:“原來是場噩夢啊……” “哼摆碉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脓豪,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤兆解,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跑揉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锅睛,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年历谍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了现拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡望侈,死狀恐怖印蔬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脱衙,我是刑警寧澤侥猬,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站捐韩,受9級特大地震影響退唠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荤胁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一瞧预、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦垢油、人聲如沸盆驹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躯喇。三九已至,卻和暖如春硝枉,著一層夾襖步出監(jiān)牢的瞬間玖瘸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工檀咙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璃诀。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓弧可,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劣欢。 傳聞我的和親對象是個(gè)殘疾皇子棕诵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容