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

效果如下

  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.hqwc.cn/news/343980.html

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

相关文章

Python基础知识:整理11 模块的导入、自定义模块和安装第三方包

1 模块的导入 1.1 使用import 导入time模块&#xff0c;使用sleep功能&#xff08;函数&#xff09; import time print("start") time.sleep(3) print("end")1.2 使用from 导入time的sleep功能 from time import sleep print("start") slee…

Jmeter Linux环境压测Lottery接口

1、把Dubbo插件放到Linux中Jmeter的lib/ext目录下 2、参数化 3、设置线程数 4、把测试计划中的Dubbo路径替换成Linux中的路径 /home/apache-jmeter-5.5/lib/ext 5、上传压测脚本到压力机 6、执行压测&#xff0c;观察是否有消息积压 ①Jmeter中执行压测脚本 ②检查mq控制台是…

Docker实战06|深入剖析Docker Run命令

前几篇文章中&#xff0c;重点讲解了Linux Namespace、Cgroups、AUFS的核心原理&#xff0c;同样也是Docker的底层原理实现。目录如下&#xff1a; • 《Docker实战01&#xff5c;容器与开发语言》 • 《Docker实战02&#xff5c;Namespace》 • 《Docker实战03&#xff5c;C…

【Web】forward 和 redirect 的区别

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Web ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Forward&#xff08;转发&#xff09;&#xff1a; Redirect&#xff08;重定向&#xff09;&#xff1a; 区别总结&#xff1a; …

ES索引原理

ES在检索时底层使用的就是倒排索引&#xff0c;正向索引是通过key找value&#xff0c;反向索引则是通过value找key。 索引会分为两个区域&#xff1a;索引区和元数据区。数据是这样存储在里面的&#xff1a; 简单理解就是&#xff1a;当要录入一条数据时&#xff0c;首先会将完…

68.网游逆向分析与插件开发-角色数据的获取-利用蓝量属性分析角色数据基址

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;67.网游逆向分析与插件开发-角色数据的获取-分析角色数据基址-CSDN博客 然后分析任何一个东西&#xff0c;逆向分析的本质就是找东西的意思&#xff0c;找东西核心的观念是内存里得有&#xff0c;就是…

在机械行业中,直线导轨和弧形导轨哪个应用范围更广泛?

弧形导轨和直线导轨是两种常见的导轨类型&#xff0c;直线导轨主要被用于高精度或快速直线往复运动场所&#xff0c;而弧形导轨是一种专门设计用于曲线运动的导轨系统&#xff0c;那么在机械行业中&#xff0c;直线导轨和弧形导轨哪个应用范围更加广泛呢&#xff1f; 直线导轨主…

Redis的设计、实现

数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的…

11.3、信赖域策略优化算法TRPO强化学习-运用实践

基于LunarLander登陆器的TRPO强化学习&#xff08;含PYTHON工程&#xff09; TRPO强化学习算法主要分为3个部分&#xff0c;分别介绍其理论、细节、实现 本文主要介绍TRPO的理论和代码的对应、实践 TRPO系列&#xff08;TRPO是真的复杂&#xff0c;全部理解花费了我半个月的…

计算机组成原理-计算机的发展(计算机系统 硬件发展 软件发展 微处理器和微计算机的发展 摩尔定律 发展趋势)

文章目录 总览什么是计算机系统软件硬件的发展第一代第二代第三代第四代微处理器的发展相关人物摩尔定律 软件的发展目前的发展趋势小结 总览 什么是计算机系统 软件 语言处理程序就是编译程序之类的 调试代码就是服务程序 硬件的发展 第一代 逻辑元件&#xff1a;处理电信…

【Leetcode】2085. 统计出现过一次的公共字符串

文章目录 题目思路代码 题目 2085. 统计出现过一次的公共字符串 思路 使用两个哈希表 words1Count 和 words2Count 分别统计两个数组中每个单词的出现次数。然后遍历 words1Count 中的每个单词&#xff0c;如果该单词在 words1 中出现了一次&#xff0c;且在 words2 中也出…

知识库软件有很多,这几个最好用

时代进步的同时&#xff0c;逐渐优化的企业知识库已经成为企业优化工作效率、提升企业竞争力的重要工具。随着云计算和大数据技术的快速发展&#xff0c;知识库软件如雨后春笋般出现在人们的视野中。下面&#xff0c;我从寻宝者的角度&#xff0c;向大家稳稳地推荐三款最优秀的…