概述

最近做数字工程实践涉及到大量的地图操作,刚开始跳过依赖于supermap iclient for JavaScript,但是越做深入越发现局限性太大,于是开始考虑使用开源地图库做各项操作,本文记录在vue项目中引入原生leaflet及heatmap打开地图及显示热力图的各项操作。

各项操作

leaflet打开地图

第一步:下载leaflet

Leaflet官网下载即可

第二步:vue引入leaflet

新建vue项目不在叙述,将leaflet库解压后拷入项目目录

使用vendor方式引入leaflet库,不会编译js文件

找到webpack.base.conf.js文件,在其中的module.exports中,找到entry,在其中找到或新建vendor,引入即可

第三步:打开第一幅地图

在vue文件中操作

template标签下增加如下代码

template><div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
</template>

style中引入css

<style scoped>@import "https://unpkg.com/leaflet@1.0.3/dist/leaflet.css";
</style>

script文件中引入L

import L from 'leaflet'

新建地图容器

let map = L.map('map', {center: [39.9788, 116.30226],zoom: 14})

打开openstreetmap

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {attribution: 'Haut-Gis-Org © OpenStreetMap'}).addTo(this.map)

heatmap渲染热力图

第一步:npm方式引入headmap.js
npm install heatmap.js
第二步:引入leaflet中使用的函数
import HeatmapOverlay from 'heatmap.js/plugins/leaflet-heatmap'
第四步:配置
// 配置var cfg = {'radius': 2,'maxOpacity': 0.8,'scaleRadius': true,'useLocalExtrema': true,latField: 'lat',lngField: 'lng',valueField: 'count'}
第五步:模拟数据
// 数据var testData = {max: 8,data: [{ lat: 24.6408, lng: 46.7728, count: 3 },{ lat: 50.75, lng: -1.55, count: 1 },{ lat: 51.55, lng: -1.55, count: 9 },{ lat: 52.65, lng: -1.45, count: 8 },{ lat: 53.45, lng: -1.35, count: 7 },{ lat: 54.35, lng: -1.25, count: 6 },{ lat: 5.25, lng: -1.15, count: 5 }]}
第六步:叠加图层
this.heatmapLayer = new HeatmapOverlay(cfg)// 图层let baseLayer = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: 'Haut-Gis-Org © OpenStreetMap'})this.heatmapLayer.addTo(map)this.heatmapLayer.setData(testData)
效果图

参考代码

<template><div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
</template><script>import HeatmapOverlay from 'heatmap.js/plugins/leaflet-heatmap'import L from 'leaflet'export default {name: 'gis-population-density',data () {return {heatmapLayer: null,map: null}},mounted () {// 引用heatmap.js// let script = document.createElement('script')// script.type = 'text/javascript'// script.src =// 'http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js'// document.body.appendChild(script)this.initmap()},methods: {initmap: function () {// this.map = L.map('map', {//   center: [39.9788, 116.30226],//   zoom: 14// })//// L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {//   attribution: 'Haut-Gis-Org © OpenStreetMap'// }).addTo(this.map)// 数据var testData = {max: 8,data: [{ lat: 24.6408, lng: 46.7728, count: 3 },{ lat: 50.75, lng: -1.55, count: 1 },{ lat: 51.55, lng: -1.55, count: 9 },{ lat: 52.65, lng: -1.45, count: 8 },{ lat: 53.45, lng: -1.35, count: 7 },{ lat: 54.35, lng: -1.25, count: 6 },{ lat: 5.25, lng: -1.15, count: 5 }]}// 配置var cfg = {'radius': 2,'maxOpacity': 0.8,'scaleRadius': true,'useLocalExtrema': true,latField: 'lat',lngField: 'lng',valueField: 'count'}this.heatmapLayer = new HeatmapOverlay(cfg)// 图层let baseLayer = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: 'Haut-Gis-Org © OpenStreetMap'})this.map = L.map('map', {center: [25.6586, -80.3568],zoom: 4})baseLayer.addTo(this.map)this.heatmapLayer.addTo(this.map)this.heatmapLayer.setData(testData)L.control.scale({ maxWidth: 200, metric: true, imperial: false }).addTo(this.map)let baseLayers = {'heatmapLayer': this.heatmapLayer,'OpenStreetMap': baseLayer}// let overlays = {//   'Marker': null,//   'Roads': null// }L.control.layers(baseLayers).addTo(this.map)}}}
</script><style scoped>@import "https://unpkg.com/leaflet@1.0.3/dist/leaflet.css";
</style>

常用插件

  • leaflet.ChineseTmsProviders-加载各种国内地图
npm安装指令
npm i leaflet.chinatmsproviders
  • Leaflet.markercluster
npm安装指令
npm install leaflet.markercluster
  • heatmap.js
npm安装指令
npm install heatmap.js

参考文档

  • Leaflet官网
  • 【Leaflet·1】从加载出第一幅地图开始
  • Leaflet学习之路三——地图控件
  • leaflet常用插件地址整理
  • LeaFlet学习之热力图
  • heatmap.js官网
  • Leaflet调用谷歌地图、天地图、智图地图、高德题图一键搞定