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

news2025/7/14 20:57:34

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、编写页面内容+样式
    • 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.coloradmin.cn/o/1103621.html

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

相关文章

【Leetcode】 416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…

跬智信息(Kyligence)成为信创工委会技术活动单位

近日&#xff0c;跬智信息经过层层筛选和评审&#xff0c;成功加入中国电子工业标准化技术协会信息技术应用创新工作委员会&#xff08;以下简称信创工委会&#xff09;&#xff0c;正式成为信创工委会技术活动单位。 中国电子工业标准化技术协会信息技术应用创新工作委员会成立…

UR构型的奇异点

关节5与关节4平行时&#xff0c;发生腕部奇异关节234共面时&#xff0c;发生肘部奇异关节56交点在关节12轴线组成的平面内时&#xff0c;发生肩部奇异 下面这段视频说明了UR构型机器人奇点的三种类型。 参考链接&#xff1a; https://www.mecademic.com/academic_articles/si…

.Git 仓库敏感信息泄露

Git介绍 Git是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;命名的&#xff0c;它来自英国俚语&#xff0c;意思是“混账”&#xff0c;Git是一个分布式版本控制软件&#xff0c;最初由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;创作&#xff0c;于2005年以…

vue2 解密图片地址(url)-使用blob文件-打开png格式图片

一、背景 开发中需要对加密文件进行解码&#xff0c;如图片等静态资源。 根据后端给到的url地址&#xff0c;返回的是图片文件&#xff0c;但是乱码的&#xff0c;需要解码成png图片进行展示 二、请求接口 将后端返回的文件转为文件流&#xff0c;创建Blob对象来存储二进制…

学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信

目录 3.串口通信实战实操简易的工作原理Tips:sprintf函数简介 总结课后练习 3.串口通信实战 做一个简易串口控制器。发送对应指令&#xff0c;让板子做相应的事情&#xff0c;或者传输数据&#xff08;文本模式下发送&#xff0c;不要选择HEX&#xff09;。 1.串口发送字符Ax\…

双目视觉实战--相机几何

目录 一、针孔摄像机和透镜 1. 针孔摄像机的原理 2. 近轴折射模型 3. 镜头畸变问题 二、摄像机几何 1. 数学基础 2. 相机坐标系&#xff08;空间点&#xff09;→像素坐标系的映射关系&#xff1a; 3. 规范化投影变换 4. 投影变换的性质 三、其他摄像机模型 1. 弱透视…

使用vscode + vite + vue3+ element3 搭建vue3脚手架

技术栈 开发工具&#xff1a;VSCode 代码管理&#xff1a;Git 前端框架&#xff1a;Vue3 构建工具&#xff1a;Vite 路由&#xff1a;vue-router 状态管理&#xff1a;vuex AJAX&#xff1a;axios UI库&#xff1a;element-ui 3 数据模拟&#xff1a;mockjs css预处理&#xf…

ORACLE 特殊日期时间转换,计算

一&#xff1a;特殊日期处理 如该字段存储日期形式为&#xff1a;2023/4/23 9:00&#xff0c;2023-3-1 12:23。将这样的数据转换成正确的格式&#xff08;yyyy-mm-dd HH24:mi:ss&#xff09;&#xff0c;即为&#xff1a;2023-04-23 09:00:00。这里举例的字段为&#xff1a;JS…

PCB电路板废水铜回收工艺有哪些?哪个处理效果好?

印制电路板(PrintedCircuitBoard&#xff0c;简称PCB)作为电子元器件电气相互连接的载体&#xff0c;是电子工业的重要部件之一&#xff0c;半导体、现代高新科技产品都离不开印制电路板。 近年来随着电子行业的快速发展&#xff0c;PCB生产制造量也逐年增加&#xff0c;然而PC…

GPT4 Advanced data analysis Code Interpreter 做行业数据分析、可视化处理图像、视频、音频等

1. 跨境电商如何用ChatGPT选品 ChatGPT Jungle scout 案例&#xff1a;跨境电商如何用ChatGFT选品 ChatGPTJungle scout 素材和资料来自&#xff1a; Jungle ScoutEM, Michael Soltis 和 文韬武韬AIGC 1.1 从Jungle scout上下载数据 Date Range > Last 90 days Downlo…

vscode提示扩展主机在过去5分钟内意外终止了3次,解决方法

参考链接&#xff1a; https://code.visualstudio.com/blogs/2021/02/16/extension-bisect https://code.visualstudio.com/docs/setup/uninstall#_clean-uninstall 使用vscode打开jupyter notebook记事本时&#xff0c;窗口右下角提示扩展主机在过去5分钟内意外终止了3次 而…

力扣每日一题46:全排列

题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; …

类加载的过程总结以及双亲委派模型[JVM]

类加载过程 类一共有七个生命周期:加载->验证->准备->解析->初始化->使用->卸载 加载&#xff08;加载字节码文件&#xff0c;生成.class对象&#xff09; 加载是类加载的第一个阶段。 加载阶段的任务是在类文件从磁盘加载到内存中&#xff0c;通常是从cl…

【学习笔记】RabbitMQ04:延迟队列的原理以及实现代码

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 七、延迟队列7.1 什么是延迟队列7.2 延迟队列的解决方案7.2.1 定时任务7.2.2 **被动取消**7.2.3 JDK的延迟队列7.2.3 采用消息中间件&#xff08;rabbitMQ7.2.3.1 适用专门优化后的死信队列实现延迟队…

防火墙规则顺序解决方案

防火墙是保护网络免受攻击的第一道防线&#xff0c;防火墙对互联网和公司IT网络之间的流量拥有绝对控制权&#xff0c;防火墙规则的配置处理调节流量的关键任务。 这些规则会仔细检查传入和传出流量&#xff0c;并根据规则中提到的条件允许或阻止它&#xff0c;防火墙规则越严…

leetCode 5. 最长回文子串 动态规划 + 优化空间 / 中心扩展法 + 双指针

5. 最长回文子串 - 力扣&#xff08;LeetC5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09;5. 最长回文子串 - 力扣&#xff08;LeetC 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。…

制造企业如何做好MES管理系统需求分析

随着制造业的不断发展&#xff0c;制造企业对于生产过程的管理需求日益增长。为了提高生产效率和质量&#xff0c;越来越多的制造企业开始关注MES生产管理系统的需求分析。本文将从以下几个方面探讨制造企业如何做好MES管理系统需求分析。 一、明确需求 在进行MES管理系统需求…

利用PHP快速抓取音频数据的方法与技巧

目录 使用cURL库抓取音频数据 优点 潜在问题及解决方案 使用file_get_contents函数抓取音频数据 优点 潜在问题及解决方案 总结 随着互联网的发展&#xff0c;音频内容在网络上的应用越来越广泛&#xff0c;如音乐播放、语音通信等。有时&#xff0c;我们需要从特定的音…

电脑缺失dll文件有什么办法快速解决,dll文件是什么

玩游戏时经常会出现dll文件缺失&#xff0c;那么dll文件是什么&#xff1f;都有哪些办法可以解决dll文件缺失&#xff1f;今天就带大家了解dll文件以及解决dll文件缺失的办法&#xff0c;看完这篇文章相信你会有很大收获&#xff0c;接下来往下看。 一.Dll文件 Dll文件是VC运…