Leaflet
Leaflet一、简介(一)介绍(二)安装配置(三)术语介绍二、常用案例(一)基础案例(二)点击事件(三)标记案例(四)线段、多边形、矩形(五)圆(六)弹框 popup(七)图层类型切换(八)Leaflet + Echarts三、Leaflet 插件(一)中国地图插件1、案例2、地图的提供者(二)画线装饰插件1、案例2、参数四、Leaflet API构造器配置项地图状态配置项交互选项键盘导航选项平移惯性选项控制选项动画选项事件地图状态修改获取地图状态图层控制转换方法其他方法位置选项Zoom/pan optionsPan optionsZoom optionsfitBounds optionsProperties地图窗口Leaflet
一、简介
(一)介绍
Leaflet 是一个为建设移动设备友好的互动地图,而开发的现代的、开源的 JavaScript 库。它是由 Vladimir Agafonkin 带领一个专业贡献者团队开发,虽然代码仅有 42KB,但它具有开发人员开发在线地图的大部分功能。
Leaflet 设计坚持简便、高性能和可用性好的思想,在所有主要桌面和移动平台能高效运作,在现代浏览器上会利用 HTML5 和 CSS3 的优势,同时也支持旧的浏览器访问。支持插件扩展,有一个友好、易于使用的API文档和一个简单的、可读的源代码
官网:/
(二)安装配置
下载 解压,解压后的目录如下:配置,引入样式文件和 JS 脚本即可。leaflet.js -这是缩小的Leaflet JavaScript代码。
leaflet-src.js-这是可读的,最小的Leaflet JavaScript,有时对调试很有帮助。
leaflet.css -这是Leaflet的样式表。
images-这是一个包含由引用的图像的文件夹leaflet.css。
<link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script>
(三)术语介绍
**经纬度:**经纬度是经度与纬度组成的坐标系统,是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。**瓦片:**瓦片是将地图图片,并按照固定的尺寸分割后的图片碎片。也就是说 Leaflet 在页面上展示的地图是通过图片碎片拼接起来的。 为了提高地图的响应速度,很多项目会通过Maperitive
软件下载瓦片形成离线图片。二、常用案例
(一)基础案例
创建项目,导入 Leaflet 资源创建 html 页面,导入 Leaflet 样式和 脚本<!DOCTYPE html><html><head><meta charset="utf-8"><title></title><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script></head><body></body></html>
定义容器,存放地图,容器可以配置大小。
<!DOCTYPE html><html><head><meta charset="utf-8"><title></title><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><style>body {margin: 0;padding: 0;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}</style></head><body><!-- 定义容器,存放地图 --><div id="map"></div></body></html>
编写脚本配置地图
瓦片的数据地址可以是公网提供的,也可以内网私服。
Leaflet 官网地址:
https://{s}./{z}/{x}/{y}.png
高德地址:
http://webrd0{s}./appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}
内网地址:
http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet</title><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,经度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*配置布局;参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);</script></body></html>
结果展示
(二)点击事件
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet</title><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,经度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 地图点击事件map.on('click', function(e) {// map 设置视图,传递经纬度坐标, zoom 等级。map.setView(e.latlng, 10);});</script></body></html>
(三)标记案例
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.js"></script><style>body {margin: 0;padding: 0;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}.pop-style .leaflet-popup-content-wrapper {background: #4ab4ff;}.pop-style .leaflet-popup-tip {border-top-color: #4ab4ff;}</style></head><body><div id='map'></div><script>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,经度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 跟换标记的图片var markerIocn = L.icon({iconUrl: 'leaflet/images/plan.png',// 标记图片大小iconSize: [30, 50]});// 添加标记(marker)L.marker([34.819093, 113.561224], {icon:markerIocn}).addTo(map);</script></body></html>
(四)线段、多边形、矩形
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('https://{s}./{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);/* 线段 */var arrow1 = L.polyline([[34.819093, 113.561224], [34.819093, 118.561224]], {opacity: 1,color: 'firebrick'}).bindPopup('I am red:').addTo(map);var arrow2 = L.polyline([[34.819093, 113.561224], [30.819093, 114.561224]], {opacity: 1,color: 'lightgreen'}).bindPopup('I am green:').addTo(map);var arrow3 = L.polyline([[30.819093, 114.561224], [34.819093, 118.561224]], {opacity: 1,color: 'orange'}).bindPopup('I am orange:').addTo(map);/* 多边形 */// 多边形点位坐标var latlngs = [[38.584931, 106.055274],[39.945795, 116.294531],[31.093209, 121.348242],[30.56491, 104.077735],];// 创建带颜色的多边形var polygon = L.polygon(latlngs, {color: 'green'}).addTo(map);// 地图缩放到多边形区域// map.fitBounds(polygon.getBounds());/* 矩形 */// 矩形点位坐标var bounds = [[38.584931, 106.055274], [31.093209, 121.348242]];// 创建带颜色的矩形L.rectangle(bounds, {color: "#ff7800", weight: 1}).addTo(map);// 地图缩放到多边形区域// map.fitBounds(bounds);</script></body></html>
(五)圆
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.js"></script><script src="leaflet/leaflet.ChineseTmsProviders.js"></script><script src="echarts/echarts.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);/* 圆圈通过传入相应options控制circle样式*/var circle = L.circle([34.819093, 113.561224], {color: 'red', // 圈轨迹颜色,即外边框的颜色fillColor: '#f03', // 填充色,默认值与color值一致fillOpacity: 0.5,// 填充透明度radius: 500 * 1000 // circle半径,单位为米}).addTo(map);</script></body></html>
(六)弹框 popup
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><style>body {margin: 0;padding: 0;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}.pop-style .leaflet-popup-content-wrapper {background: #4ab4ff;}.pop-style .leaflet-popup-tip {border-top-color: #4ab4ff;}</style></head><body><div id='map'></div><script>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 添加标记(marker)L.marker([34.819093, 113.561224]).addTo(map);// 静态 popup 弹框var popup = L.popup({closeButton: false,closeOnClick: false,className: "pop-style"}).setLatLng([34.819093, 113.561224]).setContent('<p>Hello world!<br />This is a nice popup.</p>').openOn(map);// marker-自定义图标-绑定 popup 开始var myIcon = L.icon({// 标记图片地址iconUrl: 'leaflet/images/111.png',// 标记图片大小iconSize: [30, 50]});// 添加标记(marker)L.marker([34.27083595165,108.92944335937501], {icon: myIcon // 引入图标}).addTo(map).bindPopup('<p style="color:#db1b00;">标记绑定popup 弹框。</p>') // 绑定 popup 弹框// .openPopup(); // 打开 popup 弹框// marker-自定义图标-绑定 popup 结束</script></body></html>
(七)图层类型切换
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.js"></script><script src="leaflet/leaflet.ChineseTmsProviders.js"></script><script src="echarts/echarts.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 13);L.tileLayer('', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 定义基础布局var baseLayers = {"高德地图": L.tileLayer('http://webrd0{s}./appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}', {subdomains: "1234"}).addTo(map),'高德影像': L.layerGroup([L.tileLayer('http://webst0{s}./appmaptile?style=6&x={x}&y={y}&z={z}', {subdomains: "1234"}), L.tileLayer('http://t{s}./DataServer?T=cta_w&X={x}&Y={y}&L={z}', {subdomains: "1234"})]),'GeoQ灰色底图': L.tileLayer('/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}'),'自定义底图': L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png')};// 定义图层控制,添加布局var layercontrol = L.control.layers(baseLayers, {}, {position: "topright"}).addTo(map);</script></body></html>
(八)Leaflet + Echarts
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.js"></script><script src="leaflet/leaflet.ChineseTmsProviders.js"></script><script src="echarts/echarts.js"></script><style>body {margin: 0;padding: 0;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}#charts{width: 300px;height: 300px;}</style></head><body><div id='map'></div><script>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*配置布局;参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 添加标记(marker)var marker = L.marker([34.819093, 113.561224]).addTo(map);// 标记绑定弹框marker.bindPopup('<div id="charts"></div>',{});// 标记绑定事件marker.on('popupopen', function(e){var myCharts = echarts.init(document.querySelector("#charts"));var option = {title: {text: 'ECharts'},tooltip: {},legend: {data:['销量']},xAxis: {data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]},yAxis: {},series: [{name: '销量',type: 'bar',data: [5, 20, 36, 10, 10, 20]}]};myCharts.setOption(option);});</script></body></html>
三、Leaflet 插件
(一)中国地图插件
1、案例
下载插件,引入脚本Leaflet 提供了一个插件
Leaflet.ChineseTmsProviders
,/htoooth/Leaflet.ChineseTmsProviders
<script src="leaflet/leaflet.ChineseTmsProviders.js"></script>
编写脚本
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.js"></script><script src="leaflet/leaflet.ChineseTmsProviders.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);// 使用中国地图插件,引入天地图L.tileLayer.chinaProvider('TianDiTu.Normal.Map',{maxZoom:18,minZoom:5}).addTo(map);L.tileLayer.chinaProvider('TianDiTu.Normal.Annotion',{maxZoom:18,minZoom:5}).addTo(map);</script></body></html>
2、地图的提供者
TianDiTu TianDiTu.Normal.MapTianDiTu.Normal.AnnotionTianDiTu.Satellite.MapTianDiTu.Satellite.AnnotionTianDiTu.Terrain.MapTianDiTu.Terrain.Annotion GaoDe GaoDe.Normal.Map (include Annotion)GaoDe.Satellite.MapGaoDe.Satellite.Annotion Google Google.Normal.Map (include Annotion)Google.Satellite.Map (exclude Annotion)Google.Satellite.Map (include Annotion) Geoq Geoq.Normal.MapGeoq.Normal.PurplishBlueGeoq.Normal.GrayGeoq.Normal.WarmGeoq.Normal.Hydro OSM OSM.Normal.Map Baidu Baidu.Normal.MapBaidu.Satellite.Map (exclude Annotion)Baidu.Satellite.Annotion如果您想使用百度提供商,请安装Proj4Leaflet在您的项目中。
(二)画线装饰插件
1、案例
polylineDecorator.js,/bbecquet/Leaflet.PolylineDecorator
<!DOCTYPE html><html><head><meta charset=utf-8 /><title>Leaflet with mapbox</title><meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' /><link href="leaflet/leaflet.css" rel="stylesheet" /><script src="leaflet/leaflet.js"></script><script src="leaflet/leaflet.polylineDecorator.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>/* L为 Leaflset 对象,创建 Map 对象,配置初始化视图信息;参数一:经纬度,[维度,精度]参数二:zoom等级,可以简单理解为缩放比例*/var map = L.map('map').setView([34.819093, 113.561224], 7);/*为地图容器添加底图。参数一:瓦片数据地址参数二:地图参数attribution: 版权信息*/L.tileLayer('http://10.87.221.254:8091/tiles/{z}/{x}/{y}.png', {attribution: '© <a href="">中原英才</a>',maxZoom: 18,},).addTo(map);// 添加区域线var arrow1 = L.polyline([[34.819093, 113.561224], [34.819093, 118.561224]], {opacity: 1,color: 'firebrick'}).bindPopup('I am red:').addTo(map);var arrow2 = L.polyline([[34.819093, 113.561224], [30.819093, 114.561224]], {opacity: 1,color: 'lightgreen'}).bindPopup('I am green:').addTo(map);var arrow3 = L.polyline([[30.819093, 114.561224], [34.819093, 118.561224]], {opacity: 1,color: 'orange'}).bindPopup('I am orange:').addTo(map);// 线条样式var arrowHead = L.polylineDecorator(arrow1, {patterns: [{offset: '10%', // 偏移量repeat: '20%', // 模式符号的重复间隔// 符号实例symbol: L.Symbol.arrowHead({pixelSize: 10, // 符号大小polygon: false, // // 符号样式pathOptions: {stroke: true, // 是否显示边线weight: 5, // 线宽color: 'yellow', // 符号颜色},})},{// 模式符号的偏移位置offset: '10%',// 模式符号的重复间隔repeat: '20%',// 符号实例symbol: L.Symbol.marker({// 是否允许旋转,true 表示旋转,会根据线的位置自动旋转rotate: true,//标记显示样式markerOptions: {//图标icon: L.icon({//图标地址iconUrl: 'leaflet/images/plan.png',//图标位置iconAnchor: [16, 16],// 标记图片大小iconSize: [30, 30]})}})}]}).addTo(map);</script></body></html>
2、参数
Pattern定义方法
offset
,endOffset
和repeat
可以分别定义为数字、像素或线条长度的百分比、字符串(例如:'10%'
).
四、Leaflet API
构造器
配置项
地图状态配置项
交互选项
键盘导航选项
平移惯性选项
控制选项
动画选项
事件
You can subscribe to the following events using these methods.
地图状态修改
获取地图状态
图层控制
转换方法
其他方法
位置选项
Zoom/pan options
Pan options
Zoom options
fitBounds options
The same as zoom/pan options and additionally:
Properties
M地图属性包括互动操作,允许你在运行环境中互动地控制地图行为,比如通过拖拽和点击缩放级别显示和不显示某要素. Example:
map.doubleClickZoom.disable();
You can also access default map controls like attribution control through map properties:
map.attributionControl.addAttribution("Earthquake data © GeoNames");
地图窗口
望文思义,这是一个包括可以用来放置自定义图层的不同的地图窗口的对象。最大的区别是图层的叠置.