【微信小程序】微信小程序集成高德卫星地图完成多边形绘制与截图保存

news2024/12/26 17:17:00

目录

功能需求

使用的技术点

注意点

实现步骤

代码

微信小程序-地图所在的wxml

微信小程序-地图所在的js

微信小程序-展示截图结果的wxml

微信小程序-展示截图结果的js

H5-地图所在的html

完成效果 

感谢阅读,欢迎讨论


功能需求

打开页面展示卫星地图,用户自行在地图上绘制多边形并给每个点进行距离计算,完成多边形绘图后显示计算面积

使用的技术点

微信小程序的web-view

官方文档:web-view | 微信开放文档

高德地图的地图JS API 

官方文档:概述-地图 JS API 2.0 | 高德地图API

<!-- JS文件引入 -->
<!-- web-view的微信小程序js文件 -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://webapi.amap.com/loader.js"></script>

注意点

1、web-view在个人小程序是不支持的,上线时需要在小程序后台设置开放web-view的request域名;

2、web-view如何在微信开发工具调试?

在模拟器的界面左下角栏目中,找到debug图标(小虫子),点击即可查看

3、高德地图的js api需要在高德开发者平台进行申请;

实现步骤

1、微信小程序页面定义web-view组件,在js文件中进行url的动态传入(url增加随机参数避免无刷新);

2、编写H5页面实现在高德卫星地图绘制多边形的功能;

3、H5触发完成动作发送数据包给微信小程序,微信小程序接收截图数据

代码

微信小程序-地图所在的wxml

<web-view wx:if="{{ url }}" src="{{url}}" bindload="loadWebView" binderror="errorWebView" bindmessage="messageWebView">
</web-view>
 

微信小程序-地图所在的js

Page({
  data: {
    latitude: '23.099994',
    longitude: '113.324520'
  },

  onLoad() {
      this.setData({url:'https://52381x1l37.zicp.fun/web/gaode?random=' + Math.random() + '#wechat_redirect'})
  },

  loadWebView(e) {
    console.log("加载web-view成功",e)
  },

  errorWebView(e) {
    console.log("加载web-view失败",e)
  },

  messageWebView(e) {
    console.log("web-view信息接收", e)
    // 记录base64的图片数据到缓存中,方便读取
    let h5Data = e.detail.data[0]
    if (h5Data.opera == 'finish') {
      wx.setStorageSync('finishBase64', h5Data.base64)
    }
  },  
})

微信小程序-展示截图结果的wxml

<view>
  <view style="font-size: 20px;font-weight: bold;text-align: center;">截图的图片</view>
  <image src="{{src}}"></image>
  <view style="font-size: 20px;font-weight: bold;text-align: center;">图片的base64数据</view>
  <view style="word-break: break-all;width:100%;">{{base64Text}}</view>
</view>

微信小程序-展示截图结果的js

Page({
  /**
   * 页面的初始数据
   */
  data: {
    src: '',
    base64Text: '', 
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    if (wx.getStorageSync('finishBase64')) {
      this.setData({
        src: wx.getStorageSync('finishBase64'),
        base64Text: wx.getStorageSync('finishBase64'),
      })
    }
  }
})

H5-地图所在的html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>{{$title}}</title>
</head>
<style>
    body,html,#container {
        width: 100%;
        height: 100%;
        margin: 0;
    }
</style>
<body>
<div id="container"></div>
<div id="app">
    <div style="font-size:14px;background:#fff;color: black; padding: 1px 5px;position: fixed; bottom:5%;right:10%;"
         @click="clickFinishSign()">完成</div>
</div>
</body>
</html>
<!-- 微信小程序 -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<!-- 高德地图 -->
<script src="https://webapi.amap.com/loader.js"></script>
<script>

</script>
<script>
    let map = null
    new Vue({
        el: '#app',
        data: {},
        methods: {
            clickFinishSign() {
                console.log("clickFinishSign")
                wx.miniProgram.getEnv(function(res) {
                    console.log(res,'res')
                    if (res.miniprogram) {
                        setTimeout(function(){
                            let container = document.getElementById('container')
                            html2canvas(container, {
                                scale: 1,
                                useCORS: true,
                                allowTaint: true,
                                height: container.clientHeight / 2, // 设置画图的高度
                                width: container.clientWidth, // 设置画图的宽度
                                x: 0, // 设置画图开始的位置,X轴
                                y: container.clientHeight / 4, // 设置画图开始的位置,Y轴
                            }).then(canvas => {
                                let base64 = canvas.toDataURL('image/jpeg')
                                console.log("高度:"+container.clientWidth,"宽度:" + container.clientHeight, "图片:" + base64)
                                wx.miniProgram.postMessage({data: {base64: base64, opera: 'finish'}})
                                wx.miniProgram.redirectTo({url: '/pages/finish/finish'})
                            })
                        },1000)
                    } else {
                        alert("请在微信小程序进行此操作")
                    }
                })
            }
        },
        mounted() {
            // 设置地图的初始中心点
            let center = [116.308904,39.913423]
            AMapLoader.load({ //首次调用 load
                key: "{{$webJsApiKey}}",//首次load key为必填
                version:'2.0',
                plugins:['AMap.TileLayer.Satellite']
            }).then((AMap)=>{
                map = new AMap.Map('container', {
                    layers: [new AMap.TileLayer.Satellite()],
                    zoom: 10,
                    zooms: [10, 25], // 控制缩放范围
                    center: center, // 地图中心点
                    WebGLParams: {preserveDrawingBuffer: true} // 设置允许截取高德地图图片内容
                });

                let o = new AMap.Polygon({map: map, path: [
                        new AMap.LngLat(116.308904,39.913423),
                        new AMap.LngLat(116.322122,39.901176),
                        new AMap.LngLat(116.338258,39.904600),
                        new AMap.LngLat(116.327271,39.912501),

                    ]})
                var area = Math.round(AMap.GeometryUtil.ringArea(o.getPath()))
                var text = new AMap.Text({
                    position: new AMap.LngLat(116.327271,39.912501),
                    text: '面积:' + area + '米',
                })
                map.add(text)
                let markers = [
                    [
                        new AMap.Marker({label: {content: 'E'}, position: new AMap.LngLat(116.308904,39.913423), map: map}),
                        new AMap.Marker({label: {content: 'F'}, position: new AMap.LngLat(116.322122,39.901176), map: map}),
                        new AMap.Marker({label: {content: 'G'}, position: new AMap.LngLat(116.338258,39.904600), map: map}),
                        new AMap.Marker({label: {content: 'H'}, position: new AMap.LngLat(116.327271,39.912501), map: map})
                    ],
                ];
                map.add(markers)
                map.setFitView() // 自适应显示标记的图案
            }).catch((e)=>{
                console.error(e);
            });
        }
    })
</script>

完成效果 

感谢阅读,欢迎讨论

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

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

相关文章

震惊!人工智能引发灰色经济,ChatGPT变身罪魁祸首!

人工智能技术的日益发展和普及&#xff0c;其呈现出无边界的开发空间&#xff0c;引领出无数的商业应用&#xff0c;越来越多的领域开始依赖这一技术&#xff0c;各种应用场景日益丰富&#xff0c;而其内在的巨大潜力也被不断开发。随之而来的则是&#xff0c;因为技术的滥用和…

13 张图,带你深入理解Synchronized,吊打所有大厂面试官

前言 分享一篇优质文章给你。 本文带读者们由浅入深理解Synchronized&#xff0c;让读者们也能与面试官疯狂对线&#xff0c;同时写出高性能的代码和架构。 在并发编程中Synchronized一直都是元老级的角色&#xff0c;Jdk 1.6以前大家都称呼它为重量级锁&#xff0c;相对于J…

freertos任务优先级分配

RQ 任务&#xff1a;IRQ 任务是指通过中断服务程序进行触发的任务&#xff0c;此类任务应该设置为所有任务里面优先 级最高的。高优先级后台任务&#xff1a;比如按键检测&#xff0c;触摸检测&#xff0c;USB 消息处理&#xff0c;串口消息处理等&#xff0c;都可以归为这一类…

Flink自定义函数之表值聚合函数(UDTAGG函数)

1.表值聚合函数概念 自定义表值聚合函数&#xff08;UDTAGG&#xff09;可以把一个表&#xff08;一行或者多行&#xff0c;每行有一列或者多列&#xff09;聚合成另一张表&#xff0c;结果中可以有多行多列。 理解&#xff1a;假设有一个饮料的表&#xff0c;这个表有 3 列&a…

MF矩阵分解——SVD、LFM、RSVD、SVD++

文章目录 1 矩阵分解MF针对问题2 解决思路2.1 引例2.2 实际应用中 3 MF的几种方式3.1 特征值分解特征值、特征向量特征值分解缺点 3.2 奇异值分解(SVD)示例&#xff1a;基本定理计算步骤缺点 3.3 Basic SVD&#xff08;LFM、Funk SVD&#xff09;3.4 RSVD进一步优化 3.5 SVD 4 …

mybatis高频面试题

什么是mybatis mybatis框架是一个开源的数据持久性层框架它的内部封装了通过JDBC访问数据库的操作&#xff0c;支持普通的SQL查询、存储过程和高级映射&#xff0c;几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis作为持久层框架&#xff0c;其主要思想是…

【完美解决】mysql启动不了:本地计算机上的MySQL服务启动后停止

本文基于mysql8.0&#xff0c;5.7也可以参考 navicat 突然莫名其妙连不上mysql 查看服务&#xff0c;也启动不了&#xff0c;手动启动出现错误&#xff1a; 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止 20230525更新&#xff01; 先…

Jmeter组件:Random CSV Data Set Config(随机读取文件数据)

一、Jmeter组件&#xff1a;Random CSV Data Set Config(随机读取文件数据) 功能&#xff1a;该组件可以随机读取CSV文件中的每一行的数据 二、下载插件&#xff1a;(jmeter-plugins-random-csv-data-set-xx.jar),并放到lib/ext目录下&#xff0c;重启jmeter 也可以在Jmeter…

【软考-中级】系统集成项目管理工程师【12 沟通和关系人】

持续更新。。。。。。。。。。。。。。。 【第十二章】沟通和关系人 2 分 12.1 沟通的基本概念12.1.1沟通的定义11.1.2 沟通的方式 12.2制订沟通管理计划12.2.1制订沟通管理计划的输入12.2.2制订沟通管理计划的工具 12.3 管理沟通12.3.1管理沟通输入12.3.2管理沟通的工具12.3.3…

IMX6ULL裸机篇之RTC实验原理

一. RTC实时时钟简介 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合&#xff0c;可以使用专用的实时时钟芯片来完成此功能。 但是&#xff0c;现在大多数的 MCU 或者 MPU 内部就已经自带了实时时钟外…

JVM进程缓存+Lua语法初始+缓存同步策略

传统的缓存策略是一般请求到达Tomact之后&#xff0c;先进行查询Redis&#xff0c;如果未命中则进行查询数据库&#xff0c;是存在着下面的问题的: 1)请求要经过Tomact进行处理&#xff0c;Tomact的性能成为整个系统的瓶颈&#xff1b; 2)当Redis缓存失效的时候&#xff0c;会对…

SKD180

SKD180 点击了解详情&#xff1a;SKD180-1点击了解详情&#xff1a;SKD180-2点击了解详情&#xff1a;SKD180-3 SKD180系列是陕西斯科德智能科技针对物联网专门研发的网关&#xff0c;具备以下特点&#xff1a; 硬件平台&#xff1a;基于ARM硬件平台&#xff0c;出色的数据处理…

微信小程序---使用云数据库实现登录功能

实现效果 在数据库找不到登录信息时弹出提示框 一、开通云开发平台并创建数据表 进入微信官方文档按步骤操作即可 二、登录界面及样式 login.wxml如下&#xff1a; <view id"total"> <image src"../../images/user_cog_green.png"></im…

手写操作系统+手写网络协议栈,太硬核了

内功决定一个程序员的上限&#xff0c;这是每个程序员都知道的道理。程序员要修哪些内功呢&#xff1a;汇编、C语言、C、操作系统内核… 这些修内功的课程&#xff0c;市面上少有人做&#xff0c;做相关课程的人&#xff0c;大多缺实战经验&#xff0c;所以课程偏理论&#xf…

chatgpt赋能python:PythonShebang介绍:如何为python脚本添加shebang?

Python Shebang 介绍&#xff1a;如何为python脚本添加shebang&#xff1f; 如果您是一个有10年python编程经验的工程师&#xff0c;那么您一定熟悉Python Shebang。在这篇文章中&#xff0c;我们将深入探讨Python Shebang是什么&#xff0c;为什么它很重要&#xff0c;并演示…

如何检测docker是否支持host.docker.internal

要检查您的 Docker 是否支持 host.docker.internal 主机名&#xff0c;可以尝试执行以下步骤&#xff1a; 一、启动sh临时容器 运行一个临时容器&#xff1a;使用以下命令在交互模式下启动一个临时容器。 docker run -it --rm alpine sh这将在 Alpine Linux 容器中启动一个交…

杂记(四)

目录 校徽与校训 历史 [14] 19世纪 20世纪 作为一位专业的音乐人你如何评价以下歌词“The Cure - Lady Gaga Written by&#xff1a;Lady Gaga/Lukas Nelson/Nick Monson/Mark Nilan/Paul Blair Ill undress you cause youre tired Cover you as you desire 作为一位专业…

JavaEE进阶5/24

1.IOC 控制反转 把对象的生命周期的控制权由程序员反转给其他人。 控制反转减少了代码的耦合性。 哪里发生了反转&#xff1f;f 1.对象生命周期的控制权由程序员转交给Spring 2.对象创建的顺序反转了&#xff0c;原本程序员通过new来创建的是从外层到内层的&#xff0c;控制反转…

Turtlebot4 和 Turtlebot3 和 Turtlebot2 ROS开源机器人说明及参数对比

一、TB4和TB3产品参数对比&#xff1a; 二、Turtlebot 3和Turtlebot 4的比较&#xff1a; 很多未接触过Turtlebot ROS机器人系列的用户&#xff0c;看到TB3和TB4两型号&#xff0c;就会很自然地认为TB4肯定比TB3高级&#xff0c;会问到TB4和TB3的区别&#xff0c;TB4进行了哪些…

k8s入门实战-Service

k8s入门实战-Service Service 和 Label Service 通过一组 Pod 路由通信。Service 是一种抽象&#xff0c;它允许 Pod 死亡并在 Kubernetes 中复制&#xff0c;而不会影响应用程序。在依赖的 Pod (如应用程序中的前端和后端组件)之间进行发现和路由是由Kubernetes Service 处理…