LeafLet 简单使用

WangKane 关注

 0.4 2018.12.03 16:08 字数 887 阅读 3773评论 0喜欢 4

Leaflet 使用

最近在Angular项目中,用到了地图,由于种种原因放弃了百度地图api使用,最后选择了leaflet,简单介绍一下。

介绍:

Leaflet 是一个为移动设备设计的交互式地图的开源的 javascript库, 并只有38k,包含了大多数开发者需要的地图特点。

准备:下载 leaflet 文件

访问: Leaflet下载官网

在单一的HTML页面中使用Leaflet

  • 创建一个文件夹 leaflet_test
  • 文件夹下创建一个index.html
  • 将上述下载的leaflet文件放到leaflet_test文件夹下
  • 在index.html插入如下代码
  1. <!-- 引入 文件 -->
  2. <link rel="stylesheet" href="./leaflet.css" />
  3. <script src="./leaflet.js"> </script>
  4. <!-- 增加地图高度 -->
  5. <style>
  6. #mapDiv { height: 300px; }
  7. </style>
  8. <!-- 创建一个 地图的div id 必须有 但是自定义 -->
  9. <div id="mapDiv"></div>
  10. <script>
  11. //到 mapbox 官网注册并创建下面的access token都是免费的,不过有5w次的浏览限制
  12. var url = 'https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1Ijoia2FuZXdhbmciLCJhIjoiY2pwM2UxNHNkMGF1MzNwc2FtMnNhdXJsMCJ9.KZpCBtizDeltZO6JhGc6_w';
  13. //初始化 地图
  14. var leafletMap = L.map('mapDiv').setView([41, 123], 5);
  15. //将图层加载到地图上,并设置最大的聚焦还有map样式
  16. L.tileLayer(url, {
  17. maxZoom: 18,
  18. id: 'mapbox.streets'
  19. }).addTo(leafletMap);
  20. //增加一个marker ,地图上的标记,并绑定了一个popup,默认打开
  21. L.marker([41, 123]).addTo(leafletMap)
  22. .bindPopup("<b>Hello world!</b><br />I am a popup.").openPopup();
  23. //增加一个圈,设置圆心、半径、样式
  24. L.circle([41, 123], 500, {
  25. color: 'red',
  26. fillColor: '#f03',
  27. fillOpacity: 0.5
  28. }).addTo(leafletMap).bindPopup("I am a circle.");
  29. //增加多边形
  30. L.polygon([
  31. [41, 123],
  32. [39, 121],
  33. [41, 126]
  34. ]).addTo(leafletMap).bindPopup("I am a polygon.");
  35. //为点击地图的事件 增加popup
  36. var popup = L.popup();
  37. function onMapClick(e) {
  38. popup
  39. .setLatLng(e.latlng)
  40. .setContent("You clicked the map at " + e.latlng.toString())
  41. .openOn(leafletMap);
  42. }
  43. leafletMap.on('click', onMapClick);
  44. </script>
  • 上述代码可直接使用,下面先上效果图,再解释代码的含义
 
image
  • 代码解释:

    • 1.引入Leaflet css 与js 文件,官网要求,css在前 js在后。不过我简单试过没啥变化。
    • 2.增加 地图css样式,设置高度,这个官网要求必须的。**不设置会不显示地图 **
    • 创建装地图的div 记住这个div的 id
    • 开始创建地图,我们先去准备一个 瓦片图层 本文使用的是 mapbox
    • 到 map box上注册账号,登录后 创建一个access token,copy到代码url accesstoken后面,使用我的也好使
    • 初始化map 使用 L.map('mapDiv').setView([51.505, -0.09], 13),其中[51.505, -0.09]地理位置,13是变焦的大小
    • 将图层加到map上。其中url是图层的资源的url,maxZoom 是最大的聚焦【mapbox官网最大的也是18了】,id 是 地图的样式并不是我们平常认识的id,本文选择了 street 的map
    • mapbox 支持的地图样式,共6个默认的(默认提供的,可以自己创建上传)
      • Mapbox Incidents V1 [id=mapbox.mapbox-incidents-v1]
      • Mapbox Statellite[mapbox.satellite]
      • ...
    • 加标记、加圆圈、加多边形,再为地图每个位置点击增加事件
  • 至此,简单的应用就完成了。

在单一页面中使用中国各种地图

为什么单独说,因为leaflet提供了一个插件 Leaflet.ChineseTmsProviders可以访问 github主页查看。下面我们看看如何使用它。

  • 准备去github上下载插件的js文件 github下载,下载后同样放到与leaflet包同一路径下
  • 上一下插件代码:
  1. L.TileLayer.ChinaProvider = L.TileLayer.extend({
  2. initialize: function(type, options) { // (type, Object)
  3. var providers = L.TileLayer.ChinaProvider.providers;
  4. var parts = type.split('.');
  5. var providerName = parts[0];
  6. var mapName = parts[1];
  7. var mapType = parts[2];
  8. var url = providers[providerName][mapName][mapType];
  9. options.subdomains = providers[providerName].Subdomains;
  10. L.TileLayer.prototype.initialize.call(this, url, options);
  11. }
  12. });
  13. L.TileLayer.ChinaProvider.providers = {
  14. TianDiTu: {
  15. Normal: {
  16. Map: "http://t{s}.tianditu.cn/DataServer?T=vec_w&X={x}&Y={y}&L={z}",
  17. Annotion: "http://t{s}.tianditu.cn/DataServer?T=cva_w&X={x}&Y={y}&L={z}"
  18. },
  19. Satellite: {
  20. Map: "http://t{s}.tianditu.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}",
  21. Annotion: "http://t{s}.tianditu.cn/DataServer?T=cia_w&X={x}&Y={y}&L={z}"
  22. },
  23. Terrain: {
  24. Map: "http://t{s}.tianditu.cn/DataServer?T=ter_w&X={x}&Y={y}&L={z}",
  25. Annotion: "http://t{s}.tianditu.cn/DataServer?T=cta_w&X={x}&Y={y}&L={z}"
  26. },
  27. Subdomains: ['0', '1', '2', '3', '4', '5', '6', '7']
  28. },
  29. GaoDe: {
  30. Normal: {
  31. Map: 'http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
  32. },
  33. Satellite: {
  34. Map: 'http://webst0{s}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}',
  35. Annotion: 'http://webst0{s}.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}'
  36. },
  37. Subdomains: ["1", "2", "3", "4"]
  38. },
  39. Google: {
  40. Normal: {
  41. Map: "http://www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}"
  42. },
  43. Satellite: {
  44. Map: "http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}"
  45. },
  46. Subdomains: []
  47. },
  48. Geoq: {
  49. Normal: {
  50. Map: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}",
  51. Color: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetColor/MapServer/tile/{z}/{y}/{x}",
  52. PurplishBlue: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
  53. Gray: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}",
  54. Warm: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetWarm/MapServer/tile/{z}/{y}/{x}",
  55. Cold: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetCold/MapServer/tile/{z}/{y}/{x}"
  56. },
  57. Subdomains: []
  58. }
  59. };
  60. L.tileLayer.chinaProvider = function(type, options) {
  61. return new L.TileLayer.ChinaProvider(type, options);
  62. };
  • 更改index.html文件
  1. <script src="./leaflet.js"></script>
  2. <link rel="stylesheet" href="./leaflet.css" />
  3. <script src="leaflet.ChineseTmsProviders.js"></script>
  4. <style>
  5. //#mapDiv { height: 300px; }
  6. .test { height: 300px; }
  7. </style>
  8. <div id="mapDiv" class='test'></div>
  9. <script>
  10. //插件把 定义了多个国内的瓦片图层,我们只需要通过提供的方法访问到相应的图层即可
  11. //从插件代码可以看出 需要传入 providerName.mapName.mapType 从插件代码中查找所需要的值
  12. var test = L.tileLayer.chinaProvider('Geoq.Normal.Map', {
  13. maxZoom: 18,
  14. minZoom: 5
  15. });
  16. //此处可以定义多个图层,并可以再页面中进行选择
  17. var baseLayers = {"测试地图":test}
  18. var map = L.map("mapDiv", {
  19. center: [41.80, 123.43],
  20. zoom: 7,
  21. layers: [test],
  22. zoomControl: false
  23. });
  24. L.control.layers(baseLayers, null).addTo(map);
  25. L.control.zoom({
  26. zoomInTitle: '放大',
  27. zoomOutTitle: '缩小'
  28. }).addTo(map);
  29. </script>
  • 上结果图,这次只是使用插件没有其他功能。中心点是沈阳市。
 
image

Leaflet 画线装饰插件

本次开发使用了另一个插件polylineDecorator.js

  • index.html
  1. //如下代码需要上一节的代码
  2. var arrow = L.polyline([[41.80, 123.43], [41.07, 123.00]], {opacity: 1,color: 'firebrick'}).bindPopup('I am red:').addTo(map);//
  3. var arrow2 = L.polyline([[41.80, 123.43], [40.13, 124.37]], {opacity: 1,color: 'lightgreen'}).bindPopup('I am green:').addTo(map);
  4. var arrow3 = L.polyline([[41.07, 123.00], [40.13, 124.37]], {opacity: 1,color: 'lightgreen'}).bindPopup('I am green:').addTo(map);
  5. var arrowHead = L.polylineDecorator(arrow, {
  6. patterns: [
  7. {offset: '30%' ,endOffset:'90%',repeat: 1000, symbol: L.Symbol.arrowHead({pixelSize: 10, polygon: false,pathOptions: {stroke: true,weight:2,color: 'firebrick'}})}
  8. ]
  9. }).addTo(map);
  • 上图:在一条线上增加了一个箭头,还有很多的装饰,可访问github主页查看example 的代码
 
image

在 angular中使用 leaflet.js

由于leaflet是 javascript库,而angular 使用的typescript 语言,这就存在一个问题。经过查询,发现了ts的一个功能。.d.ts文件的使用。

**注:如下内容,仅做介绍了,在我们的项目中是成功的引入了leaflet了,如果不好使,请大家自行查询一下吧。推荐一个介绍文章 **JavaScript 和 TypeScript 交叉口

在项目的根目录下创建文件【angular框架中是 src下】 index.d.ts

文件内容:

  1. declare var L:any; //leaflet

当然在angular.json需要引入相关的 leaflet的js文件

  1. projects->architect->build->options->scripts中加入leaflet.js的路径

相关的内容请查阅angular相关的介绍 Angular Cli Stories

leaflet的使用的更多相关文章

  1. leaflet创建简单地图

    一.leaflet介绍: 1.Leaflet 是一个为建设移动设备友好的互动地图,而开发的现代的.开源的 JavaScript 库.它是由 Vladimir Agafonkin 带领一个专业贡献者团队 ...

  2. leaflet 了解

    Leaflet 是一个为建设移动设备友好的互动地图,而开发的现代的.开源的 JavaScript 库.它是由 Vladimir Agafonkin 带领一个专业贡献者团队开发,虽然代码仅有 33 KB ...

  3. [Javascript] Adding Shapes to Maps with Leaflet and GeoJSON

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. Leaflet交流

    GIS科研网 Leaflet交流 谢绝转载 http://www.3sbase.com欢迎加群交流  108299288 http://www.3sbase.com/3sbase/webgistest ...

  5. Leaflet学习笔记-Leaflet.awesome-markers

    基础篇传送门 http://www.cnblogs.com/CoffeeEddy/p/4919987.html 效果图 是不是感觉很美观啊 为什么选择awesome 地图上面需要各种各样的Mark,难 ...

  6. Leaflet学习笔记-基础内容

    为什么选择Leaflet 开源,且代码仅有 31 KB,但它具有开发人员开发在线地图的大部分功能(80%的功能) 是不是比arcgis要小很多呢 官网:http://leafletjs.com/ 劣势 ...

  7. 前端学习-使用JS库Leaflet.js生成世界地图并获取标注地址经纬度。

    介绍:Leaflet是一个开源的JavaScript库,对移动端友好且对地图有很好的交互性. 大小仅仅只有 33 KB, 同时具有大多数地图所需要的特点. Leaflet设计的非常简单易懂, 同时具有 ...

  8. 开源轻量级移动端友好的JS地图库——leaflet学习教程

    Leaflet 是一个为建设交互性好适用于移动设备地图,而开发的现代的.开源的 JavaScript 库.代码仅有 33 KB,但它具有开发在线地图的大部分功能.Leaflet设计坚持简便.高性能和可 ...

  9. leaflet地图库

    an open-source JavaScript libraryfor mobile-friendly interactive maps Overview Tutorials Docs Downlo ...

  10. Leaflet+heatmap实现离线地图加载和热力图应用

    本人博客主页:http://www.cnblogs.com/webbest/ 2017年春节已经过完,新一年的奋斗也刚刚开始.今年要经历的挑战也是大大的...不扯了. 年底前软件项目相对较多,恰巧在年 ...

随机推荐

  1. 通过bat批处理程序如何实现在多个txt文件后面加上相同的一行文字

    通过bat批处理程序如何实现在多个txt文件后面加上相同的一行文字 set/p a=输入要增加的文字 for /f "delims=" %%i in ('dir /b *.txt' ...

  2. 亿级mongodb数据迁移

    1. 预先准备有效数据单号池,通过单号拉取数据处理 单号表默认为1 01 使用findAndModify 更新单号表状态为 2 读取单号 循环读取100 条 02 通过运单号批量查询 Aladin_W ...

  3. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  4. 最新 波克城市java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.波克城市等10家互联网公司的校招Offer,因为某些自身原因最终选择了波克城市.6.7月主要是做系统复习.项目复盘.Leet ...

  5. SpringBoot异步编程

    异步调用:当我们执行一个方法时,假如这个方法中有多个耗时的任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务.当然你也可以选择等这些任务都执行完了,再返回给客户端 ...

  6. poj3347(扩大数据,避免小数)

    题目链接:https://vjudge.net/problem/POJ-3347 题意:摆放n个正方形,问俯视视角来看时哪些正方形可见. 思路:在刷计算几何专题时刷到这题,但不需要用计算几何的知识.我 ...

  7. 文件 open 方法

    文件对象方法: 文件对象方法  执行操作 f.close()    关闭文件 f.read([size=-1]) 从文件读取size个字符,当未给定size或给定负值的时候, 读取剩余的所有字符,然后 ...

  8. 认识函数(python)

    一般的函数都是有参数的,函数的参数都是放在函数定义的括号里的,函数参数的命名规则和我们说的变量的命名规则基本一样,一定要清晰明了.(能概括出它的意义,让人阅读你的代码,就知道这个参数是干嘛的就行).当 ...

  9. 面试官:Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?

    Jusfr 原创,转载请注明来自博客园 Request 与 Response 的响应格式 Request 与 Response 都是以 长度+内容 形式描述, 见于 A Guide To The Ka ...

  10. 怎样写一个 "Hello, World!"

    第一步: 打开浏览器, 按 F12 键或 Ctrl + Shift + J.   注意:  1. 打开的这个界面是浏览器的开发者工具界面. 2. 顶部有许多Tab栏, 如: Elements / Co ...