Leaflet 数据可视化实现地图下钻示例详解

 更新时间:2023年01月04日 14:44:01   作者:摸鱼的汤姆  
这篇文章主要为大家介绍了Leaflet数据可视化实现地图下钻示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

说到地图下钻功能,做过可视化的应该都不陌生,地图下钻就是通过用户交互从全国地图到下一级省份地图的切换,比如在Echarts中用户点击某个省份,地图就会切换成该省份的地图,当然本篇文章不介绍echarts如何去实现地图下钻,而是用Leaflet去实现地图下钻功能。

使用的框架是Vue,如果这是你第一次使用leaflet框架,还有没对其进行了解,还有如何在vue安装leaflet,建议你去看我上篇文章,(基础篇)

获取GeoJson,如果有现成的可以本地导入。

创建文件/api/getGeoJson.ts

const getGeoJson = (code) => {
  return new Promise((resolve, inject) => {
    // /geojson代理
    axios.get(`/geojson/areas_v3/bound/geojson?code=$[code]`).then((res) => {
      if (res.data.features){
        resolve(res.data.features);
      } else {
        inject(res);
      }
    });
  });
}

初始化地图

创建文件/lib/useLeaflet.ts

function useLeaflet(idName){
    // options 参数 
    const initMap = (options) => {
    // 实例
    map.value = L.map(idName, options);  
    // @ts-ignore
    // 记载瓦片
    L.tileLayer?.chinaProvider('Geoq.Normal.PurplishBlue').addTo(map.value);
    map.value.setView([41.02999636902566, 108.984375], 3); 
  }
}

渲染GeoJson地图&添加事件-核心部分

function useLeaflet(idName){
    // options 参数 
    const initMap = (options) => {
    // 实例
    map.value = L.map(idName, options);  
    // @ts-ignore
    // 记载瓦片
    L.tileLayer?.chinaProvider('Geoq.Normal.PurplishBlue').addTo(map.value);
    map.value.setView([41.02999636902566, 108.984375], 3); 
  }
  const updateGeoJson = (json) => {
    if (isArray(json) && json.length < 1) {
      return;
    }
    // 每次跨层级清除面板-- 性能优化
    map.value.removeLayer(geoarr.value);
    // 清除Layer组
    feiLineGroupLayer.value.clearLayers();
    feiMakerGroupLayer.value.clearLayers();
    // 遍历json
    json.forEach((item, index) => {
      let areaName = item.properties.name;
      let Areaitems =
        datasArr.value[datasArr.value.length - 1][
          areaName.replace(/(省|市|自治区|维吾尔自治区)$/g, '')
        ];
      let colors = Areaitems ?? '#008c8c';
      // 设置事件
      const onEachFeature = (feature, layer) => {
        layer.on({ 
          click: (e) => {
            // 点击
            let codes = e.target.feature.properties.adcode;
            let { name } = e.target.feature.properties;
            // 这里根据需求来,acroutes主要限制下钻的层级
            if (acroutes.value.length > 1) {
              return;
            } 
            // 处理特殊地图
            let prov =
              datasArr.value[datasArr.value.length - 1][
                name.replace(/(省|市|自治区|维吾尔自治区)$/g, '')
              ];
            let childrenArr = prov.children;
            let objs = {};
            // 更改provinces的值
            provinces.value = prov;
            childrenArr.map((item, index) => {
              objs[item.name] = item;
            });
            datasArr.value.push(objs);
            acroutes.value.push(codes);
            // 根据轮廓修正地图位置,以及缩放大小
            map.value.fitBounds(e.target.getBounds());
            // 根据地区的code请求geojson数据
            getGeoJson(`${codes}_full`).then((res) => {
              geoarr.value.clearLayers(geoarr.value);
                // 因为层级有限 可以考虑递归渲染 
                updateGeoJson(res);
            });
          },
        });
      }; 
      // 设置区域默认颜色+添加点击事件
      let geojson = L.geoJSON(item, {
        style: {
          weight: 2, //边框粗细
          opacity: 0.4, //透明度
          fillColor: 'transparent', //区域填充颜色
          fillOpacity: 0.3, //区域填充颜色的透明
        },
        onEachFeature: onEachFeature,
      });
     // 添加geo模块
      geoarr.value.addLayer(geojson);
    });
     // 添加将geoarr添加到地图中去
    map.value.addLayer(geoarr.value); 
  }
  return{
       initMap,
       updateGeoJson
  }
}

App.vue中

<template>
  <div id="map"></div>
</template>
<script lang="ts" setup>
// 插件可加载各种地图(如:智图地图,谷歌地图,高德地图等包含卫星地图)
import L from 'leaflet'; 
import 'leaflet/dist/leaflet.css';
import '@geoman-io/leaflet-geoman-free';
import '@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css';
import { getGeoJson } from '@/api/getGeoJson';
import { onMounted, unref } from '@vue/runtime-core';
import { defineExpose, defineEmits } from 'vue';
import { useLeaflet } from '@/lib/useLeaflet';
let { initMap, updateGeoJson  } = useLeaflet('map'); 
onMounted(() => { 
  initMap(
    {
      attributionControl: false, // 是否使用工具集 
      zoomAnimation: true,
      maxZoom: 13, 
      minZoom: 4,
      zoom: 4,
      worldCopyJump: true,
      markerZoomAnimation: true,
      zoomControl: false, 
    } 
  );
//   首先加载全国地图
  getGeoJson('100000_full').then((res) => {
   updateGeoJson(res);
  })
});
</script>

效果视频这里只是把大屏中核心部分下钻功能实现了,后续会更新,关于Leaflet的其他案例。

关于Leaflet实现地图下钻到这里基本就结束了,整体思路不是很难理解,核心部分建议多看一下。 俗话说“知识是无限的,生命是有限的”,充实的一天,过的才有价值!

以上就是Leaflet数据可视化实现地图下钻示例详解的详细内容,更多关于Leaflet数据可视化地图下钻的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript实现复选框全选功能

    JavaScript实现复选框全选功能

    这篇文章主要为大家详细介绍了JavaScript实现复选框全选功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • 小程序页面间传参的五种方式实例详解

    小程序页面间传参的五种方式实例详解

    页面跳转,页面之间传递参数在开发APP应用的时候会经常用到这样的功能,下面这篇文章主要给大家介绍了关于小程序页面间传参的五种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • JavaScript实现星级评分

    JavaScript实现星级评分

    本文主要分享了JavaScript实现星级评分的实例代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • ES6扩展运算符的用途实例详解

    ES6扩展运算符的用途实例详解

    这篇文章主要介绍了ES6扩展运算符的用途 ,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • JavaScript的parseInt 进制问题

    JavaScript的parseInt 进制问题

    今天在整理以前写过的一段根据周期值自动计算下次执行日期的js代码,发现一bug,我使用parseInt对源数据串进行转换,当输入类似:2009-05-05时,parseInt将把串的05做8进制转换,这样结果自然就不对了。
    2009-05-05
  • JavaScript基于原型链的继承

    JavaScript基于原型链的继承

    原型链是JavaScript中继承的主要方法。本文重点给大家介绍JavaScript基于原型链的继承,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-06-06
  • 微信小程序云开发实现增删改查功能

    微信小程序云开发实现增删改查功能

    这篇文章主要为大家详细介绍了微信小程序云开发实现增删改查功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • js检查是否关闭浏览器的方法

    js检查是否关闭浏览器的方法

    这篇文章主要介绍了js检查是否关闭浏览器的方法,涉及javascript针对窗口事件的判定与操作相关技巧,需要的朋友可以参考下
    2016-08-08
  • 微信小程序购物商城系统开发系列-目录结构介绍

    微信小程序购物商城系统开发系列-目录结构介绍

    这篇文章主要介绍了微信小程序购物商城系统开发系列-目录结构介绍,有兴趣的可以了解一下。
    2016-11-11
  • 文本框只能输入数字的实现方法(兼容IE火狐)

    文本框只能输入数字的实现方法(兼容IE火狐)

    下面小编就为大家带来一篇文本框只能输入数字的实现方法(兼容IE火狐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06

最新评论