一篇文章入门-微信小程序地图开发

2023-10-27

前言

最近接了个跟微信小程序地图有关的开发任务,第一次在小程序上开发地图,既兴奋又忐忑。还好,虽然小程序地图的 API 功能有些少,但是基本的需求都能覆盖到。

在这里,对微信小程序地图开发的基本功能进行总结归纳。官方文档对地图属性、方法的归纳比较到位,但缺乏示例代码,第一次搞还是有点迷糊的。网上的文章又写得七零八落,没见到有人专门总结归纳。

本人使用 React + Taro 开发的微信小程序,因此使用的是 Taro 提供的地图 API,但是和微信官方的是一样的,Taro 不过是二次封装而已。

相关链接:

创建地图

引入 Map 组件,再像普通组件使用即可。可以添加很多属性,各个属性的作用详见 Taro 文档。

import { Map } from '@tarojs/components';

class TaroMap extends Component {
  render() {
    <Map
      id="taroMap"
      longitude={100}
      latitude={90}
      show-location
    />
  }
}

在地图画标记点

通过设置 Map 组件的 markers 属性,在地图上设置标记点。

标记点一般都需要设置这几个属性:

  • id:设置标记点的 id
  • longitude:设置标记点经度
  • latitude:设置标记点纬度
  • iconPath:设置标记点图标
  • width:设置宽度
  • height:设置高度
import { Map } from '@tarojs/components';
import markerImg from './example.svg';

class TaroMap extends Component {

  markers = [
    {
      id: 0,
      iconPath: markerImg,
      longitude: 100,
      latitude: 20,
      width: 50,
      height: 50,
    },
    {
      id: 1,
      iconPath: markerImg,
      longitude: 100,
      latitude: 20,
      width: 50,
      height: 50,
    },
  ]

  render() {
    <Map
      id="taroMap"
      longitude={100}
      latitude={90}
      show-location
      markers={markers}
    />
  }
}

在地图画圆圈

通过设置 Map 组件的 circles 属性,在地图上画圈。

圆圈一般都需要设置这几个属性:

  • longitude:设置圆圈中心经度
  • latitude:设置圆圈中心纬度
  • color:设置圆圈边缘颜色
  • fillColor:设置圆圈填充颜色
  • radius:设置圆圈半径,单位是米,这里是实际的半径大小
import { Map } from '@tarojs/components';

class TaroMap extends Component {

  circles = [
    {
      longitude: 100,
      latitude: 20,
      color: '#30BC6B',
      fillColor: 'blue',
      radius: 500,
    },
  ]

  render() {
    <Map
      id="taroMap"
      longitude={100}
      latitude={90}
      show-location
      circles={circles}
    />
  }
}

初始化地图中心为当前位置,并画圈

大部分地图都会在进入页面时把中心移动到当前位置,同时会以当前位置为中心画一个圆圈。

该需求主要利用 getLocation() 方法来实现,getLocation() 方法可以获取当前的地理位置、速度等信息。

import { Map } from '@tarojs/components';

class TaroMap extends Component {

  state = {
    longitude: 100,
    latitude: 90,
    circles: [],
  }
  
  componentDidMount() {
    this.getCurrentLocation();
  }
  
  getCurrentLocation = async () => {
    const res = await Taro.getLocation({ type: 'gcj02' });
    const { longitude, latitude } = res;
    this.setState({
      longitude,
      latitude,
      circles: [{
        longitude, 
        latitude, 
        color: 'red', 
        fillColor: 'green', 
        radius: 500
      }],
    });
  }

  render() {
    const { longitude, latitude } = this.state;
  
    <Map
      id="taroMap"
      longitude={longitude}
      latitude={latitude}
      show-location
      circles={circles}
    />
  }
}

始终固定图标在地图中心

平时常见的地图,往往都会有一个图标固定在地图的中心,并且无论如何拖动地图,位置都始终不变。

在旧版的微信小程序地图中,这个功能需要使用 control 控件实现,但官方已经明确说明即将废弃该方式。后来又通过利用视图容器 cover-view 来实现,但是 2023 年的现在连 cover-view 也不需要了,直接使用普通的 view 容器组件即可。

这样一来,就是很普通的设置元素水平垂直居中的问题了。

目前原生组件均已支持同层渲染,建议使用 view 替代

import { Map, View, Image } from '@tarojs/components';

class TaroMap extends Component {

  render() {
    <Map
      id="taroMap"
      longitude={100}
      latitude={90}
      show-location
      className="map"
    >
      <View className="center">
        <Image className="center--image" src='./marker.png' />
      </View>
    </Map>
  }
}
.map {
  width: 100vw;
  height: 100vh;
  position: relative;
}

.center {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.center--image {
  width: 70px;
  height: 70px;
}

返回当前位置

点击返回图标,让地图回到当前位置,几乎是每个地图都必备的功能。而这个功能实现起来其实非常简单,首先调用 createMapContext() 创建一个地图实例对象,再调用地图实例的 moveToLocation() 方法将地图中心移动到当前定位点即可。

handleBackCurrenLocation = () => {
  // 需要把地图的id传入
  const wxMap = Taro.createMapContext(mapId);
  wxMap.moveToLocation({});
}

地图拖动展示不同的标记点

由于地图上的标记点可能会非常多,所以一般都不会一口气把所有的点都画到地图上,而是展示地图中心某个范围之内的点。

拖动地图,再展示新的地图中心附近的标记点。

该功能的实现需要用到 onRegionChange 事件,当地图视野发生变化时会触发该事件,也就是拖动地图。像这种频繁触发的事件,最好防抖。

import _ from 'lodash'

class TaroMap extends Component {
  // 防抖500毫秒
  onRegionChange = _.debounce(async (e) => {
    const { type, detail } = e;
    // 拖动地图会触发两次onRegionChange事件,我们只需要拖动结束时的事件
    if (type === 'end') {
      const { centerLocation: { longitude, latitude } } = detail;
      // ...获取新的标记点
      const markers = [];
      this.setState({ markers });
      }
    }
  }, 500)

  render() {
    <Map
      id="taroMap"
      longitude={100}
      latitude={90}
      show-location
      className="map"
      onRegionChange={this.onRegionChange}
    >
      <View className="center">
        <Image className="center--image" src='./marker.png' />
      </View>
    </Map>
  }
}

结尾

小程序地图开发常见的功能需求就是这些啦。

微信小程序地图功能不多,但是里面的坑却不少,回头也总结一下。

更多内容,可见我的博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇文章入门-微信小程序地图开发 的相关文章

  • 憨批的语义分割重制版11——Keras 搭建自己的HRNetV2语义分割平台

    憨批的语义分割重制版11 Keras 搭建自己的HRNetV2语义分割平台 学习前言 什么是HRNetV2模型 代码下载 HRNetV2实现思路 一 预测部分 1 主干网络介绍 a Section 1 b Section 2 c Secti
  • SpringBoot返回Json数据

    Spring Boot 返回 Json 数据 XML 文件的解析常见的解析工具有 DOM4j JDOM 等 为了标准化 XML 文件解析 Java 中提出了 JAXP 规范 使用的解析模型有 DOM 将标记语言文档一次性加载进入内存中 在内
  • 第九课: 工作空间-Work Space介绍

    2 7 工作空间 Work Space介绍 工作空间是WorkBench3 3集成开发环境对项目工程进行集中管理的空间 用户创建的BootRom工程 VxWorks工程 Downloadable工程和静态库工程等都存在于Work Space
  • 微信小程序使用crypto.js加密解密

    微信小程序中使用crypto js crypto js是用来进行AES加密的 注意AES在使用时有7个配置项 前后端加解密记着统一参数 测试时注意配置项的选择是否一致 测试工具 AES加密测试工具 下载crypto js npm i cry
  • 闭环系统的零极点图判定稳定性_《自动控制原理》课后习题答案.doc

    第五章 线性系统的频域分析与校正 习题与解答 5 1 试求题5 75图 a b 网络的频率特性 a b 图5 75 R C网络 解 a 依图 b 依图 5 2 某系统结构图如题5 76图所示 试根据频率特性的物理意义 求下列输入信号作用时

随机推荐

  • 点陶极速版《隐私政策》

    点陶极速版 隐私政策 生效日期 2021年3月10日 提示条款 大石桥市多禾网络科技有限公司 以下可统称为 我们 或 多禾 高度重视个人信息的保护 在您使用 点陶极速版 app提供的服务时 以下可称为 点陶极速版 服务 我们将按照本隐私政策
  • c++知识系列:new、operator new、placement new

    总结 operator new 三种形式 http www cplusplus com reference new operator 20new throwing 1 void operator new std size t size th
  • angular11 报错 ERROR Error: If ngModel is used within a form tag, either the name attribute must be s

    angular 报错 ERROR Error If ngModel is used within a form tag either the name attribute must be set or the form control mu
  • hyperledger中cryptogen工具使用

    cryptogen 主要功能 1 生成秘钥和证书文件 2 查看配置模板的信息 cryptogen 命令详解 output 指定存放生成秘钥和证书文件的路径 默认为当前目录下的crypto config目录 config 指定所采用的配置模板
  • 基于注意力机制的 CNN-BiGRU 短期电力负荷预测方法

    提出了一种基于 Attention 机制的CNN BiGRU 卷积神经网络 双向GRU 注意力机制 短期电力负荷预测方法 该方法将历史负荷数据作为输入 搭建由一维卷 积层和池化层等组成的 CNN 架构 提取反映负荷复杂动态变化的高维特征 将
  • 优秀的程序员——勇于尝试新技术并能快速掌握

    一个人有了好奇心求知欲就完了吗 那不能 这可不够 除了好奇去探索外 你还得有把探索所得 转化成自己经验的能力 这种能力的外在表现就是勇于尝试新技术 而且还得快速掌握 再举另一个同事的例子 这个同事在工作中遇到了一个问题 就是存储海量数据的问
  • ruoyi权限验证

    目录 首先在ruoyi的菜单管理中添加权限测试的按钮 设置权限字符 在角色管理中勾选新增加的权限按钮 在ruoyi前端代码中自行添加按钮组件 ajax发送请求给后端接口 后端接口 效果 首先在ruoyi的菜单管理中添加权限测试的按钮 设置权
  • 谷粒商城--nginx--高级篇笔记四

    谷粒商城 nginx 高级篇笔记四 1 nginx搭建域名访问 反向代理 1 1 动静分离 1 2 正向代理与反向代理 正向代理隐藏客户端 反向代理隐藏服务端 1 3 nginx与windows搭建域名访问环境 为什么能够通过修改host文
  • HTML5 Canvas 碰撞检测的简单实现

    本示例中演示的是模拟声纳探测的动画 在黑色的背景中画了两个黑色的障碍物 通过鼠标点击发出的声波可以将其检测出来 声波碰撞到障碍物之后 障碍物将向外发出声波 代码如下 HTML代码
  • 什么是抽象类?

    第四章 抽象类 入门级 大牛忽略 4 1 抽象类概述 以下内容可能有点烦 但是通俗易懂 简直舒服 我们创建一个动物类 并且在这个类中创建动物对象 但是当你提到动物类 你并不知道我说的是什么动物 只有看到了具体的动物 你才知道这是什么动物 所
  • python error

    1 IndentationError expected an indented block 缩进问题 gt gt gt for i in 1 2 3 4 t s i File
  • 带妹玩转Vulnhub【一】

    前言 题目是不想在刷了 想学一学渗透测试的知识 由于是开头之作 所以会写的比较的详细 尽量让大家少走弯路 带妹是不可能带妹的 这辈子都不可能带妹的 开始 下载 我们首先需要下载LazySysAdmin的虚拟镜像 这里 但是打开之后是ovf
  • 深度学习编译器系列视频摘要

    文章目录 0 前言 深度学习编译器 一 综述 深度学习编译器 二 Auto TVM 深度学习编译器 三 Auto Schedule 0 前言 在B站黄雍涛博士发了几个深度学习编译器的视频 感觉说得挺好 所以记录一下 深度学习编译器 一 综述
  • 【数学建模常用模型】图论专题

    图论是研究点 线间关系的一门学科 现实生活中 凡是涉及到事物间的关系 都可以抽象为图论模型 图论模型也是各大数学建模中常见的一种模型 主要用于计算 规划最短距离 路线等问题 下面介绍几个基本概念和算法 单源最短路 单源最短路指的是构造网络中
  • docker 挂载 no such file or directory问题

    现象 docker run d p8080 8080 name flowable v data flowable opt tomcat flowable all in one 就报 Error response from daemon OC
  • EMQX Newsletter 2022-05|v5.0 发布 2 个 rc 版本、云服务新增外部认证与数据集成方式

    五月 EMQX 5 0 0 rc 3 rc 4 版本陆续发布 该版本为规则引擎新增了对 jq 语法的支持 大幅度精简了默认配置文件 并对 Dashboard 菜单栏做了进一步的调整优化 EMQX 5 0 的正式发布已经越来越近 同时 v4
  • [Python 与 炒股] TuShare 使用篇之二

    之前是直接在控制台上使用 TuShare 来获取一些数据 接下来就写一个最简单的脚本来测一下TuShare 每个股民都有自己的股票池 那个就写一个程序来实时观测当前的股价 代码如下所示 usr bin python coding UTF 8
  • 设计模式:观察者模式和监听器模式

    最近有个需求 大概是想用一下观察者模式 或者是监听器模式 来实现一下 那问题来了什么是观察者模式 什么是监听器模式 两者之间有哪些联系和不同 具体实现是什么样的 那就听我讲解一下 观察者模式和监听器模式的组成 首先做一个总结 监听器模式实际
  • Docker Kafka

    0X00 CentOS部署kafka CentOS7搭建Kafka环境 简书Kafka是一个分布式流平台 基于Zookeeper的分布式消息系统 具有高吞吐量 高性能 实时及高可用等特点由服务器和客户端组成 通过高性能的TCP网络协议进行通
  • 一篇文章入门-微信小程序地图开发

    前言 最近接了个跟微信小程序地图有关的开发任务 第一次在小程序上开发地图 既兴奋又忐忑 还好 虽然小程序地图的 API 功能有些少 但是基本的需求都能覆盖到 在这里 对微信小程序地图开发的基本功能进行总结归纳 官方文档对地图属性 方法的归纳