mapBox地图第一个案例和聚合图标自定义

news2025/1/10 21:10:12

Mapbox地图数据平台

1.简介

Mapbox是移动的和Web应用程序的位置数据平台,适用于分层区位分析图,可自定义元素、色彩等,任何图层都可编辑.。Mapbox灵活的地图和位置构建块可以无缝集成到您的数据分析应用程序或数据可视化中。

平滑的矢量地图可扩展到数百万个数据点,提供类似视频游戏的可视化效果。自定义地图设计,或从专业设计的样式中挑选,通过使用Mapbox Studio更改颜色渐变、缩放等功能,为地图和数据图层设置动画和拉伸。

https://www.mapbox.com/

2.准备

你需要一个API访问令牌来配置Mapbox GL JS、Mobile和Mapbox web服务。此访问令牌将您的地图与Mapbox帐户关联起来

所以要先注册一个账号。

官网注册地址 https://account.mapbox.com/

注意点:

mapbox属于国外网站,禁止国内邮箱和电话等信息注册。这里采用下面这个方式。

https://www.bilibili.com/read/cv24878918/

3.启动首个demo

官网文档api

https://docs.mapbox.com/mapbox-gl-js/guides/

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Check if Mapbox GL JS is supported</title>
		<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
		<link href="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.css" rel="stylesheet">
		<script src="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.js"></script>
		<style>
			body {
				margin: 0;
				padding: 0;
			}

			#map {
				position: absolute;
				top: 0;
				bottom: 0;
				width: 100%;
			}
		</style>
	</head>
	<body>
		<div id="map"></div>

		<script>
			mapboxgl.accessToken = '<输入你的token>';
			if (!mapboxgl.supported()) {
				alert('Your browser does not support Mapbox GL');
			} else {
				const map = new mapboxgl.Map({
					container: 'map',
					// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
					style: 'mapbox://styles/mapbox/streets-v12',
					center: [-74.5, 40],
					zoom: 9
				});
			}
		</script>

	</body>
</html>

引入mapbox-gl.js库

在线库
<script src='https://api.mapbox.com/mapbox-gl-js/v2.11.0/mapbox-gl.js'></script>
<link href='https://api.mapbox.com/mapbox-gl-js/v2.11.0/mapbox-gl.css' rel='stylesheet' />
npm 形式安装
npm install --save mapbox-gl

然后引入

import 'mapbox-gl/dist/mapbox-gl.css';
import mapboxgl from 'mapbox-gl';
创建一个地图元素容器
<div id='map' style='width: 100%; height: 100%;'></div>
使用token并配置
mapboxgl.accessToken = '<输入你的token>';
创建一个地图示例
const map = new mapboxgl.Map({
    container: 'map',     // 地图容器 ID  
    style: 'mapbox://styles/mapbox/streets-v12',     // 样式url
    center: [116.42396,39.91784],    // 中心位置[lng, lat]
    zoom: 16, // 缩放
    pitch: 35, // 倾斜角度
});

案例可参照

加载3D地形图

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Add 3D terrain to a map</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<link href="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.css" rel="stylesheet">
<script src="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.js"></script>
<style>
body { margin: 0; padding: 0; }
#map { position: absolute; top: 0; bottom: 0; width: 100%; }
</style>
</head>
<body>
<div id="map"></div>

<script>
	mapboxgl.accessToken = '<输入你的token>';
    const map = new mapboxgl.Map({
        container: 'map',
        zoom: 14,
        center: [-114.26608, 32.7213],
        pitch: 80,
        bearing: 41,
        // Choose from Mapbox's core styles, or make your own style with Mapbox Studio
        style: 'mapbox://styles/mapbox/satellite-streets-v12'
    });

    map.on('style.load', () => {
        map.addSource('mapbox-dem', {
            'type': 'raster-dem',
            'url': 'mapbox://mapbox.mapbox-terrain-dem-v1',
            'tileSize': 512,
            'maxzoom': 14
        });
        // add the DEM source as a terrain layer with exaggerated height
        map.setTerrain({ 'source': 'mapbox-dem', 'exaggeration': 1.5 });
    });
</script>

</body>
</html>

在这里插入图片描述

插件和框架

(1)12个 Ul插件

Ul插件提供了与地图控件和其他用户可以触摸或交互的东西相关的特性和功能,如绘图工具、地
图导出工具、方向和地理编码控件等等。

12中插件 User interface plugins (12)

(2)9个插件

地图渲染插件提供与地图上显示的内容相关的特性和功能,如高级自定义图层、地图标签、数据可
视化等。Map Rendering Plugins (9) 9个插件

(3)9个框架集成

框架集成插件可以帮助您将Mapbox GLJS与外部框架结合使用。

例如:

应用与react结合的框架 react-mapbox-gl

应用与 angular结合的框架 angular-mapboxgl-directive

应用与 vue结合的框架

VueMapbox

https://soal.github.io/vue-mapbox/guide/

具体功能实现

1. 第一个案例

mapbox添加自定义图片marker标记点和气泡弹窗

2.mapbox加载超图rest图层

参考 超图的官方案例:加载 3857底图 ,点击查看源码,里面有超图的加载代码,和mapbox加载示例。

https://iclient.supermap.io/examples/mapboxgl/editor.html#01_tiledMapLayer

下面案例:是使用mapbox加载超图rest图层示例。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Add a WMS source</title>
		<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
		<link href="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.css" rel="stylesheet">
		<script src="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.js"></script>
		<style>
			body {
				margin: 0;
				padding: 0;
			}
			#map {
				position: absolute;
				top: 0;
				bottom: 0;
				width: 100%;
			}
		</style>
	</head>
	<body>
		<div id="map"></div>
		<script>
			mapboxgl.accessToken = '你的taken';
			const map = new mapboxgl.Map({
				container: 'map',
				// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
				style: 'mapbox://styles/mapbox/light-v11',
				zoom: 8,
				center: [120, 30]
			});
			var attribution =
				"<a href='https://www.mapbox.com/about/maps/' target='_blank'>© Mapbox </a>" +
				" with <span>© <a href='https://iclient.supermap.io' target='_blank'>SuperMap iClient</a> | </span>" +
				" Map Data <span>© <a href='http://support.supermap.com.cn/product/iServer.aspx' target='_blank'>SuperMap iServer</a></span> ";

			map.on('load', () => {

				map.addSource('rastertiles', {
					attribution: attribution,
					type: 'raster',
					"tileSize": 256,
					tiles: ['https://iserver.supermap.io/iserver/services/map-china400/rest/maps/China/zxyTileImage.png?z={z}&x={x}&y={y}']
				});

				map.addLayer({
					"id": "simple-tiles",
					"type": "raster",
					"source": "rastertiles",
					"minzoom": 0,
					"maxzoom": 22
				});

			});
		</script>

	</body>
</html>
3.聚合点和单点的自定义图片并显示聚合数字text

功能:聚合点和单点都自定义图片,显示当前聚合总数。 并且点击可以获取撒点的数据。
在这里插入图片描述

参考了mapbox的官网案例

聚合案例 https://docs.mapbox.com/mapbox-gl-js/example/cluster/
加载图片案例 https://docs.mapbox.com/mapbox-gl-js/example/add-image/

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Create and style clusters</title>
		<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
		<link href="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.css" rel="stylesheet">
		<script src="https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.js"></script>
		<script src="./json/point.js"></script>
		<style>
			body {
				margin: 0;
				padding: 0;
			}

			#map {
				position: absolute;
				top: 0;
				bottom: 0;
				width: 100%;
			}
		</style>
	</head>
	<body>
		<div id="map"></div>

		<script>
			mapboxgl.accessToken = '你的taken';
			const map = new mapboxgl.Map({
				container: 'map',
				// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
				style: 'mapbox://styles/mapbox/dark-v11', //mapbox://styles/examples/cke97f49z5rlg19l310b7uu7j 动漫版
				center: [119.693901, 28.332140],
				zoom: 8
			});

			map.on('load', () => {
				// Add a new source from our GeoJSON data and
				// set the 'cluster' option to true. GL-JS will
				// add the point_count property to your source data.

				map.addSource('earthquakes', {
					type: 'geojson',
					// 指向GeoJSON数据。这个例子可视化了从2015 年12月22 日到2016 年1月21日的所
					// 有M1.0+级地震,这些地震记录由 USGS 的地震灾害项目记录。
					// data: 'https://docs.mapbox.com/mapbox-gl-js/assets/earthquakes.geojson',
					data: mypoints,
					cluster: true, //集群 :是
					clusterMaxZoom: 14, // Max zoom to cluster points on
					clusterRadius: 50 // Radius of each cluster when clustering points (defaults to 50)
				});
				// 添加聚合时的颜色圆形图案(聚合阶段显示)
				map.loadImage('http://127.0.0.1:8848/mapbox/img/house_jh.png', (error, image) => {
					if (error) throw error;
					// console.log(image)
					map.addImage('cat', image);

					map.addLayer({
						id: 'clusters',
						type: 'symbol',
						source: 'earthquakes',
						filter: ['has', 'point_count'],
						'layout': {
                            'text-field': ['get', 'point_count_abbreviated'],//文本内容来源字段 
							"text-font": ["DIN Offc Pro Medium", "Arial Unicode MS Bold"], //字体
							"text-offset": [0.5, -0.5], //设置图标与图标注相对之间的距离
							"text-anchor": "top", //标记文本相对于定位点的位置
							"text-size": 18, //字号

							'icon-image': 'cat', // reference the image 引用图片
							'icon-size': 1,
							'visibility': 'visible',
						},
							paint: {
								"text-color": "#fff",
								"text-opacity": 1
							}
					});
				})
				// 小圆点 (聚合阶段单个时显示 放大到单个时出现)
				map.loadImage('http://127.0.0.1:8848/mapbox/img/house.png', (error, image) => {
					if (error) throw error;
					console.log(image)
					map.addImage('min_cat', image);
					map.addLayer({
						id: 'unclustered-point',
						type: 'symbol',
						source: 'earthquakes',
						filter: ['!', ['has', 'point_count']],
                        layout: {
						'icon-image': 'min_cat', // reference the image 引用图片
						'icon-size': 1,
						'visibility': 'visible',	
						}
					});
					
				})
			

				// inspect a cluster on click
				map.on('click', 'clusters', (e) => {
					const features = map.queryRenderedFeatures(e.point, {
						layers: ['clusters']
					});
					// console.log(features)
	
					const clusterId = features[0].properties.cluster_id;
					 const point_count = features[0].properties.point_count,
					  clusterSource = map.getSource(/* cluster layer data source id */'earthquakes');
					
					  // Get Next level cluster Children
					  // 
					  // clusterSource.getClusterChildren(clusterId, function(err, aFeatures){
					  //   console.log('getClusterChildren', err, aFeatures);
					  // });
					
					  // Get all points under a cluster
					  clusterSource.getClusterLeaves(clusterId, point_count, 0, function(err, aFeatures){
						  if (err) return;
					    // console.log('getClusterLeaves', err, aFeatures);
						     let points = [];
						     aFeatures.forEach( item =>{
								points.push(item.properties.parms) 
							 })
							 console.log(points)
					  })
				
				});

				// When a click event occurs on a feature in
				// the unclustered-point layer, open a popup at
				// the location of the feature, with
				// description HTML from its properties.
				// 当单击事件发生在未聚集点图层中的某个要素上时在该要素的位置打开一个弹出窗口,描述为-HTML.from-its.properties。

				map.on('click', 'unclustered-point', (e) => {
					const coordinates = e.features[0].geometry.coordinates.slice();
					const mag = e.features[0].properties.mag;
					console.log(e.features[0].properties.parms)
					// const tsunami =
					// 	e.features[0].properties.tsunami === 1 ? 'yes' : 'no';
					// while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
					// 	coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
					// }

					// new mapboxgl.Popup({
					// 	closeButton: false
					// }).setLngLat(coordinates).setHTML(
					// 	`magnitude: ${mag}<br>Was there a tsunami?: ${tsunami}`
					// ).addTo(map);
				});

				map.on('mouseenter', 'unclustered-point', (e) => {
					const coordinates = e.features[0].geometry.coordinates.slice(); //获取经纬度
					const roadCode = JSON.parse(e.features[0].properties.parms).resourceName;

					while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
						coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
					}
					// console.log(coordinates)
					new mapboxgl.Popup().setLngLat(coordinates).setHTML(`${roadCode}`).addTo(map);
				});
				map.on('mouseleave', 'unclustered-point', (e) => {
					console.log(e.target._popups)
					if(e.target._popups.length){
						e.target._popups[0].remove()
					}
				});

				// 地图事件 监听图层id为clusters  鼠标进入事件
				// map.on('mouseenter', 'clusters', () => {
				// 	map.getCanvas().style.cursor = 'pointer';
				// });
				// 地图事件 监听图层id为clusters  鼠标离开事件
				// map.on('mouseleave', 'clusters', () => {
				// 	map.getCanvas().style.cursor = '';
				// });
			});
		</script>

	</body>
</html>

json数据

                    point.js文件
let mypoints = {
	type: "FeatureCollection",
	crs: {
		type: "name",
		properties: {
			name: "urn:ogc:def:crs:OGC:1.3:CRS84"
		}
	},
	features: [
		// {
		// 			"type": "Feature",
		// 			"properties": {
		// 				"id": "us2000b2nn",
		// 				"mag": 4.2,
		// 				"time": 1507422626990,
		// 				"felt": null,
		// 				"tsunami": 0
		// 			},
		// 			"geometry": {
		// 				"type": "Point",
		// 				"coordinates": [-87.6901, 12.0623, 46.41]
		// 			}
		// 		},
	]
}

let list = [{
		"distsCode": "331124",
		"fdObjectid": "00FB6AB46DCA4F838",
		"latitude": 28.332140,
		"resourceName": "占据一车道;该事件为施工导入;拥堵里程为:0.0km;",
		"interval": "0",
		"state": 0,
		"roadCode": "G40",
		"longitude": 119.693901
	},
	{
		"distsCode": "331124",
		"fdObjectid": "855B442A",
		"latitude": 28.347765,
		"resourceName": "占据硬路肩车道;该事件为施工导入;拥堵里程为:0.0km;",
		"interval": "0",
		"state": 0,
		"roadCode": "G4012",
		"longitude": 119.641747
	},
]
list.forEach(item =>{
	mypoints.features.push({
		type: "Feature",
	    properties: {
						id: item.fdObjectid,
						mag: 4.2,
					    parms:item,
					    state:item
					},
		geometry: {
				coordinates: [item.longitude, item.latitude, 46.41]
	}
	})
})
	},
	{
		"distsCode": "331124",
		"fdObjectid": "855B442A1F7C4693833906",
		"latitude": 28.347765,
		"resourceName": "占据硬路肩车道;该事件为施工导入;拥堵里程为:0.0km;",
		"interval": "0",
		"state": 0,
		"roadCode": "G401",
		"longitude": 119.641747
	},
]
list.forEach(item =>{
	mypoints.features.push({
		type: "Feature",
	    properties: {
						id: item.fdObjectid,
						mag: 4.2,
					    parms:item,
					    state:item
					},
		geometry: {
				coordinates: [item.longitude, item.latitude, 46.41]
	}
	})
})

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

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

相关文章

Dubbo从入门到上天系列第十八篇:Dubbo引入Zookeeper等注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

文章目录 一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; 2&#xff1a;注册中心关系图解 3&#xff1a;引入注册中心服务执行流程 4&#xff1a;Dubbo注册中心好处 5&#xff1a;注册中心核心作用 二&#xff1a;注册中心实现方案 …

10.docker的网络network-概述

1.docker的网络模式 docker共有四种网路模式&#xff0c;分别是bridge、host、none和container. 1.1 bridge bridge,也称为虚拟网桥。在bridge模式下&#xff0c;为每个容器分配、配置IP等&#xff0c;并将容器连接到一个docker0。使用–network bridge命令指定&#xff0c;…

程序员指南六:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

【用unity实现100个游戏之16】Unity中程序化生成的2D地牢5(附项目源码,完结)

文章目录 最终效果前言生成墙壁优化方法一、使用rule tile方法二、使用代码生成墙壁补充最终效果后续参考源码完结最终效果 前言 本期是本项目最后一期,主要是进行墙壁的生成优化和补充一下剩下了的其他内容 生成墙壁优化 方法一、使用rule tile 我这里大概给个rule tile参…

跟着Cancer Cell 学作图| 配对棒棒糖图(Lollipop chart)

dotplot 本期图片 ❝ Doi&#xff1a;https://doi.org/10.1016/j.ccell.2022.02.013 ❞ ❝ Dotplot showing the association of cell populations with different tissue types (organ or tumor). The x axis represents cell types, and the y axis represents the different…

对比两个数组中对应位置的两个元素将每次对比的最大值用于构成新的数组np.maximum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对比两个数组中对应位置的两个元素 将每次对比的最大值用于构成新的数组 np.maximum() 选择题 以下代码的输出结果为&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

webshell之无扩展免杀

1.php加密 这里是利用phpjiami网站进行加密&#xff0c;进而达到加密效果 加密前&#xff1a; 查杀效果 可以看到这里D某和某狗都查杀 里用php加密后效果 查杀效果 可以看到这里只有D某会显示加密脚本&#xff0c;而某狗直接绕过 2.dezend加密 可以看到dezend加密的特征还是…

DockerHub 无法访问 - 解决办法

背景 DockerHub 镜像仓库地址 https://hub.docker.com/ 突然就无法访问了,且截至今日(2023/11)还无法访问。 这对我们来说,还是有一些影响的: ● 虽然 DockerHub 页面无法访问,但是还是可以下载镜像的,只是比较慢而已 ● 没法通过界面查询相关镜像,或者维护相关镜像了…

【JavaEE初阶】认识线程、创建线程

1. 认识线程&#xff08;Thread&#xff09; 1.1 概念 1) 线程是什么 一个线程就是一个 "执行流". 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 "同时" 执行着多份代码. 举例&#xff1a; 还是回到我们之前的银⾏的例⼦中。之前我们主要描…

算法——双指针

一、背景知识 双指针&#xff08;Two Pointers&#xff09;&#xff1a;指的是在遍历元素的过程中&#xff0c;不是使用单个指针进行访问&#xff0c;而是使用两个指针进行访问&#xff0c;从而达到相应的目的。对撞时针&#xff1a; 两个指针方向相反对撞指针一般用来解决有序…

ts实现合并数组对象中key相同的数据

背景 在平常的业务中&#xff0c;后端同学会返回以下类似的结构数据 // 后端返回的数据结构 [{ id: 1, product_id: 1, pid_name: "Asia", name: "HKG01" },{ id: 2, product_id: 1, pid_name: "Asia", name: "SH01" },{ id: 3, pro…

为Oracle链接服务器使用分布式事务

1 现象 在SQL Server中创建指向Oracle的链接服务器&#xff0c;SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。 2 解决 在Windows平台下&#xff0c;SQL Server依赖分布式事务协调器&#xff08;MSDTC&#xff09;来使用分布式事务&#xff0…

Autocad2020切换经典界面

Autocad2020切换经典界面 1.更改1.1设置另存为 1.更改 1.1设置另存为

CURL踩坑记录

因为项目使用的windows server&#xff0c;且没有安装Postman&#xff0c;所以对于在本地的Postman上执行的请求&#xff0c;要拷贝到服务器执行&#xff0c;只能先转化成为curl命令&#xff0c;操作也很简单&#xff0c;如下&#xff1a; 注意&#xff0c;Postman默认对url包围…

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化:输入延迟、卡顿,大小核调度

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化&#xff1a;输入延迟、卡顿&#xff0c;大小核调度 一、前言二、VMware 的优化2.1 键鼠输入延迟问题的解决2.1.1 搜索内核隔离2.1.2 关闭内存完整性并重启2.1.3 搜索启用或关闭windows功能2.1.4 关闭 hyper-v 和…

凸问题与非凸问题

凸函数&#xff1a;曲线上任意两点连线上的点对应的函数值不大于该两点对应的函数值得连线上的值&#xff0c;例如yx^2&#xff1b; 非凸函数&#xff1a;曲线上任意两点连线上的点对应的函数值既有大于该两点对应的函数值得连线上的值的部分也有小于的部分&#xff0c;例如&am…

生产订单自动下达

文章目录 1 Introduction2 Detail2.1 input MM02 3 Summary 1 Introduction Production order is released order by automation . We can set the material for it . The method is the detial . 2 Detail 2.1 input MM02 please choose work Scheduling please choose S…

ultralytics yolov8 实例分割 训练自有数据集

参考: https://docs.ultralytics.com/datasets/segment/coco/ http://www.bryh.cn/a/613333.html 1、数据下载与转换yolo格式 1)数据集下载: 参考:https://universe.roboflow.com/naumov-igor-segmentation/car-segmetarion 下载的是coco格式,需要转换 2)coco2yolo t…

不到十个例题带你拿下c++双指针算法(leetcode)

移动零问题 https://leetcode.cn/problems/move-zeroes/submissions/ 1.题目解析 必须在原数组进行修改&#xff0c;不可以新建一个数组 非零元素相对顺序不变 2.算法原理 【数组划分】【数组分块】 这一类题会给我们一个数组&#xff0c;让我们划分区间&#xff0c;比如…