当前位置: 首页 > news >正文

php后端实现调用高德地图进行POI搜索

对于当前位置或者选定省市位置进行查询

接口实现

/*** 查询地址* @ApiTitle    (查询地址)* @ApiSummary  (查询地址)* @ApiMethod   (POST)* @ApiRoute    (/api/demo/address)* @ApiParams   (name="dart", type="integer", required=true, description="省ID")* @ApiParams   (name="address", type="string", required=true, description="地区名称")* @ApiReturnParams   (name="code", type="integer", required=true, sample="0")* @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")* @ApiReturn   ({'code':'1','msg':'返回成功'})*/public function address(){$id = $this->request->param('dart');$address = $this->request->param('address');// 高德地图API接口地址$url = "https://restapi.amap.com/v3/place/text";      //poi搜索// API Key$key = "你自己在高德地图开放平台申请的应用key";// 搜索关键字$keyword = urlencode("$address");// 请求地址拼接$requestUrl = $url . "?key=" . $key . "&keywords=" . $keyword;// 发送请求并获取结果$curl = curl_init($requestUrl);curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);$response = curl_exec($curl);curl_close($curl);// 解析JSON结果$result = json_decode($response, true);// 输出解析结果
//        $res = $result['pois'];//查询出当前传递的省市ID所涵盖的经纬度$find = db('area')->where('id', $id)->find();$data = [];
//        dump($result['pois']);exit();foreach ($result['pois'] as $k => $v) {$data[$k]['name'] = $v['name'];$data[$k]['address'] = $v['address'];$location = explode(',', $v['location']);$data[$k]['distance'] = (new Resource())::getDistance($find['lng'], $find['lat'], $location[0], $location[1], 2, 2);}// 使用 array_column 函数获取数组中某个字段的值$scores = array_column($data, 'distance');// 使用 array_multisort 对距离进行排序array_multisort($scores, SORT_ASC, $data);$this->success('获取成功', $data);}

其中用到的getDistance方法如下[精确计算]

/*** 计算两点地理坐标之间的距离* @param Decimal $longitude1 起点经度* @param Decimal $latitude1 起点纬度* @param Decimal $longitude2 终点经度* @param Decimal $latitude2 终点纬度* @param Int $unit 单位 1:米 2:千米* @param Int $decimal 精度 保留小数位数* @return Decimal*/public static function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=1, $decimal=2){$EARTH_RADIUS = 6370.996; // 地球半径系数$PI = 3.1415926;$radLat1 = $latitude1 * $PI / 180.0;$radLat2 = $latitude2 * $PI / 180.0;$radLng1 = $longitude1 * $PI / 180.0;$radLng2 = $longitude2 * $PI /180.0;$a = $radLat1 - $radLat2;$b = $radLng1 - $radLng2;$distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));$distance = $distance * $EARTH_RADIUS * 1000;if($unit==2){$distance = $distance / 1000;}return round($distance, $decimal);}

结果如图所示:

http://www.lryc.cn/news/121670.html

相关文章:

  • uniapp 实现滑动视图切换 顶部滚动导航栏
  • ArcGIS API for JavaScript 调用自定义地图模板总结
  • QGraphicsView实现简易地图5『经纬网格』
  • RestTemplate 请求转发异常 ERR_CONTENT_DECODING_FAILED 200 (OK)
  • 用python实现一个异或计算器
  • Sketch打不开AI文件?转换方法在这里
  • 小游戏扫雷实现教学(详解)
  • 04 mysql innodb record
  • Centos7安装Docker
  • Vue中如何更好地封装组件?
  • C语言的链表的相关操作
  • Python3中typing模块
  • C语言自动抓取淘宝商品详情网页数据,实现轻松高效爬虫
  • 数据结构---跳表
  • 为什么Tomcat的NIO在读取body时要模拟阻塞?
  • 26 | 谷歌应用APP数据分析
  • BFS 五香豆腐
  • opencv实战项目 手势识别-手势控制键盘
  • 1.作用域
  • 黑马B站八股文学习笔记
  • 前端常用的上传下载文件的几种方式,直接上传、下载文件,读取.xlsx文件数据,导出.xlsx数据
  • FPGA应用学习笔记--时钟域的控制 亚稳态的解决
  • AirServer是什么软件,手机屏幕投屏电脑神器
  • 如何使用 AT+WEBSERVER 指令实现自定义的 Webserver html 网页配网
  • 期权定价模型系列【4】—期权组合的Delta-Gamma-Vega中性
  • k8sday02
  • 黑马头条项目学习--Day2: app端文章查看,静态化freemarker,分布式文件系统minIO
  • 特语云用Linux和MCSM面板搭建 我的世界基岩版插件服 教程
  • 2023.8
  • CSV文件编辑器——Modern CSV for mac