前端项目加载离线的百度地图,利用工具进行切指定区域的地图影像,自定义图层getTilesUrl

百度地图在开发中我们经常使用,但是有些项目是需要在内网进行,这时候我们不得不考虑项目中一些功能需要请求外网静态资源,比如百度地图。只有把包下载到本地,才能让静态资源文件的正常的访问。

目录

获取百度地图开发秘钥

引入在线百度地图

加载离线地图

获取百度地图离线包

引入百度地图离线包

显示指定区域的地图影像

全能电子地图下载器

街道图

混合图

百度地图切图工具

完整代码


获取百度地图开发秘钥

我们使用的v.3.0版本

在项目中要使用百度地图API,必须要有秘钥,获取方法教程jspopularGL | 百度地图API SDK

引入在线百度地图

<style scoped>
#baiduMap {height: 100%;width: 100%;
}</style><template><div id="baiduMap"></div>
</template><script>
import $ from 'jquery'
/* eslint-disable */
export default {name:'baiduMap',data(){return{url:'http://api.map.baidu.com/api?v=3.0&ak=你自己申请的秘钥&callback=createMap'}},mounted(){this.initMap()},methods:{addBaiDuAPI(url){return new Promise((resolve)=>{let script = document.createElement("script");script.src = url;document.body.appendChild(script);resolve()})},async initMap() {const maxZoom =19;let that = this;await that.addBaiDuAPI(that.url);//百度地图加载成功,会回调createMap这个函数window.createMap = () => {window.BMAP_NORMAL_MAP.m.X3 = window.BMAP_NORMAL_MAP.m.mc = window.BMAP_NORMAL_MAP.m.maxZoom = window.BMAP_PERSPECTIVE_MAP.m.X3 = window.BMAP_PERSPECTIVE_MAP.m.mc = window.BMAP_PERSPECTIVE_MAP.m.maxZoom = window.BMAP_SATELLITE_MAP.m.X3 = window.BMAP_SATELLITE_MAP.m.mc = window.BMAP_SATELLITE_MAP.m.maxZoom = window.BMAP_HYBRID_MAP.m.X3 = window.BMAP_HYBRID_MAP.m.mc = window.BMAP_HYBRID_MAP.m.maxZoom = maxZoom;//创建Map实例let map = new BMap.Map("baiduMap", {minZoom: 3, maxZoom: 19}); // 创建Map实例map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 创建点坐标,初始化地图,设置中心点坐标和地图级别map.setMapType(BMAP_NORMAL_MAP);window.baiduMap = map; //存储到全局变量baiduMapmap.enableScrollWheelZoom(true); //开启鼠标滚轮缩放map.enableInertialDragging(); //两秒后开启惯性拖拽setTimeout(function (){//添加地图类型控件map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, type: BMAP_NAVIGATION_CONTROL_ZOOM}));map.addControl(new BMap.NavigationControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));//地图类型,地图,卫星var size = new BMap.Size(20, 220);map.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP], anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));map.addEventListener("mousemove", function (e) {$(".BMap_cpyCtrl").text("鼠标位置:" + e.point.lng + "," + e.point.lat)});//城市控件size = new BMap.Size(70, 10);map.addControl(new BMap.CityListControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));/**map.addEventListener("zoomend", function() {let zoom = map.getZoom();map.centerAndZoom((new BMap.Point(lon, lat)),zoom)});**/},300)};},}
}
</script>

运行加载效果

加载离线地图

获取百度地图离线包

获取地址:链接:https://pan.baidu.com/s/1HgtmntYcQEdCDOii5ypazQ?pwd=yqe7提取码:yqe7

引入百度地图离线包

1、下载好的离线包,放在项目的公共资源目录下

2、修改代码,添加initOfflineMap方法加载离线地图

async initOfflineMap(){let that = this;//加载工具类javascript文件window.bmapConfig = {'tiles_path': '',      //显示普通地图,为空默认在 tiles/ 目录'tiles_satellite_path': '', //显示卫星影像,为空默认在 tiles_satellite/ ,只有底图没有地址标注'tiles_hybrid_path': ''  //显示带有街道的卫星影像,为空默认在 tiles_hybrid/,需和卫星影像配合使用};window.bmapConfig.home_dir = "/static/bmap_offline_demo/"; //地图API主目录window.bmapConfig.tiles_path = bmapConfig.home_dir + "/tiles";window.bmapConfig.tiles_satellite_path = bmapConfig.home_dir + "/tiles_satellite";window.bmapConfig.tiles_hybrid_path = bmapConfig.home_dir + "/tiles_hybird";await that.addScript(window.bmapConfig.home_dir + "map3.0.js");//创建Map实例let map = new BMap.Map("baiduMap", {minZoom: 3, maxZoom: 19}); // 创建Map实例map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 创建点坐标,初始化地图,设置中心点坐标和地图级别map.setMapType(BMAP_NORMAL_MAP);window.baiduMap = map; //存储到全局变量baiduMapmap.enableScrollWheelZoom(true); //开启鼠标滚轮缩放map.enableInertialDragging(); //两秒后开启惯性拖拽setTimeout(function (){//添加地图类型控件map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, type: BMAP_NAVIGATION_CONTROL_ZOOM}));map.addControl(new BMap.NavigationControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));//地图类型,地图,卫星var size = new BMap.Size(20, 220);map.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP], anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));map.addEventListener("mousemove", function (e) {$(".BMap_cpyCtrl").text("鼠标位置:" + e.point.lng + "," + e.point.lat)});//城市控件size = new BMap.Size(70, 10);map.addControl(new BMap.CityListControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));/**map.addEventListener("zoomend", function() {let zoom = map.getZoom();map.centerAndZoom((new BMap.Point(lon, lat)),zoom)});**/},300)},

3、在mounted中使用,需要注释在线地图的方法。

mounted(){// this.initMap() // 加载在线地图this.initOfflineMap() // 加载离线地图},

4、出现淡黄的画面说明引入离线地图成功。

显示指定区域的地图影像

利用切图工具,获取中国地图任意区域的,使用百度地图提供的自定义图层API(getTilesUrl)加载图像。

有两种工具切图:1、全能电子地图下载器。2、百度地图切图工具。

区别:

  • 百度地图切图工具只能切街道图,不能切混合图
  • 全能电子地图下载器app已经提供地图区域,切那个区域由我们自己决定。百度地图切图工具是根据一张图片(png格式)进行切图,根据地图瓦片规则进行切片

根据自己场景需求进行选择。

全能电子地图下载器:https://pan.baidu.com/s/1OzdhPWpIqiRaSiWGs2CVzw?pwd=wc41提取码:wc41。

百度地图切图工具:链接:https://pan.baidu.com/s/1ANKedI6PDr3Hx6mG55XXcw?pwd=m0bi提取码:m0bi。

全能电子地图下载器

2、地图级别一般用13到17级,最大只能切到17级(勾选上18、19什么的也没用,切不了)

一个区域切的级别很多的话,切图速度很慢,如果非要切多级别的,建议级别分开切

3、点击地图,选百度地图,需要的地图类型只有街道图和混合图,这两种地图需要分开切图。

街道图

1、选街道图后,可以选两种切图方式,一种是自己框选,一种是选择某个地区。

2、选择存放路径,点击开始,开始切图。

3、切图完成后,在目录下会有baidumaps文件夹,里面的roadmap文件就是街道图文件。把roadmap文件夹里的全部文件复制到离线地图包bmap_offline_demo/目录下。

roadmap目录名称可以自定义名称

混合图

1、选混合图,其他步骤和街道图一样。

2、切图完成后,把overlay文件夹里的全部文件复制到离线地图包bmap_offline_demo/的tiles_hybird文件夹里,再把satellite文件夹里的全部文件复制到离线地图包bmap_offline_demo/的tiles_satellite文件夹里。

3、添加代码

getTilesUrl方法会在地图缩放改变时,自动调用。

zoom:地图当前所在的缩放级别。

切好的图最好放在服务器上面,因为切的级别越大,文件就越多。切图大小在几百M,G,T级别都是很正常。

//自定义图层let tileLayer = new BMap.TileLayer({isTransparentPng: true});tileLayer.getTilesUrl = function (tileCoord, zoom) {if (zoom >= 3) {var x = tileCoord.x;var y = tileCoord.y;if (x < 0) {x = 'M' + (-x);}if (y < 0) {y = 'M' + (-y);}//根据瓦片的文件路径拼接URLreturn '/static/bmap_offline_demo/roadmap/' + zoom + '/' + x + '/' + y + '.png';}};map.addTileLayer(tileLayer);

4、显示效果,地图显示的就是我们刚刚切好的区域图

百度地图切图工具

1、双击运行BaiduMapTileCutter.exe。

2、选择存储路径,输出类型选择仅图块,输入经纬度,点击下一步。

3、自定义放大级别,最大为19,最小为3。设置之后点击下一步。

4、作为图层保存,点击下一步,随后开始切图。

5、切图成功后,去保存路径查找。

将切好的放大级别的文件放到服务器或项目上,在bmap_offline_demo/目录下新建文件夹,文件夹名称自定义,把切换的瓦片 7.8.9这三个级别放到自定义文件夹目录里面。

需要注意的是,这个自定义文件目录的名称和代码里面的路径一致

完整代码

baiduMap.vue

<style scoped>
#baiduMap {height: 100%;width: 100%;
}</style><template><div id="baiduMap"></div>
</template><script>
import $ from 'jquery'
/* eslint-disable */
export default {name:'baiduMap',data(){return{url:'http://api.map.baidu.com/api?v=3.0&ak=你自己申请的秘钥&callback=createMap'}},mounted(){// this.initMap() // 加载在线地图this.initOfflineMap() // 加载离线地图},methods:{addScript(src) {let script = document.createElement("script");script.src = src;document.body.appendChild(script);},addBaiDuAPI(url){return new Promise((resolve)=>{let script = document.createElement("script");script.src = url;document.body.appendChild(script);resolve()})},async initMap() {const maxZoom =19;let that = this;await that.addBaiDuAPI(that.url);//百度地图加载成功,会回调createMap这个函数window.createMap = () => {window.BMAP_NORMAL_MAP.m.X3 = window.BMAP_NORMAL_MAP.m.mc = window.BMAP_NORMAL_MAP.m.maxZoom = window.BMAP_PERSPECTIVE_MAP.m.X3 = window.BMAP_PERSPECTIVE_MAP.m.mc = window.BMAP_PERSPECTIVE_MAP.m.maxZoom = window.BMAP_SATELLITE_MAP.m.X3 = window.BMAP_SATELLITE_MAP.m.mc = window.BMAP_SATELLITE_MAP.m.maxZoom = window.BMAP_HYBRID_MAP.m.X3 = window.BMAP_HYBRID_MAP.m.mc = window.BMAP_HYBRID_MAP.m.maxZoom = maxZoom;//创建Map实例let map = new BMap.Map("baiduMap", {minZoom: 3, maxZoom: 19}); // 创建Map实例map.centerAndZoom(new BMap.Point(116.404, 39.915), 11); // 创建点坐标,初始化地图,设置中心点坐标和地图级别map.setMapType(BMAP_NORMAL_MAP);window.baiduMap = map; //存储到全局变量baiduMapmap.enableScrollWheelZoom(true); //开启鼠标滚轮缩放map.enableInertialDragging(); //两秒后开启惯性拖拽setTimeout(function (){//添加地图类型控件map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, type: BMAP_NAVIGATION_CONTROL_ZOOM}));map.addControl(new BMap.NavigationControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));//地图类型,地图,卫星var size = new BMap.Size(20, 220);map.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP], anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));map.addEventListener("mousemove", function (e) {$(".BMap_cpyCtrl").text("鼠标位置:" + e.point.lng + "," + e.point.lat)});//城市控件size = new BMap.Size(70, 10);map.addControl(new BMap.CityListControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));/**map.addEventListener("zoomend", function() {let zoom = map.getZoom();map.centerAndZoom((new BMap.Point(lon, lat)),zoom)});**/},300)};},async initOfflineMap(){let that = this;//加载工具类javascript文件window.bmapConfig = {'tiles_path': '',      //显示普通地图,为空默认在 tiles/ 目录'tiles_satellite_path': '', //显示卫星影像,为空默认在 tiles_satellite/ ,只有底图没有地址标注'tiles_hybrid_path': ''  //显示带有街道的卫星影像,为空默认在 tiles_hybrid/,需和卫星影像配合使用};window.bmapConfig.home_dir = "static/bmap_offline_demo/"; //地图API主目录window.bmapConfig.tiles_path = bmapConfig.home_dir + "/tiles";window.bmapConfig.tiles_satellite_path = bmapConfig.home_dir + "/tiles_satellite";window.bmapConfig.tiles_hybrid_path = bmapConfig.home_dir + "/tiles_hybird";await that.addScript(window.bmapConfig.home_dir + "map3.0.js");//创建Map实例let map = new BMap.Map("baiduMap", {minZoom: 3, maxZoom: 19}); // 创建Map实例map.centerAndZoom(new BMap.Point(107.864933,25.990779), 14); // 创建点坐标,初始化地图,设置中心点坐标和地图级别map.setMapType(BMAP_NORMAL_MAP);window.baiduMap = map; //存储到全局变量baiduMapmap.enableScrollWheelZoom(true); //开启鼠标滚轮缩放map.enableInertialDragging(); //两秒后开启惯性拖拽//自定义图层let tileLayer = new BMap.TileLayer({isTransparentPng: true});tileLayer.getTilesUrl = function (tileCoord, zoom) {if (zoom >= 3) {var x = tileCoord.x;var y = tileCoord.y;if (x < 0) {x = 'M' + (-x);}if (y < 0) {y = 'M' + (-y);}//根据瓦片的文件路径拼接URLreturn '/static/bmap_offline_demo/roadmap/' + zoom + '/' + x + '/' + y + '.png';}};map.addTileLayer(tileLayer);setTimeout(function (){//添加地图类型控件map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT, type: BMAP_NAVIGATION_CONTROL_ZOOM}));map.addControl(new BMap.NavigationControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT}));//地图类型,地图,卫星var size = new BMap.Size(20, 220);map.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP], anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));map.addEventListener("mousemove", function (e) {$(".BMap_cpyCtrl").text("鼠标位置:" + e.point.lng + "," + e.point.lat)});//城市控件size = new BMap.Size(70, 10);map.addControl(new BMap.CityListControl({anchor: BMAP_ANCHOR_BOTTOM_RIGHT, offset: size,}));map.addEventListener("zoomend", function() {let zoom = map.getZoom();map.centerAndZoom((new BMap.Point(107.864933,25.990779)),zoom)});},300)},}
}
</script>

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

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

相关文章

设计模式——装饰者模式(Decorator)

装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰者模式相比生成子类更为灵活。在装饰者模式中&#xff0c;一个装饰类会包装一个对象&#xff08…

Transformer优化加速--xformers

一、定义 1 作用 2 优化创新点 3. 使用demo 二、实现 作用 facebook 提出&#xff0c; xformers能够有效加速attention计算并降低显存。 参考&#xff1a; https://github.com/facebookresearch/xformers https://zhuanlan.zhihu.com/p/688745007 接口&#xff1a;https://f…

Java | Leetcode Java题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> t new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> subsets(int[] nums) {dfs(0, nums…

C++容器——map和pair对组

pair&#xff08;对组&#xff09; 是一种模板类&#xff0c;允许将两个不同类型的值组合在一起。它由两个数据成员first和second组成&#xff0c;分别用来保存这两个值。 头文件 加头文件 #include<utility> 对于 C11 及以上标准&#xff0c;pair 类型可以在不包含头…

牛客网刷题 | BC81 KiKi求质数个数

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi知道了什么是质…

【离散数学】集合上二元关系性质判定的实现(c语言实现)

实验要求 关系矩阵的初始化和打印 我们将关系矩阵存入一个二维数组中&#xff0c;因为集合元素个数不会超过5个所以就用一个5行5列二维数组来表示。 在我们得到了集合元素个数之后我们就可以对数组进行0,1随机赋值 //初始关系矩阵 void init_matrix(int array[][5], int n) {…

python使用f-string时如何保留原始的{}

如果想在 f-string 中使用 {} 符号&#xff0c;但又不想让它被解释成 f-string 的占位符&#xff0c;可以使用两个连续的 {} 来表示一个单独的 {} 符号&#xff0c;从而使其保留原始的形式。 例如&#xff1a; name "John" age 30 text f"{{Hello {name}, …

力扣:1005. K 次取反后最大化的数组和

1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

多核DSP并行计算跨平台通信解决方案

并行计算的核心是计算节点以及节点间的通信与协调机制。OpenMP虽然给开发者提供了极易上手的增量式开发方式&#xff0c;但是OpenMP在与复杂架构的MCSDK结合后&#xff0c;工具与代码产生了大量不可调试的黑盒子&#xff0c;更是决定了它不能用于关键任务领域&#xff0c;如军工…

算法学习Day2——单调栈习题

第一题&#xff0c;合并球 题解&#xff1a;一开始写了一次暴力双循环&#xff0c;直接O(n^2)严重超时&#xff0c;后面于是又想到了O(n)时间复杂度的链表&#xff0c;但是还是卡在 最后一个数据会TLE&#xff0c;我也是高兴的拍起来安塞腰鼓和华氏护肤水&#xff0c;后面学长给…

MongoDB聚合运算符:$toObjectId

MongoDB聚合运算符&#xff1a;$toObjectId 文章目录 MongoDB聚合运算符&#xff1a;$toObjectId语法使用举例 $toObjectId聚合运算符将指定的值转换为ObjectId。如果值无法被转换为ObjectId&#xff0c;则报错。 语法 {$toObjectId: <expression> }$toObjectId接受任何…

基于模糊控制的AMT自动变速汽车换档智能控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于模糊控制的AMT自动变速汽车换档智能控制系统simulink建模与仿真。 2.系统仿真结果 输入的V&#xff0c;Ac&#xff0c;a 输出的档位&#xff1a; 3.核心程序与模型 版…

【算法题】机试指南篇

每日更新&#xff0c;建议关注收藏&#xff01; 目录 须知评判结果考试规则提前了解语言与IDE选择 精选分类可暴力求解的题目基础&#xff1a;排序查找基础&#xff1a;字符串STL向量vector队列queue栈stack 贪心简单贪心区间贪心 递归与分治搜索深搜广搜 数据结构进阶二叉树二…

【C语言】static关键字用法

目录 一、static修饰局部变量 二、static修饰全局变量 三、static修饰函数 一、static修饰局部变量 首先我们来看两段代码: 代码1&#xff08;不加static&#xff09; #include <stdio.h> void test() {int i 0;i;printf("%d ", i); } int main() {int i…

【力扣】1137. 第n个泰波那契数

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个…

新的Linux系统如何安装ssh

安装SSH 如果你发现你的系统没有安装SSH&#xff0c;你可以通过以下命令来安装它&#xff1a; sudo apt-get update sudo apt-get install ssh这个命令将会更新软件包列表并安装SSH客户端和服务端12。 启动SSH服务 安装完成后&#xff0c;你需要启动SSH服务。你可以使用以下…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”&#xff0c;必须根目录下的某个文件夹&#xff0c;或者其子文件夹 …

使用Docker安装Yapi接口管理工具

简介&#xff1a; YAPI 是由去哪儿网移动架构组开发的一款可视化接口管理工具。它具有可视化管理、高效易用、功能强大等特点。它提供了便捷的接口创建、发布和维护方式&#xff0c;开发人员可以通过简单的操作实现接口管理。 YAPI 还支持类似 postman 的接口调试&#xff0c;对…

GPU通用计算介绍

谈到 GPU &#xff08;Graphics Processing Unit&#xff0c;图形显示卡&#xff09;大多数人想到的是游戏、图形渲染等这些词汇&#xff0c;图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力&#xff0c;并提出了 GPGPU (General-purpose co…

Android进阶之路 - 静态会员进度条

年后这个新版本加入了VIP模块&#xff0c;有幸正好由我来负责&#xff0c;可以再积累一下这方面的知识。 那段时间看了一本书&#xff0c;书中说到初级码农的特性之一就是完全集中于某些功能&#xff0c;忽略了了很多成长机会&#xff0c;所以重复性劳作带来的成长值有限&#…