地图多点自动缩放,居中,思路和手写

效果如下

  1. 多个标记点顺次标记连接起来
  2. zoom缩放到合适等级,刚好能放下那么多点
  3. 视野刚好在正中间

zoom 实现思路

  1. 获取多点的最大经纬度点和最小经纬度点(这两个点相距离最远)
  2. 计算2个这两点之间的距离
  3. 地图是有比例尺的,根据比例尺可以得到1cm对应的zoom值
  4. 根据要展示的长度,适当调整zoom大小
    1

实现

// 多点
const points = [{ latitude: 39.87, longitude: 116.38 },{ latitude: 31.25, longitude: 121.46 },{ latitude: 30.271, longitude: 119.98 },{ latitude: 30.2737514, longitude: 120.1358911 }
],// 转换成标准数据 { lat: 39.87, lng: 116.38 },
// 获取最大和最小经纬度值
let list = [];
let lngMax = data[0].longitude;
let lngMin = data[0].longitude;
let latMax = data[0].latitude;
let latMin = data[0].latitude;
list = r.data.map((item: any, index: number) => {if (item.longitude > lngMax) {lngMax = item.longitude;}if (item.longitude < lngMin) {lngMin = item.longitude;}if (item.latitude > latMax) {latMax = item.latitude;}if (item.latitude < latMin) {latMin = item.latitude;}return {lat: item.latitude,lng: item.longitude,};
});// zoom计算方法 记得引入'./calculateZoom.tsx',下面有
let zoom = calculateZoom(latMin, lngMin, latMax, lngMax);
// 中心点坐标 
const latCenter = ((latMax + latMin) * 500000) / 1000000;
const lngCenter = ((lngMax + lngMin) * 500000) / 1000000;
// 调用更新中心点方法 这个方法自己写,大同小异
updateCenter({ lat: latCenter, lng: lngCenter })

引入的calculateZoom.tsx文件

const getDistance = (lat1: number, lng1: number, lat2: number, lng2: number) => {var dis = 0;var radLat1 = toRadians(lat1);var radLat2 = toRadians(lat2);var deltaLat = radLat1 - radLat2;var deltaLng = toRadians(lng1) - toRadians(lng2);var dis =2 *Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) +Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2),),);return dis * 6378137;
};/*** * @param distance * 百度地图缩放级别与比例尺对应数值百度地图缩放级别从19~1,共分为19级,级别越大,范围越小:[19级,18级,17级,16级,15级,14级,13级,12级,11级,10级,9级,8级,7级,6级,5级,4级,3级,2级,1级]其分别对应的比例尺为:[1:20米(简称20米,后同),50米,100米,200米,500米,1公里,2公里,5公里,10公里,20公里,25公里,50公里,100公里,200公里,500公里,1000公里,2000公里,5000公里,10000公里]*/
const getZoom = (distance: number) => {// 注意这里是1cm比例展示let zoom = 0;if (distance > 10000000) {zoom = 1;} else if (distance > 5000000) {zoom = 2;} else if (distance > 2000000) {zoom = 3;} else if (distance > 1000000) {zoom = 4;} else if (distance > 500000) {zoom = 5;} else if (distance > 200000) {zoom = 6;} else if (distance > 100000) {zoom = 7;} else if (distance > 50000) {zoom = 8;} else if (distance > 25000) {zoom = 9;} else if (distance > 20000) {zoom = 10;} else if (distance > 10000) {zoom = 11;} else if (distance > 5000) {zoom = 12;} else if (distance > 2000) {zoom = 13;} else if (distance > 1000) {zoom = 14;} else if (distance > 500) {zoom = 15;} else if (distance > 200) {zoom = 16;} else if (distance > 100) {zoom = 17;} else if (distance > 50) {zoom = 18;} else if (distance > 20) {zoom = 19;} else {// 默认缩放值zoom = 12;}return zoom;
};
// 入参最小经纬度点和最大经纬度点
export const calculateZoom = (latMin: number, lngMin: number, latMax: number, lngMax: number) => {// 计算两个点之间距离let distance = getDistance(latMin, lngMin, latMax, lngMax);// 根据距离计算对应的zoomlet zoom = getZoom(distance / 4); // 这里除以4是为了展示的范围在4-8cm之间(大致按照2的2次方缩放)return zoom;
};

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

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

相关文章

1.傅里叶处理图片原理和代码实现

在这里首先声明&#xff0c;本文纯粹看了别的博主的文章&#xff0c;觉得博主写的原理清晰明了&#xff0c;容易理解&#xff0c;很详细&#xff0c;在这里写一遍是作为笔记&#xff0c;方便以后再翻看时容易查找。大家可以参考下面这个博文&#xff1a; 图像的傅里叶变换_图像…

SAP OData(二)Association

Entity之间用Association来表示关联关系&#xff0c;可以同CDS view中的Association一起理解。 我们在上次已经建好实体Item的基础上&#xff0c;再建一个Header&#xff0c;其方法的重写也参考Item即可&#xff0c;然后开始本篇的探索。 一&#xff0c;构建Association 1.1…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的…

抽奖机制模型及算法

抽奖机制 连抽保底概率模型不中概率加大模型&#xff08;抽卡保底&#xff09; 抽奖概率为n%&#xff0c;在达到某次次数后&#xff0c;每次概率比上次高m%&#xff0c;直至达到保底次数&#xff08;概率累加和为100%&#xff09;&#xff0c;当抽到极品道具时候&#xff0c;…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外&#xff0c;前面还有一段其他的数据&#xff0c;这段数据分为两部分&#xff0c;ip包头&#xff08;一般20字节&#xff09;和tcp包头&#xff08;一般20字节&#xff09;&#xff0c;一般这两个头长度和为40&#xff0c;我们直接跳…

SQL-DQL-基础查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

制造业管理者必备技能:掌握6S管理!

当今竞争激烈的制造业领域&#xff0c;为了提高效率、优化流程&#xff0c;并实现持续创新&#xff0c;制造业管理者需要掌握一种全面、系统的管理方法——6S管理。6S管理是源自于日本的精益管理方法&#xff0c;通过整理、整顿、清扫、标准化、维持和安全这六个步骤&#xff0…

基于SkyEye仿真6678处理器:实现国产操作系统ReWorks仿真运行

信号处理的数据量以及实时性的要求随着嵌入式技术的发展不断提高&#xff0c;众多厂商和研究所选择多核DSP处理器芯片去替代原有的单核DSP&#xff0c;并运行嵌入式操作系统来保证信号处理的实时性以及精确性。然而受到硬件资源或者项目实施周期限制&#xff0c;软件工程师调试…

Jmerer之FTP测试

1、文件上传下载测试&#xff0c;可以使用sample:FTP请求&#xff0c;当然也可以使用HTTP Request采样器中的File Upload向服务器上传文件 2、本章重点介绍FTP请求进行文件的上传下载测试&#xff0c;添加 FTP请求&#xff0c;界面主要配置如下&#xff1a; Server Name or I…

Linux 软连接ln -s

什么是文件软链接&#xff1f; Linux 的“软连接”与windos 的"快捷方式"相似。文件软链接&#xff08;Symbolic Link 或 SymLink&#xff09;是一种特殊的文件类型&#xff0c;它实际上是一个指向另一个文件或目录的引用。创建软链接时&#xff0c;系统会建立一个新…

访问学者申请需要注意什么?

访问学者申请是一项复杂而重要的过程&#xff0c;需要申请人在准备材料和过程中注意一些关键事项&#xff0c;以确保顺利完成申请并提高成功率。以下是知识人网小编的一些建议&#xff0c;希望对你的访问学者申请有所帮助。 1. 详细了解目标学术机构&#xff1a; 在申请访问学…

SQL性能分析-整理

昨日对MySQL的索引整理了一份小文档&#xff0c;对结构/分类/语法等做了一个小总结&#xff0c;具体文章可点击&#xff1a;MySQL-索引回顾&#xff0c;索引知识固然很重要&#xff0c;但引入运用到实际工作中更重要。 参考之前的文章&#xff1a;SQL优化总结以及参考百度/CSDN…

深入探讨:开发连锁餐饮APP的关键技术要点

时下&#xff0c;开发一款功能强大、用户友好的连锁餐饮APP成为许多餐饮企业的当务之急。在本文中&#xff0c;我们将深入探讨开发连锁餐饮APP的关键技术要点&#xff0c;涵盖了前端、后端以及数据库等方面。 一、前端开发 前端是用户与APP交互的入口&#xff0c;因此设计良好…

比尔盖茨:如果只能解决一个问题,我的答案总是营养不良

谷禾健康 当地时间12月19日&#xff0c;微软联合创始人、亿万富翁比尔盖茨发布了对来年的年度预测&#xff0c;称 2024 年将是一个“转折点”。 在这封长达 10 页的信中他展示了对人工智能领域的更多创新、婴儿营养不良问题的突破、气候变化谈判的进展等多方面的期待。 人工智能…

【iOS】数据持久化(四)之FMDB

正如我们前面所看到的&#xff0c;原生SQLite API在使用时还是比较麻烦的&#xff0c;于是&#xff0c;开源社区就出现了一系列将SQLite API进行封装的库&#xff0c;其中FMDB的被大多数人所使用 FMDB和SQLite相比较&#xff0c;SQLite比较原始&#xff0c;操作比较复杂&#…

如何制作能够提高产品的市场认知度的产品说明书模板?

在当今竞争激烈的市场环境中&#xff0c;产品的市场认知度对于企业的成功至关重要。一个深入人心的产品形象&#xff0c;不仅能提高销售额&#xff0c;还能塑造品牌形象&#xff0c;增强消费者忠诚度。那么如何能有效地提高产品的市场认知度呢&#xff1f;接下来就说一下&#…

MySQL数据被误删怎么办?

文章目录 前言数据备份恢复工具数据备份策略数据备份恢复演示备份数据模拟数据误删恢复备份的数据恢复未备份的数据 总结 前言 很多年前&#xff0c;被公司外派到一家单位驻场开发一个OA项目&#xff0c;两个开发对接各部门的需求&#xff0c;需求还要及时生效&#xff08;一边…

Docker进阶数据卷目录挂载及在线部署

前言 为了很好的实现数据保存和数据共享&#xff0c; Docker 提出了 Volume 这个概念&#xff0c;简单的说就是绕过默认的联合 文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷 一. 数据卷介绍 Docker 中的数据卷&#xff08;Volume&#x…

【计算机组成-计算机基本结构】

课程链接&#xff1a;北京大学陆俊林老师的计算机组成原理课 1. 电子计算机的兴起 原因&#xff1a;二战对计算能力的需求世界上第一台通用电子计算机 ENIAC&#xff08;Electronic Numerical Integrator And Computer&#xff09;&#xff1a;时间&#xff1a;1946&#xff1…

Js - 函数(四)

1.函数简单介绍 什么是函数&#xff1f; 函数&#xff08;function&#xff09;是执行特定任务的一段代码块 为什么需要函数&#xff1f; 可以实现代码复用&#xff0c;提高开发效率 2.函数使用 函数的声明语法 函数名命名规范 函数的调用语法 函数体 函数体是函数的构…