mapbox使用教程

news2025/7/10 18:13:43

文章目录

  • mapbox前期准备
  • 创建,显影,删除图层,图层样式
  • layers-type常用类型
  • sources-type常用类型
  • 地图创建点
  • 地图创建图片、图标
  • 地图创建文字标注(标题)
  • 地图创建面,线
  • 给指定图层添加自定义弹出框
  • 地图创建容器绘制echarts/hightcharts图表
  • 地图平滑缩放显示所有boundary

mapbox前期准备

mapbox 官网https://www.mapbox.com/
mapbox 教程 http://www.mapbox.cn/mapbox-gl-js/api/
mapbox可用图表类型-SuperMapiClient(客户端GIS程序开发工具)https://iclient.supermap.io/examples/mapboxgl/examples.html#viz-graphicLayer

填入申请的access token
mapboxgl.accessToken =‘ ’

1.打开官网 注册登录

在这里插入图片描述
(填写个人信息,账单信息)
在这里插入图片描述
在这里插入图片描述

2.注册成功后 点击自己头像 account
接着会进入邮箱验证页面,显示一封包含验证说明的电子邮件已发送到刚刚注册时所填写的邮箱地址
在这里插入图片描述在这里插入图片描述
3.验证完成以后去点击account
在这里插入图片描述

在前端加载js和css文件(html 文件中)

<link href='https://api.mapbox.com/mapbox-gl-js/v2.1.1/mapbox-gl.css' rel='stylesheet' />

//1.引入cdn js
<script src='https://api.mapbox.com/mapbox-gl-js/v2.1.1/mapbox-gl.js'></script> 
//或者2.安装依赖 获取js z插件
npm install --save mapbox-gl

地图初始化

//导入mapbox-gl
<div id='map'></div>
mapboxgl.accessToken = '<your token>';
const map = new mapboxgl.Map({
container: 'map', //id
style: 'mapbox://styles/mapbox/streets-v11', // mapbox官方的底图和样式文件
preserveDrawingBuffer: true//允许地图导出为图片,
center: [-74.5, 40], 
zoom: 9 
});
</script>

创建,显影,删除图层,图层样式

创建

先创建数据源

//sourceId为用户自定义的数据源Id,为唯一值
map.addSource('sourceId', {
	type: 'geojson',
	data: data,
});

再创建图层

map.addLayer({
   id: 'mapLayerId',
   type: "line" ,//设置当前图层类型 此为边
   source: 'sourceId,//创建的数据源id
   layout: {
     visibility: "visible"//是否显影
    },
 paint: {//设置属性
  'line-color': borderStyle.color,
    }
},

显影图层

map.setLayoutProperty(‘操作的图层Id’, ‘visibility’, ‘设置的属性’);

	map.setLayoutProperty(pointId, 'visibility', 'visible');
	map.setLayoutProperty(pointId, 'visibility', 'none');

重新创建图片图层(清除图层)

如果想用同样的id再次创建图层,需要清除当前图片图层以及图片id,数据id
注意:sourse必须最后移除,否则会报错

//判断存在才移除
//图层Id
if (map.getLayer(layerId)) {
	map.removeLayer(layerId);
} 
//图片Id
if (map.hasImage(pictrueId)) {
	map.removeImage(pictrueId);
}

if (map.getSource(sourceId)) {
	map.removeSource(sourceId);
}

修改图层样式

map.setPaintProperty(’图层id‘,‘图层属性’, ’设置的属性值‘);

map.setPaintProperty(pointId,'circle-color', 12);
map.setPaintProperty(pointId,'circle-radius', '#000000');

layers-type常用类型

circle(圆点)
symbol(符号)
line(线)
heatmap(热力图)
fill(填充)
fill-extrusion(三维填充)
background(背景)
raster(栅格)
hillshade(坡面阴影)

sources-type常用类型

vector: 矢量
raster:影像
geojson:geojson格式数据
image:图像
video: 视频

地图创建点

在这里插入图片描述

    const sourceId = 'typeId';
    const pointId= 'pointId';
    map.addSource(sourceId, {
			type: 'geojson',
			data: data,
		});
		//设置原点默认值
   map.addLayer({
	id: pointId,
	type: 'circle',
	source: sourceId,
	// filter: ["!", ["has", "point_count"]],
	paint: {
         'circle-color': ['get', 'color'],
         //多个点渲染不同的颜色
        'circle-radius': ['get', 'size'],
         //多个点渲染不同的大小
        //'circle-color':'#000',
        //'circle-radius':10,
	   'circle-stroke-width': 1,//边框
	   'circle-stroke-color': '#fff',//边框颜色
   },
    layout: {
    // 布局类属性
     visibility: 'visible', 
     // 可见性(可选值为 none、visible,默认值visible)
			},
		});

重新设置点样式

每个点一样的样式

//点id,属性名字,属性值
map.setPaintProperty(pointId,'circle-color', 12);
map.setPaintProperty(pointId,'circle-radius', '#000000');

每个点大小,颜色不一致

data.features.map((o) => {
// color为传入的颜色数组
// size为传入的大小数组
// num为选择的某一个大分类
// list为当前大分类下所有的点分类
// indens为当前循环点属于该点分类的位置 其对应传入的color size位置
data.features.map((o) => {
if (list.indexOf(o.properties[num]) == -1) {
	list.push(o.properties[num]);
}
});
data.features.map((o) => {
var indexs = list.indexOf(o.properties[num]);
o.properties.color = color[indexs];
o.properties.size = size[indexs];
});
map.getSource(sourceId).setData(data);

地图创建图片、图标

在这里插入图片描述

map.loadImage(imageUrl, function (error, image) {
 //imageUrl 图片地址 (http://线上图片、database图片格式地址)
	if (error) throw error;
    var pictrueId = 'pictrueId';
    const sourceId = 'typeId';
    const imgId= 'imgId';
    map.addSource(sourceId, {
	type: 'geojson',
	data: data,
     });
	map.addImage(pictrueId, image);
	map.addLayer({
	id: imgId,
	type: 'symbol',
	source: sourceId,
	filter: ['!', ['has', 'point_count']],
	layout: {
	'icon-image': pictrueId,
	'icon-size': 10,
	'visibility': 'visible',
	'icon-allow-overlap': true, // 是否允许图片重叠(可选,默认值为 false
	},
	});
	});
	});

updateImage图片

map.updataImage(pictrueId ,image)

此方法如果更新图片,必须要求更新的图片与原图片尺寸一致,否则会报错。

设置图片默认大小

map.loadImage(imageUrl, function (error, image) {
   、、、
	image.height = 80
	image.width = 80
	、、、
	}

地图创建文字标注(标题)

在这里插入图片描述

const sourceId = 'typeId';
const textId= 'textId';
map.addSource(sourceId, {
	type: 'geojson',
	data: data,
});
	// 标注图层
map.addLayer({
id: textId,
type: 'symbol',		
source: sourceId,
filter: ['!', ['has', 'point_count']],
	layout: {
	'icon-image': '',
	visibility: 'none',
	'text-field': '{time}',//此属性为需要显示的字段
	'text-size': 12,
	'text-offset': [0, 2],
	'text-allow-overlap': true, // 是否允许文本重叠(可选,默认值为 false。
	'text-anchor': 'top',
	},
	paint: {
	// 绘制类属性
	// 文本类属性(需要设置 text-field)样式才生效
	'text-color': '#000000', // 文本的颜色
	'text-translate': [0, 0], // 文本的平移(可选,通过平移 [x, y] 达到一定的偏移量。默认值为 [0, 0]
	'text-translate-anchor': 'map', // 文本的平移锚点,即相对的参考物(可选,可选值为 map、viewport,默认为 map)
			},
		});

改变文字显示属性

//修改要显示的文字字段
//name为传入要改变的文字字段
//必须用{}包住哦!
map.setLayoutProperty(textId, 'text-field', `{${name}}`);

注意

使用此方法创建的标注或标题字段无法添加改变边框

地图创建面,线

在这里插入图片描述

map.addLayer({//绘制面
  id: 'mapLayerId',
  type: "fill" //fill类型一般用来表示一个面,一般较大 ,
  source: sourceId,
  layout: {
   visibility: "visible"
     },
   paint: {
   'fill-color': '#000',
   "fill-opacity": 1 /* 透明度 */
   }
 }
 map.addLayer({//绘制边
 id: 'sourceId',
 type: "line" ,
 source: mapLayerId+index,
 layout: {
  visibility: "visible"
  },
 paint: {
  'line-color': '#000',
   "line-width":1
    }
 },

给指定图层添加自定义弹出框

在这里插入图片描述

//鼠标移动时当前图层显示弹出框
 popup: "",//弹窗
 map.on('mousemove', 'layerId', function (e) {
let feature = e.features[0];
 if (that.popup) { //此id弹出框如果存在则移除他
 that.popup.remove();
 }
 //创建新的弹出框
that.popup = new mapboxgl.Popup({
   closeButton: false
 });
 //setLngLat给弹出框设置坐标 
 //setHTML设置自定义显示的内容
 //addTo将弹出框加到当前地图上
 that.popup.setLngLat(e.lngLat)
  .setHTML(`<span>${feature.properties.QH_NAME}</span><br/><span>${key.label}</span>:<span>${feature.properties.value.toString().indexOf('.')==-1?feature.properties.value:Number(feature.properties.value).toFixed(1)}</span>`).addTo(map);
 //给弹出框设置自定义类 样式 
 //弹出框加类名
 const popup = that.popup.getElement();
 popup.classList.add('popupSelf')
 //弹出框子元素加类名
 const popupElement = that.popup.getElement().children;
 popupElement[0].classList.add('set-popup-tip')
 popupElement[1].classList.add('set-popup-content')
  }
  //鼠标离开时去掉弹出框
  map.on('mouseout', mapLayerId+index, function (e) {
 if (that.popup) {
   that.popup.remove();
    that.popup = "";
     }
        });

地图创建容器绘制echarts/hightcharts图表

eCharts引用

    <script src="http://www.echartsjs.com/dist/echarts-gl.min.js"></script>

在这里插入图片描述

//data为要绘制的对象数组,我们对他进行遍历,一次添加一个mapbox容器
let donutList = [];
data.forEach((item, itemIndex) => {
     let param = {
			map: map,
			data: item,
			itemIndex:itemIndex,
	}
    let marker = this.createDonut(param); // 创建好所有marker
	donutList.push(marker);
})

	createDonut({ data, itemIndex, map }) {
	  let group = document.createElement("div"); 
		 group.className = "StackPictograph" ;
		 group.style ='width:200px;';
	 let chartMarker = new mapboxgl.Marker(group)
		.setLngLat([data.X, data.Y])
		.addTo(map);
		let myChart = echarts.init(group)
		let option = {
			backgroundColor: 'transparent',
			tooltip: {},
			xAxis: {},
			yAxis: {},
			series: []		
			};
	   option && myChart.setOption(option);
	 return chartMarker;
	}

地图平滑缩放显示所有boundary

将边界设在视口中心,使用最大的缩放级别使其适应该视口
在这里插入图片描述

            let boundaryFeatures = turf.bbox(layerObj.updeData.data);
            //boundaryFeatures =	[ "103.23621", "30.222122", "104.76852", "31.232473"]
			// 地图平滑缩放显示所有boundary
			map.fitBounds(
			//这两组坐标指的是区域的东南角的点和西北角的点。
			//写一个值就是定到一个点 [[-79, 43], [-73, 45]];
				[
				[boundaryFeatures[0], boundaryFeatures[1]],
				[boundaryFeatures[2], boundaryFeatures[3]]
				],{
				padding: 100 //以给定边界添加的以像素为单位的填充量。
				},{
				moveend: "mapFitBoundEnd"
				}
			);

其中的moveend是自定义的属性,会在fitBounds中使用。
通过在fitBounds里传入参数就可以实现缩放结束的回调
回调mapFitBoundEnd表示缩放结束

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

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

相关文章

300秒带你手写一个promise

前言 为什么要写这一篇文章&#xff1f; 加深对promise的理解&#xff0c;以及再实际工作中的灵活运用。知其然&#xff0c;知其所以然。面试需要。&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 1:声明promise 首先我们先来聊聊promise的几个特性&am…

【node.js从入门到精通】使用node.js写入读取文件内容,基础方法使用

目录 前言 读取文件内容 判断文件是否读取成功 使用writeFile写入文件内容 整理数据 路径动态拼接处理问题 path.basename使用 获取路径中扩展名文件 写在最后 前言 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。 区分版本号 LTS为长期稳定版&#xff0c;推…

大数据 │ ECharts与pyecharts数据可视化应用

通过本篇了解ECharts与pyecharts数据可视化的特点&#xff0c;能实现简单的ECharts与pyecharts数据可视化操作。 01、pyecharts数据可视化介绍 pyecharts是一个用于生成 Echarts 图表的类库&#xff0c;是一款将Python与ECharts相结合的强大的数据可视化工具&#xff0c;使用…

npm install报错Fix the upstream dependency conflict, or retry

执行 npm install vue-router时报错&#xff0c;进过多方查找&#xff0c;最终逐渐了解到造成此问题的原因。 从报错的信息&#xff1a; ERESOLVE unable to resolve dependency tree &#xff08;无法解决依赖关系树&#xff09; npm ERR! Could not resolve dependency: &…

9、Linux 高并发Web服务器项目实战(附代码下载地址)

1. Linux / Unix 上的五种 IO 模型 在Linux下进行网络编程时&#xff0c;服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有五种&#xff1a; 同步阻塞式 I/O&#xff08;BIO, Blocking IO&#xff09;&#xff1a; 在调用该类I/O函数读取数据时&#xff0c;…

前端LayUI框架快速上手详解(一)

✍目录总览 &#x1f525;LayUI &#x1f525;前端框架LayUI详解地址&#x1f525;前端LayUI框架快速上手详解(一)https://blog.csdn.net/Augenstern_QXL/article/details/119748962&#x1f525;前端LayUI框架快速上手详解(二)https://blog.csdn.net/Augenstern_QXL/article/…

【JavaEE初阶】前端第一节.HTML 基础(上篇)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、前端的引入&#xff1b; 二、第一个HTML程序 1.1 如何创建一个新HTML文件 2.2 HTML的完整结构 2.3 关于html文件的详解 2.4 使用 开发者工具 三…

uniapp h5的支付宝,微信支付

根据官方文档可知&#xff0c;uniapp对h5平台的支付没有进行封装&#xff0c;这就需要我们的自己针对不同的情况进行处理。 uniapp官方支付文档&#xff1a;uni.requestPayment(OBJECT) | uni-app官网 前端在进行h5页面的支付处理的时还是较为简单的&#xff0c;不论是支付宝还…

大二C#实现酒店管理系统(C端展示、前台操作、登记入住、入住管理、职位管理、公告系统等)

大二C#实现酒店管理系统&#xff08;C端展示、前台操作、登记入住、入住管理、职位管理、公告系统等&#xff09; 前言项目技术介绍 1、开发工具&#xff1a;VS2022 2、数据库&#xff1a;SqlServer 3、前端请求&#xff1a;HTML5jQuery 4、第三方框架&#xff1a;Layui、视图可…

无界微前端使用方法

1、概念 微前端&#xff1a;字面意思就是小小的前端&#xff0c;怎么小就是不管什么项目都能放在一个容器中运行&#xff0c;这些项目都能够独立部署、独立扩展&#xff0c;每个服务都具有稳固的模块边界&#xff0c;甚至允许使用不同的编程语言来编写不同服务&#xff0c;也可…

Android ImageView使用详解(系列教程三)

目录 一、ImageView简介 二、ImageView基本使用 三、ImageView常用属性 四、几种图片的加载方法 五、ImageView的缩放类型 一、ImageView简介 ImageView是Android开发中最常用的组件之一&#xff0c;主要用于显示图片&#xff0c;但是它不只是能显示图片&#xff0c;任何D…

SSE:后端向前端发送消息(springboot SseEmitter)

背景 有一个项目&#xff0c;前端vue&#xff0c;后端springboot。现在需要做一个功能&#xff1a;用户在使用系统的时候&#xff0c;管理员发布公告&#xff0c;则使用系统的用户可以看到该公告。 基于此&#xff0c;一个简单的方案&#xff1a;前端使用JS方法setInterval&am…

二次封装 el-table

很多中后台业务的系统中&#xff0c;表格是最高频的组件之一&#xff0c;其中一般包括搜索条件、表格展示、表格操作列、分页等。那么我们二次封装的这个表格组件就需要包含以下几个功能点&#xff1a; 1、数据自动获取和刷新 2、自定义列配置 3、分页功能 4、根据搜索条件…

VUE-鼠标悬浮到目标区域变成小手模样

需求&#xff1a;在这个按钮上&#xff0c;当鼠标悬浮上时要变成小手。记录下自己的开发内容实现&#xff1a;就是针对CSS给这个样式指定个属性就好了【cursor: pointer;】单独加到你要实现需求的div内或者元素里也可以加在class中&#xff0c;定义一个class样式&#xff0c;最…

web数据可视化(ECharts版)

实训 实训1会员基本信息及消费能力对比分析 1&#xff0e;训练要点(1&#xff09;掌握堆积柱状图的绘制。(2&#xff09;掌握标准条形图的绘制。 (3&#xff09;掌握瀑布图的绘制。 2&#xff0e;需求说明 “会员信息表&#xff0e; xlsx ”文件记录了某鲜花店销售系统上的会员…

微信小程序 初学——【音乐播放器】

一、项目效果展示 音乐推荐页面展示 播放器展示 播放列表展示 二、项目结构 音乐小程序项目页面结构&#xff1a; 1.tab导航栏 2.content内容区 3.player音乐播放器控件开发者工具创建空白项目&#xff1a; 新建项目 —— 设置项目名称和路径 —— 选择你注册的AppID…

44岁了,我从没想过在CSDN创作2年,会有这么大收获

1998年上的大学&#xff0c;02年毕业&#xff0c;就算从工作算起&#xff0c;我也有20余年的码龄生涯了。 但正式开启博文的写作&#xff0c;却是2021年开始的&#xff0c;差不多也就写了2年的博客&#xff0c;今天我来说说我在CSDN的感受和收获。 我是真的没想到&#xff0c;…

和ChatGPT对比,文心一言的表现已经是中国之光了

网络上各种测评满天飞&#xff0c;这里就不展开说了&#xff0c;针对“chatgpt”这项技术的难点&#xff0c;是十分巨大的。当你对文心一言以及其他国产AI软件存在不满的时候&#xff0c;你可以简单对着chatgpt或者文心一言搜索&#xff01;ChatGPT技术难点通俗来讲难度&#x…

CSS实现文字凹凸效果

使用两个div分别用来实现凹凸效果&#xff1b;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 v-shadow &#xff1a;必需。垂直阴影的位置。允许负值。 blur&#xff1a;可选&#xff0c;模糊的距离。 co…

用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦

突发奇想&#xff0c;想用chatgpt写一篇论文&#xff0c;并看看查重率&#xff0c;结果很惊艳&#xff0c;说明是确实可行的&#xff0c;请看下图。 下面是完整的文字内容。 InSAR (Interferometric Synthetic Aperture Radar) 地质灾害监测技术是一种基于合成孔径雷达…