mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址

目录

html加载全部代码

方式一:使用html方式加载geojson

[1. 初始化地图](#1. 初始化地图)

[2. 加载geojson数据](#2. 加载geojson数据)

设置geojson图层样式,设置type加载数据类型

设置线条

鼠标移入改变颜色,设置图层属性,此处是fill-extrusion类型


使用mapbox地图加载geojson数据

html加载全部代码
复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Create a hover effect</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
    <link href="https://api.mapbox.com/mapbox-gl-js/v3.1.2/mapbox-gl.css" rel="stylesheet">
    <script src="https://api.mapbox.com/mapbox-gl-js/v3.1.2/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>
    let dataJson = {}
    mapboxgl.accessToken = '你的密钥';
    fetch(url).then((response)=>{ return response.json();})
        .then((data)=>{
            dataJson = data
            dataJson.features.map((item, index) => {
                item['id'] = index
                item.properties['color'] = '#9b46e1'
                item.properties['height'] = Math.floor(Math.random() * (10000 - 9500 + 1)) + 9500
            })
        })
        .catch((error)=>{})

    const map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/streets-v12',
        center: [107.164659,33.95191],
        zoom: 7.5,
        pitch:45
    });
    let hoveredPolygonId = null;

    map.on('load', () => {
        map.addSource('states', {
            'type': 'geojson',
            'data': dataJson
        });

        map.addLayer({
            'id': 'state-fills',
            'type': 'fill-extrusion', 
            'source': 'states',
            'layout': {},
            'paint': {
                'fill-extrusion-color': [
                    'case',
                    ['boolean', ['feature-state', 'hover'], false],
                    'rgba(255,228,96,0.80)',// 鼠标移入颜色
                    'rgba(25,172,230,0.75)' // 默认颜色
                ],
                "fill-extrusion-opacity":0.85,
                //    从source 'height'属性获取填充-挤出-高度。
                'fill-extrusion-height': ['get', 'height'],
            }
        });

        map.addLayer({
            'id': 'state-borders',
            'type': 'line',
            'source': 'states',
            'layout': {},
            'paint': {
                'line-color': '#627BC1',
                'line-width': 0.8
            }
        });

        map.on('mousemove', 'state-fills', (e) => {
            if (e.features.length > 0) {
                if (hoveredPolygonId !== null) {
                    map.setFeatureState(
                        { source: 'states', id: hoveredPolygonId },
                        { hover: false }
                    );
                }
                hoveredPolygonId = e.features[0].id;
                map.setFeatureState(
                    { source: 'states', id: hoveredPolygonId },
                    { hover: true }
                );
            }
        });

        map.on('mouseleave', 'state-fills', () => {
            if (hoveredPolygonId !== null) {
                map.setFeatureState(
                    { source: 'states', id: hoveredPolygonId },
                    { hover: false }
                );
            }
            hoveredPolygonId = null;
        });
    });
</script>

</body>
</html>
方式一:使用html方式加载geojson
1. 初始化地图
复制代码
<div id="map"></div>

<style>
      body { margin: 0; padding: 0; }
      #map { position: absolute; top: 0; bottom: 0; width: 100%; }
</style>

mapboxgl.accessToken = '你的密钥'; 
const map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/streets-v12',
        center: [107.164659,33.95191],
        zoom: 7.5,
        pitch:45
    });
2. 加载geojson数据

当地图初始化成功好后,在对地图做操作处理map.on('load',()=>{}),将geojson数据加载至地图上

复制代码
     fetch(url).then((response)=>{ return response.json();})
        .then((data)=>{
            dataJson = data
            dataJson.features.map((item, index) => {
                // 添加id、color、height下面做渐变展示效果
                item['id'] = index
                item.properties['color'] = '#9b46e1'
                item.properties['height'] = Math.floor(Math.random() * (10000 - 9500 + 1)) + 9500
            })
        })
        .catch((error)=>{})

map.addSource('states', {
   'type': 'geojson',
   'data': dataJson
});
设置geojson图层样式,设置type加载数据类型

type类型:(根据官网使用百度翻译,如有不准确,请多指教)

  • fill 填充多边形

  • line 线

  • symbol 图标或文本标签

  • circle 圆

  • heatmap 热力图

  • fill-extrusion 3d立体多边形

  • raster 贴图纹理,如:卫星图像

  • raster-particle 贴图纹理的驱动的粒子动画

  • hillshade 基于DEM数据的客户端山坡可视化。目前,该实现仅支持Mapbox Terrain RGB和 Mapzen Terrarium图块

  • model 3D模型

  • background 地图的背景颜色或图案

  • sky 地图周围的球形圆顶,始终在所有其他层后面渲染

  • slot 标记插槽的位置

  • clip Layer that removes 3D content from map

    复制代码
          map.addLayer({
              'id': 'state-fills',
              'type': 'fill-extrusion',
              'source': 'states',
              'layout': {},
              'paint': {
                  'fill-extrusion-color': {//根据数值中加载相对应颜色
                      property: "height", 
                      stops: [
                          [9500, "#29D2F1"],
                          [9600, "#27C2EC"],
                          [9700, "#18AFE7"],
                          [9800, "#0E83DA"],
                          [9900, "#0D80D9"],
                          [10000, "#0B64D1"]
                      ]
                  },
                  "fill-extrusion-opacity":0.85,
                  //    从source 'height'属性获取填充-挤出-高度。
                  'fill-extrusion-height': ['get', 'height'],
              }
          });
设置线条
复制代码
       map.addLayer({
            'id': 'state-borders',
            'type': 'line',
            'source': 'states',
            'layout': {},
            'paint': {
                'line-color': '#627BC1',
                'line-width': 0.8
            }
        });
鼠标移入改变颜色,设置图层属性,此处是fill-extrusion类型
复制代码
        map.addLayer({
            'id': 'state-fills',
            'type': 'fill-extrusion',
            'source': 'states',
            'layout': {},
            'paint': {
                // 设置颜色表达式
                'fill-extrusion-color': [
                    'case',
                    ['boolean', ['feature-state', 'hover'], false],
                    'rgba(255,228,96,0.80)',// 鼠标移入颜色
                    'rgba(25,172,230,0.75)' // 默认颜色
                ],
                "fill-extrusion-opacity":0.85,
                //    从source 'height'属性获取填充-挤出-高度。
                'fill-extrusion-height': ['get', 'height'],
            }
        });

效果图:

方式二:使用vue加载geojson

复制代码
<template>
    <div class="mapContainer">
     <div id='map' style='width: 100%; height: 800px;'></div>
    </div>
</template>

<script>
import 'mapbox-gl/dist/mapbox-gl.css';
import mapboxgl from 'mapbox-gl'; // or "const mapboxgl = require('mapbox-gl');"
mapboxgl.accessToken = '你的密钥';
import { nextTick, onMounted } from 'vue'

export default {
  setup(){
    onMounted(()=>{
        const map = new mapboxgl.Map({
          container: 'map', 
          style: 'mapbox://styles/mapbox/streets-v12', 
          center: [-74.5, 40], 
          zoom: 9,
        });
    })
  }

   
}
</script>
相关推荐
liuccn3 天前
TileServer GL的基本讲解
gis·空间数据
liuccn3 天前
GIS 数据存储格式
gis·存储·空间数据
极海拾贝4 天前
【最新最权威】ArcGIS ArcMap中添加在线地图-天地图(地形、矢量、影像、全球境界)的方法
arcgis·gis·地图·arcmap·天地图·底图
haokan_Jia4 天前
【5、Gis数据-山东省下属流域划分及其数据】
arcgis·gis
ZGIS智博创享5 天前
城市地质安全专题连载⑨ | 瞄准地质资源勘查开发,全流程赋能风险管控
gis·城市地质安全·城市地质·zgis
图扑可视化6 天前
油气集输 WebGIS 数字孪生管控大屏
运维·gis·数字孪生·油气运输·油气集输
ct9786 天前
Cesium的Primitive API
gis·webgl·cesium
GIS阵地8 天前
QgsProviderMetadata 详解(基于 QGIS 3.40.13 API)
数据库·qt·arcgis·oracle·gis·开源软件·qgis
GISBox11 天前
PostGIS数据通过GISBox发布WFS/WMS全攻略
数据库·postgresql·wms·gis·postgis·矢量·gisbox
NULIWEIMENXIANG11 天前
ArcPy 程序调用 QGIS 进程实现几何拓扑检查
python·arcgis·gis