【vue2高德地图api】03-完善展示页,并且调用poi搜索接口

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、编写页面内容+样式
    • 1.1 html内容
    • 1.2 css内容
    • 解决报错
  • 二、完善api接口+变量+方法
    • 1.data变量
    • 2. methods
    • 3. computed
    • 4. api接口方法
  • 三、配置api接口方法
    • 创建map.js
    • getParkList方法
  • 移动端控制台插件
  • 四、编写components组件
    • 在main.js中引入全局组件
    • 在main.js中挂载计算距离js方法
  • 总结


前言

实现样式效果如图,比较复杂,内容较多。会在api文件夹创建接口,会在components写一个组件,阅读大概10分钟
在这里插入图片描述


一、编写页面内容+样式

1.1 html内容

复制这块,放在 地图的div下面

<div class="main"><!-- 当前位置 --><h4 class="title"><van-icon name="location-o" />{{ locationInfo.formattedAddress }}</h4><!-- 搜索栏 --><van-search v-model="input" placeholder="请输入搜索关键词" readonly @focus="onJumpSearch" /><!-- 下拉菜单 --><van-dropdown-menu><van-dropdown-item title="位置距离" v-model="radius" :options="radiusList" @change="getParkList" /><van-dropdown-item title="推荐排序" v-model="type" :options="typeList" /></van-dropdown-menu><!-- 循环体 --><section class="park-list"><map-item v-for="item in showParkList" :key="item.id" :item="item"><p>评分{{ item.biz_ext.rating }}分 距离{{getDistances(position[1], position[0], item.location.split(',')[1], item.location.split(',')[0]).km}}千米</p></map-item></section>
</div>

在这里插入图片描述

1.2 css内容

复制放在 .map 后面

.main {background-color: #fff;padding: 20px;> h4 {/*第一步: 溢出隐藏 */overflow: hidden;/* 第二步:让文本不会换行, 在同一行继续 */white-space: nowrap;/* 第三步:用省略号来代表未显示完的文本 */text-overflow: ellipsis;}.park-list {padding: 10px;height: calc(100vh - 680px);overflow-y: auto;box-sizing: border-box;}
}

在这里插入图片描述


解决报错

可以看到缺少了很多东西,一个一个来
在这里插入图片描述

二、完善api接口+变量+方法

1.data变量

代码如下(示例):

input: '', // 输入框绑定值
radius: '', // 范围选择
type: 'a', // 类型选择
radiusList: [{ text: '全部', value: '' },{ text: '500米', value: 500 },{ text: '1000米', value: 1000 },{ text: '2000米', value: 2000 },{ text: '5000米', value: 5000 },
],
typeList: [{ text: '距离优先', value: 'a' },{ text: '好评优先', value: 'b' },
],
parkList: [], 

在这里插入图片描述

2. methods

代码如下(示例):

    onJumpSearch() {this.$router.push('/park/search');},onJumpDetail(id) {this.$router.push('/park/detail/' + id);},

3. computed

这个showParkList是我用于渲染页面的parkList,由于高德地图没有条件查询,它只有按照距离来,所以我只能,按距离查询到之后,自己用里面的参数进行一遍过滤。

computed: {showParkList() {let array = [...this.parkList];if (this.type === 'a') {return array;} else if (this.type === 'b') {return array.sort((a, b) => {// 使用parseFloat将rating属性的值解析为数字const ratingA = parseFloat(a.biz_ext.rating);const ratingB = parseFloat(b.biz_ext.rating);// 根据rating属性从大到小排序return ratingB - ratingA;});}},},

4. api接口方法

还剩下最后一个报错,缺少列表请求方法
在这里插入图片描述

三、配置api接口方法

由于东西太多,开一个新标题、

创建map.js

在src下的api文件夹里面
在这里插入图片描述


看不懂没关系,高德地图文档传送门
在这里插入图片描述

// 我使用的poi是1.0,不是2.0, 2.0的话后缀是v5
import axios from 'axios';
import Vue from 'vue';const baseUrl = 'https://restapi.amap.com/v3';
axios.defaults.headers.common['key'] = Vue.prototype.mapServiceKey;// 周边搜索
export function mapPlaceAround(params) {return new Promise((resolve, reject) => {axios({method: 'get',url: baseUrl + '/place/around',params,}).then((res) => {resolve(res.data);}).catch((err) => {reject(err);});});
}
// 关键字搜索
export function mapPlaceText(params) {return new Promise((resolve, reject) => {axios({method: 'get',url: baseUrl + '/place/text',params,}).then((res) => {resolve(res.data);}).catch((err) => {reject(err);});});
}
// 查询地点详情
export function mapPlaceDetail(params) {return new Promise((resolve, reject) => {axios({method: 'get',url: baseUrl + '/place/detail',params,}).then((res) => {resolve(res.data);}).catch((err) => {reject(err);});});
}

我已经都封装好了,直接复制粘贴

getParkList方法

复制放到export default上面

import { mapPlaceAround } from '@/api/map';

复制粘贴放到methods里面

getParkList() {console.log('查询');mapPlaceAround({location: this.position.join(','), // 当前经纬度拼接, 需要格式为 '113.110748,28.246296'keywords: '公园',types: '080000|110000', // 体育休闲服务|风景名胜radius: this.radius, // 距离page: 1,offset: 20,extensions: 'all', // all全部信息, base基础信息}).then((res) => {this.parkList = res.pois;console.log(JSON.parse(JSON.stringify(res.pois)));});
},

在获取到定位的时候去调用this.getParkList()方法
在这里插入图片描述

移动端控制台插件

把这段代码放在public下的index.html中,你的项目就会有一个控制台了,在手机端测试的时候就可以看见网络请求和控制台打印了

<!-- 手机端打开控制台 最新 -->
<script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script>
<script>// 初始化 引入的调试组件var vConsole = new VConsole();console.log('控制台打印信息 最新');
</script>

在这里插入图片描述
发现手机端好像没啥反应, 其实是组件还没开始写

四、编写components组件

这里直接复制粘贴我的了,懒得说明了,样式拿去用就随便改改吧。

在components中创建文件夹 MapItem,再创建index.vue
在这里插入图片描述

<template><div class="com-map-item" v-if="item"><div class="img"><van-image v-if="item.photos.length > 0" width="50" height="50" :src="item.photos[0].url" /><van-image v-else width="50" height="50" fit="cover" :src="require('@/assets/images/park.png')" /><slot name="top"></slot></div><div class="park-name" @click="onJumpDetail(item.id)"><h4>{{ item.name }}</h4><slot></slot></div><div class="park-right" @click="onJumpView"><van-image width="30" height="30" :src="require('@/assets/images/icons/toRight.png')" /><span>去这里</span></div></div>
</template><script>
export default {name: 'vinit',props: {item: {type: Object,default: () => {},},position: {type: Array,default: () => [],},},data() {return {};},computed: {},watch: {},filters: {},created() {},methods: {onJumpDetail(id) {this.$router.push('/park/detail/' + id);},onJumpView() {this.$router.push('/park/view/' + this.item.id);},},
};
</script><style scoped lang="scss">
.com-map-item {position: relative;display: flex;align-items: center;justify-content: space-between;padding: 20px 10px;border-bottom: 1px solid #eee;.img {position: relative;}::v-deep .van-image__img {border-radius: 5px;}.park-name {width: 70%;p {color: #666;font-size: 28px;margin-top: 10px;/*第一步: 溢出隐藏 */overflow: hidden;/* 第二步:让文本不会换行, 在同一行继续 */white-space: nowrap;/* 第三步:用省略号来代表未显示完的文本 */text-overflow: ellipsis;}}.park-right {display: flex;flex-direction: column;align-items: center;}
}
</style>

MapItem挂载全局,你要按需引入也可以

代码中需要用到图片,缺少图片请看下一步

在main.js中引入全局组件

// 地图列表item
import MapItem from '@/components/MapItem';
Vue.component('MapItem', MapItem);

发现报错
在这里插入图片描述
由于我的组件调用了一个图片,所以这里继续引入图片

这里你可以自己修改,如果怕出错,那就用我的,不过这个也简单

在这里插入图片描述
图片随便找一个图标叫 toRight.png
一个叫park.png
图标网站传送门iconfont-阿里巴巴矢量图标库
在这里插入图片描述
图标在icons里面,图片在images里面,或者你自己改也行。反正是组件。

在main.js中挂载计算距离js方法

还是报错,因为没有计算距离方法
在这里插入图片描述
在utils中创建 distances.js

// 根据经纬度计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
function getDistances(lat1, lng1, lat2, lng2) {let EARTH_RADIUS = 6378.137; // 地球半径let radLat1 = (lat1 * Math.PI) / 180.0; //lat1 * Math.PI / 180.0=>弧度计算let radLat2 = (lat2 * Math.PI) / 180.0;let a = radLat1 - radLat2;let b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0;let s =2 *Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));s = s * EARTH_RADIUS;s = Math.round(s * 10000) / 10000; // 输出为公里return { m: Math.round(s * 1000), km: Number(s.toFixed(2)) };
}
export default getDistances;

在main.js中

// 传入经纬度,计算出m || km
import getDistances from '@/utils/distances';
Vue.prototype.getDistances = getDistances; // 计算距离

在这里插入图片描述


总结

提示:这里对文章进行总结:
挂载了计算距离方法后,发现页面不报错了,正常运行了

  • 为什么不用webJs的poi查询?那个查询可以直接在地图上标点出来。

因为没有我所需要的评分,我需要根据评分来排序,如果需要地图显示点,可以用mark批量添加,看到这里相信你已经会基本操作了。mark加标记点我在后面会有一片教程,不过不是批量,不过都差不多,反正都是给经纬度然后整个循环。

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

如果看到这里还是没有正常运行。
请检查

  1. data变量
  2. computed计算属性
  3. methods方法
  4. import引入js请求方法
  5. main.js挂载计算距离方法
  6. api文件夹下创建map.js方法
  7. components组件,挂载到main.js全局,并且需要2张图片
  8. 在获取定位后,执行getParkList方法

如果都正常,看看你手机是不是禁用了位置授权。
记得用手机端控制台查看报错,禁用控制台直接注释就好了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机缘参悟-110] :一个IT人对面具的理解:职业面具戴久了,就会忘记原本真实的自己,一个人是忠于职位,还是忠于内心?

目录 一、职业面具戴久了&#xff0c;就会忘记原本真实的自己 二、霸王别姬 三、没有对错&#xff0c;各走各路 3.1 程蝶衣&#xff1a;戏里戏外&#xff0c;忠于角色 3.2 段小楼&#xff1a;戏里戏外&#xff0c;角色分明 3.3 没有对错&#xff0c;各走各路 四、职场中…

RabbitMQ的LazyQueue

在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。但在某些特殊情况下&#xff0c;这会导致消息积压&#xff0c;比如&#xff1a; 消费者宕机或出现网络故障消息发送量激增&#xff0c;超过了消费者处理速度消费者处理业务发生阻塞 一旦…

PyQt 小程序

设备管理程序 v0.0.1.0, 终于出了一个基础版本,… … 两个字典的键值判断 辛亏用的是Python 这个编码时间大大缩短了 对已有的命令行进行GUI 化 from typing import Optional import PySide6.QtCore import PySide6.QtWidgets from cmd_ui import Ui_MainWindow from PySide6.…

Qt 视口和窗口的区别

视口和窗口 绘图设备的物理坐标是基本的坐标系&#xff0c;通过QPainter的平移、旋转等变换可以得到更容易操作的逻辑坐标 为了实现更方便的坐标&#xff0c;QPainter还提供了视口(Viewport)和窗口(Window)坐标系&#xff0c;通过QPainter内部的坐标变换矩阵自动转换为绘图设…

Vue2使用定时器和闭包实现防抖和节流函数。将函数放入util.js中,供具体功能在methods中调用

Vue2使用定时器和闭包实现防抖和节流函数。将函数放入util.js中&#xff0c;供具体功能在methods中调用。<br/ 参考文档&#xff1a; 如何在Vue中优雅的使用防抖节流人类高质量JS防抖与节流机制Vue项目中使用防抖和节流vue2使用lodash中的防抖&#xff08;debounce&#xff…

小程序首页搭建

小程序首页搭建 1. Flex布局是什么&#xff1f;2. 容器的属性2.1 flex-direction属性2.2 flex-wrap属性2.3 flex-flow属性2.4 justify-content属性2.5 align-items属性2.6 align-content属性 二.首页布局搭建二.1moke模拟数据实现轮播图4.信息搭建 Flex弹性布局 1. Flex布局是…

我的创作纪念日———C/C++之动态内存管理

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.为什么要有动态内存分配…

NSS [NISACTF 2022]easyssrf

NSS [NISACTF 2022]easyssrf 先看题目&#xff0c;给了一个输入框 看这提示就知道不是curl了&#xff0c;先file协议读一下flag&#xff0c;file:///flag 不能直接读flag&#xff0c;读个提示文件file:///fl4g 访问一下 <?phphighlight_file(__FILE__); error_reporting(0…

python每日一练(9)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

oracle库中数据利用datax工具同步至mysql库

查看oracle版本 $sqlplus aaa/aaaa192.168.1.1/lcfaSQL*Plus: Release 19.0.0.0.0 - Production on Tue Oct 17 15:56:46 2023 Version 19.15.0.0.0Copyright (c) 1982, 2022, Oracle. All rights reserved.Last Successful login time: Tue Oct 17 2023 15:56:03 08:00Conne…

linux下 u2net tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

iperf3交叉编译

简介 iperf3是一个用于执行网络吞吐量测量的命令行工具。它支持时序、缓冲区、协议&#xff08;TCP&#xff0c;UDP&#xff0c;SCTP与IPv4和IPv6&#xff09;有关的各种参数。对于每次测试&#xff0c;它都会详细的带宽报告&#xff0c;延迟抖动和数据包丢失。 如果是ubuntu系…

华为---PPP协议简介及示例配置

PPP协议简介 PPP是Point-to-Point Protocol的简称&#xff0c;中文翻译为点到点协议。与以太网协议一样,PPP也是一个数据链路层协议。以太网协议定义了以太帧的格式&#xff0c;PPP协议也定义了自己的帧格式&#xff0c;这种格式的帧称为PPP帧。 利用PPP协议建立的二层网络称为…

MIT6.5830 Lab0-Go tutorial实验记录(三)

MIT6.5830 Lab0-Go tutorial实验记录&#xff08;三&#xff09; – WhiteNights Site 标签&#xff1a;Golang 在前面两次实验记录的铺垫&#xff0c;是时候完成第一项任务了。 实验步骤 补全handlers.go中缺失的代码 先来看第一个部分&#xff0c;从RidershipDB获取图像数据…

设计模式:工厂方法模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):

本节主要介绍设计模式中的工厂方法模式。 简介&#xff1a; 工厂方法模式&#xff0c;它是对简单工厂模式的进一步抽象化&#xff0c;其好处是可以使系统在不修改原来代码的情况下引进新的产品&#xff0c;即满足开闭原则。 它定义了一个用于创建对象的工厂接口&#xff0c;让…

12-k8s-HPA自动扩缩容

文章目录 一、k8s弹性伸缩类型二、HPA原理三、metrics-server插件四、创建nginx提供负载测试五、部署HPA master操作即可 一、k8s弹性伸缩类型 Cluster-Autoscale: 集群容量(node数量)自动伸缩&#xff0c;跟自动化部署相关的&#xff0c;依赖iaas的弹性伸缩&#xff0c;主要用…

户外运动盛行,运动品牌如何利用软文推广脱颖而出?

全民健康意识的提升和城市居民对亲近自然的渴望带来户外运动的盛行&#xff0c;这也使运动品牌的市场保持强劲发展势头&#xff0c;那么在激烈的市场竞争中&#xff0c;运动品牌应该如何脱颖而出呢&#xff1f;下面就让媒介盒子告诉你&#xff01; 一、 分享户外运动干货 用户…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…

Ubuntu:ESP-IDF 开发环境配置【保姆级】

物联网开发学习笔记——目录索引 参考官网&#xff1a;ESP-IDF 物联网开发框架 | 乐鑫科技 ESP-IDF 是乐鑫官方推出的物联网开发框架&#xff0c;支持 Windows、Linux 和 macOS 操作系统。适用于 ESP32、ESP32-S、ESP32-C 和 ESP32-H 系列 SoC。它基于 C/C 语言提供了一个自给…

力扣每日一题45:跳跃游戏

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返…