Php实现高德地图的地理 逆地理编码

Posted by fsoooo Blog on March 10, 2018

最近因为项目需求,需要把 酒店地址和 经纬度互相转换,于是就学习使用了高德地图WEB服务端API-地理编码/逆地理编码,下面分享出来。

产品介绍

地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬度之间的相互转化的能力。

结构化地址的定义: 首先,地址肯定是一串字符,内含国家、省份、城市、区县、城镇、乡村、街道、门牌号码、屋邨、大厦等建筑物名称。按照由大区域名称到小区域名称组合在一起的字符。一个有效的地址应该是独一无二的。注意:针对大陆、港、澳地区的地理编码转换时可以将国家信息选择性的忽略,但省、市、城镇等级别的地址构成是不能忽略的。

适用场景

  • 地理编码:将详细的结构化地址转换为高德经纬度坐标。且支持对地标性名胜景区、建筑物名称解析为高德经纬度坐标。 结构化地址举例:北京市朝阳区姚家园路观湖国际1座 转换后经纬度:116.500748, 39.941108
  • 地标性建筑举例:天安门 转换后经纬度:116.397499,39.908722
  • 逆地理编码:将经纬度转换为详细结构化的地址,且返回附近周边的POI、AOI信息。 例如: 116.500748, 39.941108转换地址描述后:北京市朝阳区姚家园路观湖国际1座

使用说明

第一步,申请Web服务API类型Key

高德地图-控制台.png

第二步,参考接口参数文档发起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;
    }
}

参考文档:高德开发平台.WEB服务API文档