当前位置: 首页 > article >正文

给博客添加基于百度地图的足迹页面

使用百度地图 api 做的足迹页面一段时间了,经过一番改造,目前已基本能够满足自己需求。

一、添加百度地图

添加百度地图基本思路就是6点:

  1. 申请百度AK
  2. 适当位置添加百度地图容器
  3. 引入百度地图 api
  4. 创建地图实例
  5. 设置地图中心点
  6. 初始化地图

这里,也可参考官方的基础示例

1. 申请百度账号和AK

首先必须登陆百度账号,申请一个属于自己的AK,可以点击这个申请链接,并设置白名单,因为其AK是通过js文件引用的,会暴露在互联网,因此我申请了2个AK,一个白名单设置为 * ,给自己的测试环境用;一个白名单设置为博客域名,给博客用。

2.创建地图容器元素

地图需要一个HTML元素作为容器,这样才能展现到页面上。这里我们创建了一个div元素。

<div id="container"></div> 

3.引入百度地图API文件

在html代码中添加加载百度 api 的 js 文件,需要填写AK

<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的AK">
</script>

也可以通过异步加载js文件的方式来引用

var script = document.createElement("script");script.type = "text/javascript";script.src ="//api.map.baidu.com/api?type=webgl&v=1.0&ak=您的AK&callback=init";document.body.appendChild(script);

4.创建地图实例

位于BMapGL命名空间下的Map类表示地图,通过new操作符可以创建一个地图实例。其参数可以是元素id也可以是元素对象。

var map = new BMapGL.Map("container");

注意:

  1. 在调用此构造函数时应确保容器元素已经添加到地图上;
  2. 命名空间 API GL版使用BMapGL作为命名空间,所有类均在该命名空间之下,比如:BMapGL.Map、BMapGL.Control、BMapGL.Overlay;

5.设置中心点坐标

这里我们使用BMapGL命名空间下的Point类来创建一个坐标点。Point类描述了一个地理坐标点,其中116.404表示经度,39.915表示纬度。(为天安门坐标)

var point = new BMapGL.Point(116.404, 39.915);

注意:在使用百度地图JavaScript API服务时,需使用百度BD09坐标,如使用其他坐标( WGS84、GCJ02)进行展示,需先将其他坐标转换为BD09,详细说明请参考坐标转换说明,请勿使用非官方的转换方法。

6.地图初始化,同时设置地图展示级别

在创建地图实例后,我们需要对其进行初始化,BMapGL.Map.centerAndZoom()方法要求设置中心点坐标和地图级别。 地图必须经过初始化才可以执行其他操作

map.centerAndZoom(point, 15); 

7.其他配置

官方提供了详细的参考示例DEMO

map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放

至此,我们就快速创建了一张以天安门为中心的地图。

上面的代码结合起来就是:

<!-- 指定地图容器 -->
<div id="container"></div><!-- 引用api -->
<script type="text/javascript" src="https://api.map.baidu.com/api?v=1.0&&type=webgl&ak=您的AK"></script><!-- 添加地图 -->
<script>var map = new BMapGL.Map("container"); // 创建Map实例var point = new BMapGL.Point(116.404, 39.915); //设置中心点坐标map.centerAndZoom(point, 11); // 地图初始化,同时设置地图展示级别map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
</script>

8. 异步加载地图

JavaScript API GL v1.0支持异步加载,我们可以在引用脚本的时候添加callback参数,当脚本加载完成后callback函数会被立刻调用,异步加载基础代码如下

//回调函数init
function init() { var mp = new BMapGL.Map('map'); mp.centerAndZoom(new BMapGL.Point(121.491, 31.233), 11); 
} //异步加载,注意callback的值为函数名init    
function loadScript() { var script = document.createElement("script"); script.src = "https://api.map.baidu.com/api?v=1.0&type=webgl&ak=您的密钥&callback=init";document.body.appendChild(script);

二、配置百度地图

1. 添加足迹

地图有了,我们缺少足迹。添加足迹也就是添加标记点。实现起来就2点,创建点位,添加点位,异步加载时,添加足迹的代码需放到回调函数 init 中。

//添加点坐标
var point1=new BMapGL.Point(112.001, 27.700);
// 创建点标记
var marker1 = new BMapGL.Marker(point1);
// 在地图上添加点标记
map.addOverlay(marker1);

2. 添加足迹信息

足迹有了,但我们希望点击足迹时会互动一下,如可以显示足迹点的一些详情,这里就需要用到信息窗口以及点击足迹点击事件了,以之前创建的marker1标记点为例。

// 创建信息窗口,opts为窗口基本信息
var opts = {width: 200,height: 100,title: '娄底'
};
var infoWindow = new BMapGL.InfoWindow('我爱我的家乡娄底', opts);// 给点标记添加点击事件
marker1.addEventListener('click', function () {map.openInfoWindow(infoWindow, point1); // 开启信息窗口
});

3. 丰富足迹信息

按照上面已经的方法已经可以创建一个理想的足迹地图了,但我还想图文并茂一些,也就是希望添加图片等等,其实百度地图足迹信息是支持html代码的

将上方原来展示的'我爱我的家乡娄底',修改一下,改为'我爱我的家乡娄底<br><img src="/path/to/img.webp"/>'看看,是否更加心动了?

4. 批量添加足迹点

上面的足迹信息是逐个添加事件的,且信息也没有规律性,直接使用之前 jvectmap 地图足迹点添加规则,进一步完善,就不提思路了,直接代码。将下面代码放到 init 函数中即可。

 // 添加足迹点,每个足迹点为1个对象,包括足迹坐标LatLng,足迹名称name,足迹描述desc,足迹照片photo(可选),自定义足迹图标icon(可选)var markers =[{latLng: [126.62357440234007, 45.720744140456844],name: "哈尔滨",desc: "在此度过了难忘的4年大学生活。",photo: ["tea1.webp","tea2.webp","tea3.webp",],},{latLng: [129.38819140037123, 45.18552720961948],name: "威虎山",desc: "和哈尔滨的大学老乡一起,平生第一次外出旅游",icon: "foot.png",},{latLng: [114.5215620483218, 38.04793789946941],name: "石家庄",desc: "",},];//给每个足迹点添加足迹和事件markers.forEach((element) => {let point = new BMapGL.Point(element.latLng[0], element.latLng[1]); //创建坐标点// 创建坐标点标记if (element.icon) {var myIcon = new BMapGL.Icon(element.icon, new BMapGL.Size(26, 26));var marker = new BMapGL.Marker(point, { icon: myIcon });} else {var marker = new BMapGL.Marker(point);}map.addOverlay(marker); //添加到坐标点标记let opts = {width: 320, // 信息窗口宽度height: 0, // 信息窗口高度title: element.name, // 信息窗口标题};let info = "";if (element.photo) {let photos = element.photo;photos.forEach((value) => {info +="<a style='flex:1 1 50%;padding:1px;'><img style='width:100%;height:100%;object-fit: cover;' class='imgDemo' src='" +value +"'/></a>";});info ="<div style='display: flex;flex-wrap: wrap;'>" +info +"</div><p style='line-height:1.5;font-size:12px;padding:8px 0;'>" +element.desc +"</p>";} else {info ="<p style='line-height:1.5;font-size:12px;padding:8px 0;'>" +element.desc +"</p>";}let infoWindow = new BMapGL.InfoWindow(info, opts); // 创建信息窗口对象marker.addEventListener("click", function () {map.openInfoWindow(infoWindow, point); //开启信息窗口// 图片加载完毕重绘infoWindowelement = document.getElementsByClassName("imgDemo");for (i = 0; i <= element.length; i++) {element[i].onload = function () {infoWindow.redraw(); // 防止在网速较慢时生成的信息框高度比图片总高度小,导致图片部分被隐藏};}});});

至此,比较好维护的地图就创建好了。

在这里插入图片描述

5.将坐标点信息直接放到 json 文件

上面的代码还不太好维护,最后我将坐标信息以 json 的形式存放和读取来实现。

foods.json 的内容:

[{"latLng": [126.62357440234007,45.720744140456844],"name": "哈尔滨","desc": "在此度过了难忘的4年大学生活。","photo": ["tea1.webp","tea2.webp","tea3.webp"]},{"latLng": [129.38819140037123,45.18552720961948],"name": "威虎山","desc": "和哈尔滨的大学老乡一起,平生第一次外出旅游","icon": "foot.png"},{"latLng": [114.5215620483218,38.04793789946941],"name": "石家庄","desc": ""}
]

并将 init 函数中的 var makers=[...] 这段代码删除,在主页面添加如下代码即可(搜索实现,折腾了好久,不知道这个是否有更优的办法)。

var markers = [];
async function fetchData() {try {const response = await fetch('foots.json');if (!response.ok) {throw new Error('Network response was not ok');}markers = await response.json(); // 解析JSON格式的响应体       } catch (error) {console.error('There was a problem with your fetch operation:', error);}
}
fetchData();

相关文章:

给博客添加基于百度地图的足迹页面

使用百度地图 api 做的足迹页面一段时间了&#xff0c;经过一番改造&#xff0c;目前已基本能够满足自己需求。 一、添加百度地图 添加百度地图基本思路就是6点&#xff1a; 申请百度AK适当位置添加百度地图容器引入百度地图 api创建地图实例设置地图中心点初始化地图 这里…...

【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中&#xff0c;BuildConfig是一个非常有用的功能&#xff0c;它允许我们在构建过程中定义常量&#xff0c;并在运行时使用它们。But&#xff01;&#xff01;当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候&#xff0c;有一些细微的差…...

南京来可电子CAN总线数据记录仪在汽车售后服务站的应用

南京来可电子CAN总线数据记录仪在汽车售后服务站的应用 南京来可电子&#xff08;LaiCore&#xff09;作为国内领先的车载数据采集设备供应商&#xff0c;其CAN总线数据记录仪凭借高精度、多协议兼容性及智能化功能&#xff0c;在汽车售后服务站中发挥重要作用。以下是其核心应…...

FreeSql + .Net6 多库连接实现

1、安装Nuget包 AutoMapper 2、program.cs里添加如下配置&#xff1a; services.AddSingleton(r >{var str configuration.GetConnectionString("MES");return new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, str).Build<MESFlag>();});s…...

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层&#xff1a;用户需手动复制模型输出的JSON数据到脑图软件&#xff0c;且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架&#xff08;其轻量级架构与简洁的UI设计已满足基础需求&#xff09;&#xff0c;我决定…...

(21)从strerror到strtok:解码C语言字符函数的“生存指南2”

❤个人主页&#xff1a;折枝寄北的博客 ❤专栏位置&#xff1a;简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...

构建动态URL查询字符串以导出报警统计数据

如何构建动态URL查询字符串以导出报警统计数据 在开发Web应用程序时&#xff0c;经常需要根据用户的选择或输入来动态构建URL查询字符串&#xff0c;以便从服务器检索或导出数据。在本文中&#xff0c;我们将展示如何使用JavaScript来构建一个动态URL查询字符串&#xff0c;用…...

SpringBoot集成easy-captcha图片验证码框架

SpringBoot集成easy-captcha图片验证码框架 此项目已经很久未维护&#xff0c;如有更好的选择&#xff0c;建议使用更好的选择!!! 一、引言 验证码&#xff08;CAPTCHA&#xff09;是现代应用中防止机器人攻击、保护接口安全的核心手段之一。然而&#xff0c;从零开发验证码…...

Apache Flink:实时数据流处理的终极武器

Apache Flink&#xff1a;实时数据流处理的终极武器 在当今这个数据驱动的世界&#xff0c;实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐&#xff0c;从物联网监控到网络安全&#xff0c;毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...

货车一键启动无钥匙进入手机远程启动的正确使用方法

一、移动管家货车无钥匙进入系统的使用方法 基本原理&#xff1a;无钥匙进入系统通常采用RFID无线射频技术和车辆身份识别码识别系统。车钥匙需要随身携带&#xff0c;当车钥匙靠近货车时&#xff0c;它会自动与货车的解码器匹配。开门操作&#xff1a;当靠近货车后&#xff0…...

C# Enumerable类 之 生成序列

总目录 前言 在 C# 中&#xff0c;System.Linq.Enumerable 类是 LINQ&#xff08;Language Integrated Query&#xff09;的核心组成部分&#xff0c;它提供了一系列静态方法&#xff0c;用于操作实现了 IEnumerable 接口的集合。通过这些方法&#xff0c;我们可以轻松地对集合…...

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器&#xff08;Analyzer&#xff09;1. 倒排索引&#xff1a;搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比&#xff1a; 1.2 倒排索引核心结…...

salesforce 为什么无法关闭task,显示:insufficient access rights on object id

在 Salesforce 中&#xff0c;如果你在尝试关闭任务&#xff08;Task&#xff09;时遇到 “Insufficient access rights on object id” 错误&#xff0c;通常是由于以下几种可能的权限问题导致的&#xff1a; 1. 任务的所有权问题 Salesforce 中的任务&#xff08;Task&…...

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连&#xff0c;发挥着不可替代的重要作用。人工智能技术的迅猛发展&#xff0c;为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息&#xff0c;助力人类更精准地把握自然规律&am…...

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…...

工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】

随着增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助&#xff0c;还极大地提升了远程协助的效率、优化了仓储管理。新立电子其高性能的FPC产品在AI眼镜中的应用&#xff0c…...

Metal学习笔记八:纹理

到目前为止&#xff0c;您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理&#xff0c;您将在本章中学习如何作。更具体地说&#xff0c;您将了解&#xff1a; • UV 坐标&#xff1a;如何展开网格&#xff0c;以便可以对其应用纹理。 • 纹…...

一文5分钟掌握基于JWT的模拟登录爬取实战

文章目录 一、JWT简介1.1 什么是JWT&#xff1f;1.2 JWT的结构1.3 模拟登录流程1.4 爬取数据1.5 实战步骤 二、实战示例&#xff1a;基于JWT的模拟登录爬取2.1 环境准备2.2 分析登录流程2.3 编写模拟登录代码2.4 代码说明 三、处理复杂情况3.1 动态参数3.2 多因素认证3.3 刷新T…...

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支&#xff0c;如 “Git:master” 3. 有了 4....

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…...

HAL库 IIC写和读函数

IIC写函数&#xff1a;HAL_I2C_Master_Transmit (); IIC读函数&#xff1a;HAL_I2C_Master_Receive ()&#xff1b;写和读函数中的从机的地址最后一位由外部硬件电路控制。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------…...

初识flutter1

为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具&#xff1a; 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…...

12字符函数

一、函数strchr与strrchr 注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解&#xff1a; 示例代码&#xff…...

QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发

Github Copilot是Github和OpenAI推出的AI编程辅助工具&#xff0c;之前版本的Github Copilot只有简单的代码自动补全&#xff0c;根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级&#xff0c;加入了Agent模式&#xff0c;可以实现自然语言对话讨论和最重要的&a…...

矩阵的奇异值(SVD)分解和线性变换

矩阵的奇异值&#xff08;SVD&#xff09;分解和线性变换 SVD定义 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称 SVD&#xff09;是一种重要的线性代数工具&#xff0c;能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_rbtree_sentinel_init

ngx_rbtree_sentinel_init 定义在 src\core\ngx_rbtree.h #define ngx_rbt_black(node) ((node)->color 0) /* a sentinel must be black */#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)初始化哨兵节点的颜色 将哨兵节点&#xff08;node&a…...

数据库的sql语句

本篇文章主要用来收集项目开发中&#xff0c;遇到的各种sql语句的编写。 1、根据user表的role_id字段&#xff0c;查询role表。 sql语句&#xff1a;使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...

Bugku CTF Crypto(二)

目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官&#xff08;宫&#xff09; 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析&#xff1a;题目提示这不是md5&#xff0c;字符中出现了d&#xff0c;猜测16进制 使用…...

openssl的aes128_ECB加密解密运算实例

aes128算法ECB接口 加密接口 注意事项&#xff1a; EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb()&#xff0c;和密钥&#xff0c;key至少16BEVP_EncryptUpdate加密运算&#xff0c;tmplen输出已加密长度EVP_EncryptFinal_ex结束运算&#xff0c;如果在此仍有加密运算&…...