开发者社区> 问答> 正文

php定位功能如何实现?

网站功能能获取查看人地理位置,网站会员查看人在线支付网站产品之后。可以点击取货位置。点击之后就近出来几个购物人附近的取货位置。。后台能随时添加取货地点。并同步显示在网站前附近取货点。

展开
收起
小旋风柴进 2016-03-10 08:49:48 2513 0
1 条回答
写回答
取消 提交回答
  • 百度地图API的调用需要申请KEY,这里就不具体介绍了,直接贴上本人写了两个关键方法,为了方便前台调用,返回数据采用以下格式

    
    {
        address: "北京市海淀区西二旗北路",
        province: "北京市",
        city: "北京市",
        street: "西二旗北路",
        street_number: "",
        city_code: 131,
        lng: 116.3207676804,
        lat: 40.064084055578
    }

    核心类

    <?php
     
    /**
     * @author xialei <xialeistudio@gmail.com>
     */
    class map
    {
     private static $_instance;
     
     const REQ_GET = 1;
     const REQ_POST = 2;
     
     /**
      * 单例模式
      * @return map
      */
     public static function instance()
     {
      if (!self::$_instance instanceof self)
      {
       self::$_instance = new self;
      }
      return self::$_instance;
     }
     
     /**
      * 执行CURL请求
      * @author: xialei<xialeistudio@gmail.com>
      * @param $url
      * @param array $params
      * @param bool $encode
      * @param int $method
      * @return mixed
      */
     private function async($url, $params = array(), $encode = true, $method = self::REQ_GET)
     {
      $ch = curl_init();
      if ($method == self::REQ_GET)
      {
       $url = $url . '?' . http_build_query($params);
       $url = $encode ? $url : urldecode($url);
       curl_setopt($ch, CURLOPT_URL, $url);
      }
      else
      {
       curl_setopt($ch, CURLOPT_URL, $url);
       curl_setopt($ch, CURLOPT_POST, true);
       curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
      }
      curl_setopt($ch, CURLOPT_REFERER, '百度地图referer');
      curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      $resp = curl_exec($ch);
      curl_close($ch);
      return $resp;
     }
     
     /**
      * ip定位
      * @param string $ip
      * @return array
      * @throws Exception
      */
     public function locationByIP($ip)
     {
      //检查是否合法IP
      if (!filter_var($ip, FILTER_VALIDATE_IP))
      {
       throw new Exception('ip地址不合法');
      }
      $params = array(
        'ak' => '百度地图API KEY',
        'ip' => $ip,
        'coor' => 'bd09ll'//百度地图GPS坐标
      );
      $api = 'http://api.map.baidu.com/location/ip';
      $resp = $this->async($api, $params);
      $data = json_decode($resp, true);
      //有错误
      if ($data['status'] != 0)
      {
       throw new Exception($data['message']);
      }
      //返回地址信息
      return array(
        'address' => $data['content']['address'],
        'province' => $data['content']['address_detail']['province'],
        'city' => $data['content']['address_detail']['city'],
        'district' => $data['content']['address_detail']['district'],
        'street' => $data['content']['address_detail']['street'],
        'street_number' => $data['content']['address_detail']['street_number'],
        'city_code' => $data['content']['address_detail']['city_code'],
        'lng' => $data['content']['point']['x'],
        'lat' => $data['content']['point']['y']
      );
     }
    
     /**
      * GPS定位
      * @param $lng
      * @param $lat
      * @return array
      * @throws Exception
      */
     public function locationByGPS($lng, $lat)
     {
      $params = array(
        'coordtype' => 'wgs84ll',
        'location' => $lat . ',' . $lng,
        'ak' => '百度地图API KEY',
        'output' => 'json',
        'pois' => 0
      );
      $resp = $this->async('http://api.map.baidu.com/geocoder/v2/', $params, false);
      $data = json_decode($resp, true);
      if ($data['status'] != 0)
      {
       throw new Exception($data['message']);
      }
      return array(
        'address' => $data['result']['formatted_address'],
        'province' => $data['result']['addressComponent']['province'],
        'city' => $data['result']['addressComponent']['city'],
        'street' => $data['result']['addressComponent']['street'],
        'street_number' => $data['result']['addressComponent']['street_number'],
        'city_code'=>$data['result']['cityCode'],
        'lng'=>$data['result']['location']['lng'],
        'lat'=>$data['result']['location']['lat']
      );
     }
    }

    调用方法就不说了。

    2019-07-17 18:56:42
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-深入浅出网络编程与swoole内核-吴镇宇 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载