美文网首页PHP实战PHP经验分享PHP那些事儿
PHP实现高德地图的地理/逆地理编码

PHP实现高德地图的地理/逆地理编码

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2019-03-12 18:09 被阅读324次

    最近因为项目需求,需要把 酒店地址和 经纬度互相转换,于是就学习使用了高德地图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文档

    相关文章

      网友评论

        本文标题:PHP实现高德地图的地理/逆地理编码

        本文链接:https://www.haomeiwen.com/subject/ehbnpqtx.html