uniapp 微信小程序 使用高德地图 定制气泡

news2024/10/7 4:37:04

前言

我们常说的uniapp或者原生微信小程序框架使用高德地图,并不是ui就是高德地图,而是api用的高德地图,ui仍然是框架内置的地图,也就是说,地图和api是分开,微信小程序的内置地图自然是腾讯地图。

高德地图

高德地图的api包含服务端和客户端两部分,经常用到的api方法有经纬度地址解析及逆解析、获取POI(Point of Interest),POI指的是兴趣点,常见的POI有关键字搜索、周边搜索、多边形区域搜索、路线规划等,如果客户端用高德,那有pc web版的、有安卓版的、有IOS版的、有微信小程序版的,各个版本之间有差异,比如微信小程序版的api方法很少,pc web版的api方法很多。

原生微信小程序 map组件

原生微信小程序的地图控件,提供了路径规划、标记点、标签、气泡等属性。

<map 
		id="map"
	    longitude="{{longitude}}" 
		latitude="{{latitude}}"
 		scale="14"
 		show-location="true"
         markers="{{markers}}" 
         bindmarkertap="makertap"></map>

举几个map组件常用的属性

  • markers,标记点
    • 它是一个marker数组,marker对象格式{id,latitude,longitude,title…}
  • polyline,路线
    • 它是一个路线数组,路线对象{points:[{longitude,latitude}],color}
  • include-points,缩放视野以包含所有给定的坐标点
    • 它是一个坐标点数组,坐标点格式{longitude,latitude}
      uniapp的map组件跟微信小程序的map组件,特别相似,可认为是一样的。

标记点 vs 标签 vs 气泡

地图中有3个常用的概念,标记点marker,标签label、气泡callout,这三者是不一样的,可看下图,红色的是marker、气泡、标签分别用文本做了标记。

在这里插入图片描述
这里以微信原生小程序举例,以下代码基于高德微信小程序插件样例进行了改造,关键代码如下,代码中用到了getPoiAround方法,

var that = this;
var myAmapFun = new amapFile.AMapWX({key:'高德key'});
myAmapFun.getPoiAround({
  success: function(data){
    markersData = data.markers;
    markersData.forEach(marker=>{
      marker.label={content:"标签:"+marker.name,bgColor:"#d3cd9c",padding:5,borderWidth:1,borderRadius:4}
      marker.callout={content:"气泡:"+marker.name,bgColor:"#ebc3c3",display:"ALWAYS",padding:5,borderWidth:2,borderRadius:4}
    })
    that.setData({
      markers: markersData
    });
  }  
},

常见的需求及实现原理

标记点

标记点的原理就是将目标点的坐标组装成markers的结构,然后赋值给它就可以了。
在这里插入图片描述

路线规划

路线规划的原理很简单,通过高德getDrivingRoute方法(当然了,还有骑行、步行、公交等方法),然后组装成polyline的数据格式,顺便提一下,高德api方法的坐标参数,格式都是经度,纬度,经度在前,纬度在后,中间有逗号隔开。

路线附近标记点

这个的应用场景通常是,从A---->B规划出路径后,需要展示路径附近的加油站(或者旅游景区)等等之类的。它实现原理是,路径是一系列坐标点组成的,通过过滤计算所有加油站到坐标连起来的线的距离(mysql有对应的地理函数),获取到目标加油站的坐标,然后返回到前端,通过地图的标记点api标记到地图上。

  • 前端,获取到A->B的路径规划一系列坐标
    • 通过高德getDrivingRoute方法将坐标组装成字符串,参考下边StationsNearbyLineQuery中的points格式。
  • 后端接口,接收一系列坐标,以java举例
/**
 * @description: 获取路线沿途的站点
 */
@Data
public class StationsNearbyLineQuery {

    /**
     * 坐标点,p1[,p2]...
     * p1格式:经度  纬度
     * 一言一概之,点与点之间逗号分隔,经纬度空格分隔
     */
    @NotBlank
    private String points;

    /**
     * 搜索范围(米)
     */
    private Integer distance;

}
/**
 * 获取路线沿途的站点
 * @param query 查询条件
 * @return
 */
@PostMapping("/getStationsNearbyLine")
public List<MerchantsVO> getStationsNearbyLine(@Valid @RequestBody StationsNearbyLineQuery query){
   //执行sql查询目标站点
}
  • mysql计算所有加油站到路径的距离,筛选出范围内站点
    • select * from 加油站 where ST_Distance( ST_GeomFromText(concat('LINESTRING(', #{points}, ')')), POINT(longitude, dimensionality) ) * 111195 &lt;= #{distance}
    • 这里要乘以111195是因为,st_distance 计算的结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米。
  • 前端标注

自定义气泡

自定义气泡,就是利用marker对象中的customcallout属性,具体可参考marker 上的自定义气泡 customCallout

使用方式如下,map 组件下添加名为 callout 的 slot 节点,其内部的 cover-view 通过 marker-id 属性与
marker 绑定。当 marker 创建时,该 cover-view 显示的内容将作为 callout 显示在标记点上方。

<map>
  <cover-view slot="callout">
  //如果是动态的,则用wx:for之类的动态生成,因为map是较高层级组件,为了实现实现遮挡,
  //必须要用cover-view,它的层级高过map
    <cover-view marker-id="1"></cover-view>
    <cover-view marker-id="2"></cover-view>
  </cover-view>
</map>

相应的每个marker对象中要指定customCallout

marker:{
	id:"",
	customCallout: {
	     display: "ALWAYS"
	 },
}

除了以上几个,还提供了点击标记bindmarkertap、点击标签bindlabeltap、点击气泡bindcallouttap等方法,已实现自定义效果。

总结

做demo时,可用微信原生框架做测试,高德微信小程序插件提供了样例代码,因为少了uniapp翻译为原生微信小程序这一步,代码看起来直观一些,也方便调试,并且微信小程序的地图文档也得也更好一些。

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

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

相关文章

SpringBoot第34讲:SpringBoot集成ShardingJDBC - 基于JPA的DB隔离多租户方案

SpringBoot第34讲&#xff1a;SpringBoot集成ShardingJDBC - 基于JPA的DB隔离多租户方案 本文是SpringBoot第34讲&#xff0c;主要介绍ShardingJDBC的分片算法和分片策略&#xff0c;并在此基础上通过SpringBoot集成ShardingJDBC的几种策略&#xff08;标准分片策略&#xff0c…

DevOps最佳实践和工具在本地环境中的概述

引言 最近&#xff0c;我进行了一次网上搜索&#xff0c;以寻找DevOps的概述&#xff0c;尽管有大量的DevOps工具和实践&#xff0c;但我无法找到一个综合的概述。因此&#xff0c;我开始了对DevOps生态系统和最佳实践的梳理&#xff0c;以创建一个整体视图,方便后续研究实践 C…

Fabric系列 - 知识点整理

知识点 源码编译 主机编译 容器编译 手动部署(docker-compose) 单peer 多peer 中途加peer 多主机多peer 链码 语法, 接口 (go版) 命令行调用 ca server 在DApp中使用SDK调用 (js版) 部署的几个阶段 部署1排序和1节点, 1组织1通道 光部署能Dapp 带ca server (每个组织一个)…

SQL SERVER 2019 数据库还原测试库的方法

1、备份正式库数据 2、在其它电脑上还原备份的数据库 不需要覆盖其它数据库&#xff0c;直接还原出数据库 还原时修改文件名和数据库名称&#xff1a; 修改文件名称 还原成功

【数学建模】--时间序列分析

时间序列分析概念与时间序列分解模型 定义&#xff1a;时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去&#xff0c;分线规律和预测未来&#xff0c;本讲将主要介绍时间序…

心理咨询预约管理系统javaweb医院挂号jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 心理咨询预约管理系统javaweb MVC模式&#xff0c;普…

PCIe VSC、VSEC、DVSEC

&#x1f525;点击查看精选 PCIe 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0…

[LeetCode - Python] 11.乘最多水的容器(Medium);26. 删除有序数组中的重复项(Easy)

1.题目&#xff1a; 11.乘最多水的容器&#xff08;Medium&#xff09; 1.代码 1.普通双指针对撞 贪心算法 class Solution:def maxArea(self, height: List[int]) -> int:# 对撞双指针# 对比记录最大面积&#xff0c;并移动短板&#xff0c;重新计算&#xff1b;left,…

人工智能(AIGC)在多领域的应用

文章目录 内容创作领域艺术创作领域媒体与广告领域教育与培训领域科研与创新领域总结 人工智能&#xff08;AI&#xff09;的快速发展正在为各行各业带来深刻的变革&#xff0c;其中人工智能生成内容&#xff08;AIGC&#xff09;技术的应用尤为引人瞩目。AIGC利用深度学习等技…

编码技巧——Sentinel的blockHandler与fallback

本文介绍Sentinel的blockHandler与fallback的区别&#xff0c;背景是&#xff1a;发生限流时&#xff0c;配置的sentinel的blockhandler没有生效而fallback生效了&#xff1b;排查原因&#xff0c;从而给出Sentinel配置异常降级和限流降级的代码写法&#xff1b; 在查看源码前…

“尚硅谷”Mysql数据库DDL补充

数据类型 原则&#xff1a;所选择的类型越简单越好&#xff0c;能保存数值的类型越小越好&#xff0c;节省空间。 数值型 整型 特点 1、如果不设置无符号还是有符号&#xff0c;默认是有符号&#xff0c;如果(ˇ?ˇ) 想设置无符号我&#xff0c;需要添加unsigned关键字。 2…

Netty框架自带类DefaultEventExecutorGroup的作用,用来做业务的并发

一、DefaultEventExecutorGroup的用途 DefaultEventExecutorGroup 是 Netty 框架中的一个类&#xff0c;用于管理和调度事件处理器&#xff08;EventExecutor&#xff09;的组。在 Netty 中&#xff0c;事件处理是通过多线程来完成的&#xff0c;EventExecutor 是处理事件的基…

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(中)

你可以使用 Jersey 和 CXF 这些来写一个 Rest 或 SOAP 服务的java客服端。 你也可以直接使用 Apache HttpClient 来实现。但是 Feign 的目的是尽量的减少资源和代码来实现和 HTTP API 的连接。 *通过自定义的编码解码器以及错误处理&#xff0c;你可以编写任何基于文本的 HTT…

day22-513.找树左下角的值

513.找树左下角的值 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路 迭代 迭代的思路最简单&#xff0c;只需层序记录每一层的第一个结点即可&#xff0c;代码如下&#xff1a; class Solution { publi…

HR专家:未来零代码开发将成求职热门,你准备好了吗?

一名五十五岁的农民&#xff0c;毫无程式设计经验&#xff0c;靠著自己自学零码开发&#xff0c;竟为他的家乡建起了六个数位资讯系统&#xff0c;其中一个更是带动了乡村“厕所革命”。阿里云说&#xff0c;“也许10-15年以前&#xff0c;公司的招聘会要求员工能够使用 WORD, …

【沁恒蓝牙mesh】CH58x USB功能开发记录(三)

本博文主要记录 &#xff0c;【沁恒蓝牙mesh】CH58x USB功能开发记录&#xff08;三&#xff09;&#xff0c;数据收发基于寄存器级别解释 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xf…

阿秀思考了很久,最后还是决定啦!

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 小伙伴们大家好&#xff0c;我是阿秀。 经常看我文章的应该知道今年我过得很是颠簸&#xff0c;从今年二月份到现在我经历了很多事。 从《关于我组长跑路我被顶上来了这件事》、《天啦撸&#x…

再谈领导力和组织能力

&#xff08;1&#xff09;一个笑话 说的是一个人去买鸟&#xff1a; 问左边的鸟多少钱&#xff0c;卖鸟的人说十块钱。问为啥这么贵&#xff1f;卖鸟的人说它长的好看。 问右边的鸟多少钱&#xff0c;卖鸟的人说二十块钱。问为啥这么贵&#xff1f;卖鸟的人说它会学人讲话。 问…

JVM如何调优

一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范&#xff0c;JVM将内存划分为&#xff1a; New&#xff08;年轻代&#xff09; Tenured&#xff08;年老代&#xff09; 永久代&#xff08;Perm&#xff09; 其中New和Tenured属于堆内存&#xff0c;堆内存会从JVM启动参…

面试热题(LRU缓存)

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -1 …