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>
相关推荐
葱明撅腚18 小时前
利用Python挖掘城市数据
python·算法·gis·聚类
duansamve3 天前
Mapbox中点击按钮在多条线其中一条线上生成一条新的可编辑的线
mapbox
ct9783 天前
Cesium高级特效与着色器开发全指南
前端·gis·cesium·着色器
葱明撅腚5 天前
shapely空间数据分析
python·pandas·gis·shapely
WebGIS开发6 天前
新中地系统学习3个月能做出什么效果?
openlayers·mapbox·webgis
极海拾贝6 天前
秒加在线底图!天地图、高德地图、星图地球、吉林一号底图一次配齐,收藏这篇就够了!
arcgis·gis·geoscene
ct9786 天前
Cesium 矩阵系统详解
前端·线性代数·矩阵·gis·webgl
两点王爷6 天前
KML文件格式和支持添加的内容
gis
水静川流7 天前
GIS工具、POI数据、DEM数据、NDVI数据等地学大数据
arcgis·gis·poi·dem·地学大数据
duansamve7 天前
Mapbox中如何对已经加载的线段进行编辑?
mapbox