百度开放平台-地理编码服务

19 篇文章 0 订阅
15 篇文章 0 订阅

 地理编码服务

地理编码服务(又名Geocoder)是一类Web API接口服务;
正地理编码服务提供将结构化地址数据(如:北京市海淀区上地十街十号)转换为对应坐标点(经纬度)功能;
地理编码服务当前未推出国际化服务,解析地址仅限国内;

功能介绍

地理编码服务

用户可通过该功能,将结构化地址(省/市/区/街道/门牌号)解析为对应的位置坐标。地址结构越完整,地址内容越准确,解析的坐标精度越高。

URL:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

以下是开发的代码,主要调取 getMap(); 方法:

<?php

/**
 * 百度地图-根据详细地址获取经纬度
 * 文档URL:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding
 *
 * @since 20190117
 */
class Baidu_geocoderLib
{
    /**
     * 访问应用(AK)
     * API控制台申请得到的ak
     */
    const REQ_AK = '写你的AK'; 

    /**
     * 请求校验方式为sn校验方式时,系统会自动生成sk
     * 可以在应用配置-设置中选择Security Key显示进行查看
     * 文档URL:http://lbsyun.baidu.com/index.php?title=webapi/appendix
     */
    const SECURITY_KEY = '写你的SK';

    /**
     * 请求地址,GET
     * @var string
     * ?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求
     */
    const REQ_URL = 'http://api.map.baidu.com/geocoder/v2/';
    const REQ_URI = '/geocoder/v2/';

    /**
     * 错误信息
     * @var string|array
     */
    private $errMsg = null;

    /**
     * 是否使用sn签名的验证方式
     * @var bool
     */
    private $isSn = false;

    /**
     * sk码
     * @var null|string
     */
    private $sk = self::SECURITY_KEY;

    /**
     * 请求参数,默认值
     * @var array
     */
    private $reqParam = array(
        'address' => '', // 待解析的地址,最多支持84个字节,(必须)
        'output' => 'json', // 输出格式为json或者xml
        'ak' => self::REQ_AK, // 用户申请注册的key,(必须)
        'callback' => '', // 将json格式的返回值通过callback函数返回以实现jsonp功能,(我们不需要)
        'city' => '', // 地址所在的城市名
        'ret_coordtype' => 'gcj02ll', // 添加后返回国测局经纬度坐标或百度米制坐标,(gcj02ll:国测局坐标、bd09mc:百度墨卡托坐标)
        'sn' => '', // 若用户所用ak的校验方式为sn校验时该参数必须
    );

    public function __construct()
    {
    }

    /**
     * 重置所有请求参数
     * @param array $config 请求参数
     * @param bool $isSn 是否使用sn校验
     * @param string $sk
     */
    public function setReqParam($config, $isSn = false, $sk = null)
    {
        if (is_array($config) && !empty($config)) {
            foreach ($config as $key => $val) {
                !empty($val) && $this->reqParam[$key] = $val;
            }
        }

        if ($isSn) {
            $this->isSn = true;
            !empty($sk) && $this->sk = $sk;
        }
    }

    /**
     * 获取经纬度信息
     * @param null|string $address 详细地址
     * @param null|string $city 详细地址所属城市名,有利于精确返回信息
     * @return bool|mixed 经纬度坐标:[... "location":{"lat":"纬度值","lng":"经度值"} ...]
     */
    public function getMap($address = null, $city = null)
    {
        // 设置地址信息
        !empty($address) && $this->reqParam['address'] = $address;
        !empty($city) && $this->reqParam['city'] = $city;

        if ($this->isSn) {
            // 调用sn计算函数,默认get请求
            $queryStringArrays = $this->reqParam;
            unset($queryStringArrays['sn']);
            $this->reqParam['sn'] = self::caculateAKSN($this->reqParam['ak'], $this->sk, self::REQ_URI, $queryStringArrays);
        }

        // 请求数据
        $data = $this->send(self::REQ_URL, $this->reqParam);

        // 处理请求数据
        $data = str_replace('renderOption&&renderOption(', '', $data);
        $data = str_replace(')', '', $data);
        $data = json_decode($data, true);

        // 返回数据
        if (!empty($data)) {
            if ($data['status'] == 0) {
                return $data;
            } else {
                $this->errMsg = $data;
            }
        } else {
            $this->errMsg = '请求出错了';
        }
        return false;
    }

    /**
     * 返回错误信息
     * @return array|string
     */
    public function errMsg()
    {
        return $this->errMsg;
    }

    /**
     * 发送请求
     * @param $url
     * @param $params
     * @return mixed
     */
    private function send($url, $params = null)
    {
        if (!empty($params)) {
            if (is_array($params)) {
                $paramStr = '';

                foreach ($params as $k => $val) {

                    // 请求参数中有中文、特殊字符等需要进行urlencode,确保请求串与sn对应
                    if ($this->isSn && $k != 'sn') {
                        if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $val) > 0) {
                            $val = urlencode($val);
                        }
                    }
                    $paramStr .= "{$k}={$val}&";
                }
                $paramStr = rtrim($paramStr,'&');
            } else {
                $paramStr = $params;
            }
            $url .= (strpos($url, "?") === false ? '?' : '&');
            $url .= $paramStr;
        }

        // 记录一下url
        $this->errMsg = $url;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        // 执行并获取HTML文档内容
        $result = curl_exec($ch);

        // 释放curl句柄
        curl_close($ch);

        return $result;
    }

    /**
     * sn计算函数,默认get请求
     * 百度地图提供
     * 文档URL:http://lbsyun.baidu.com/index.php?title=webapi/appendix
     * @param $ak
     * @param $sk
     * @param $url
     * @param $querystring_arrays
     * @param string $method
     * @return string
     */
    private static function caculateAKSN($ak, $sk, $url, $querystring_arrays, $method = 'GET')
    {
        if ($method === 'POST') {
            ksort($querystring_arrays);
        }
        $querystring = http_build_query($querystring_arrays);
        return md5(urlencode($url . '?' . $querystring . $sk));
    }
}

相关参数说明看文档:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中使用百度地图地理编码,可以通过调用百度地图API来实现。下面是一个简单的示例: ```java import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.net.URLEncoder; public class BaiduMapGeoCoding { public static void main(String[] args) throws Exception { String address = "北京市海淀区上地十街10号"; String url = "http://api.map.baidu.com/geocoding/v3/?address=" + URLEncoder.encode(address, "UTF-8") + "&output=json&ak=你的AK"; CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); String result = EntityUtils.toString(response.getEntity()); JSONObject json = JSONObject.parseObject(result); if (json.getInteger("status") == 0) { JSONObject location = json.getJSONObject("result").getJSONObject("location"); double lng = location.getDouble("lng"); double lat = location.getDouble("lat"); System.out.println("经度:" + lng + ",纬度:" + lat); } else { System.out.println("地理编码失败:" + json.getString("message")); } } } ``` 其中,`address`是要进行地理编码的地址,`ak`是在百度地图开放平台申请的访问密钥。执行该代码后,会输出该地址对应的经纬度信息。 需要注意的是,需要导入FastJson和HttpClient的相关依赖,同时需要进行异常处理。另外,在实际使用中,需要将AK替换成自己在百度地图开放平台申请的密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值