为什么80%的码农都做不了架构师?>>>   

之前我们采用过 Openlayers+Qunee的方案,实现地图拓扑图,鉴于Openlayers是一个古老项目,略显臃肿,对于现代的前端地图应用,显得笨重,在客户的介绍下,我们找到了leaflet - 基于HTML5的轻量地图客户端方案,结合Qunee使用,以及第三方插件,实现更加轻快的地图拓扑图应用 Leaflet介绍 leaflet是一个开源软件,作者在乌克兰,在移动设备上的有良好的体验,比较新和现代的地图客户端,类库压缩后只有33k,非常小巧,这一点让qunee都相形见绌,先看一个leaflet的入门示例

官方示例

首先引入leaflet相关js和css

<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css" />
<script src="http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.js"></script>

然后构建地图,并添加openStreetMap

// create a map in the "map" div, set the view to a given place and zoom
var map = L.map('map').setView([51.505, -0.09], 13);// add an OpenStreetMap tile layer
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(map);// add a marker in the given location, attach some popup content to it and open the popup
L.marker([51.5, -0.09]).addTo(map).bindPopup('A pretty CSS3 popup. Easily customizable.').openPopup();

运行效果如下:

结合Qunee拓扑图

Leaflet地图上可以添加点线面基本图形,如果需要展示更复杂的图形或者链接关系,显得力不足,可以结合Qunee组件使用,下面我们让地图和拓扑图叠加起来,在地图上显示拓扑元素,并整合两者的交互

图层叠加

在地图的DIV容器中添加一个孩子div,作为拓扑图的画布,并设置相应的css,然后调用超类的构造函数,取消默认的双击和滚轮操作,已被后面地图与拓扑图的交互同步

var MapGraph = function (map) {var container = map._container;var canvas = document.createElement("div");canvas.style.width = "100%";canvas.style.height = "100%";container.appendChild(canvas);Q.doSuperConstructor(this, MapGraph, [canvas]);this.enableWheelZoom = false;this.enableDoubleClickToOverview = false;this.originAtCenter = false;this.setMap(map);...
}

关联地图

下面实现拓扑图与地图的绑定,在#setMap(map)函数中,监听了地图的zoomstart和zoomend事件,根据经纬度动态的调整图元的屏幕位置,同样在节点被拖动后,也需要设置新的经纬度

MapGraph.prototype = {map: null,mapShowing: true,enableInertia: false,createNodeByLonLat: function (name, lon, lat) {var l = this.toLonLat(lon, lat);var p = this.getPixelFromLonLat(l);var node = graph.createNode(name, p.x, p.y);node.lonLat = l;return node;},toLonLat: function (lon, lat) {return new L.latLng(lat, lon);},getPixelFromLonLat: function (lonLat) {return this.map.latLngToContainerPoint(lonLat, this.map._zoom);},getLonLatFromPixel: function (x, y) {return this.map.containerPointToLatLng([x, y]);},setMap: function (map) {this.map = map;this.map.on("zoomstart", this.hideGraph, this);this.map.on("zoomend", this.updateNodes, this);this.html.ondblclick = createEventFunction(this, function (evt) {if (this.getElementByMouseEvent(evt)) {Q.stopEvent(evt);}});this.interactionDispatcher.addListener(function (evt) {if (evt.kind == Q.InteractionEvent.ELEMENT_MOVE_END) {var datas = evt.datas;Q.forEach(datas, function (data) {var pixel = this.toCanvas(data.location.x, data.location.y);data.lonLat = this.getLonLatFromPixel(pixel.x, pixel.y);}, this);}}, this)},hideGraph: function(){this.html.style.visibility = "hidden";},showGraph: function(){this.html.style.visibility = "";},translate: function (tx, ty) {Q.doSuper(this, MapGraph, "translate", arguments);this.map.panBy([-tx, -ty], {animate: false});},resetVisibility: function () {this.forEach(function (e) {if (e.invalidateVisibility) {e.invalidateVisibility(true);}});},updateNodes: function () {this.translateTo(0, 0, 1, true);this.resetVisibility();this.forEach(function (d) {if (d instanceof Q.Node) {var l = d.lonLat;var p = this.getPixelFromLonLat(l);d.location = p;}}, this);this.showGraph();}
}Q.extend(MapGraph, Q.Graph);

此外还可以通过可见过滤器实现,不同比例尺显示不同的节点

运行效果

在线示例: http://demo.qunee.com/map/mapByLeafLet.html

转载于:https://my.oschina.net/nosand/blog/295367

使用Leaflet创建地图拓扑图相关推荐

  1. leaflet地图原理_使用Leaflet创建地图拓扑图

    之前我们采用过 Openlayers+Qunee的方案,实现地图拓扑图,鉴于Openlayers是一个古老项目,略显臃肿,对于现代的前端地图应用,显得笨重,在客户的介绍下,我们找到了leaflet - ...

  2. 使用 Leaflet.js 创建地图的入门指南

    Leaflet.js 是目前最流行的映射库之一.它是一个灵活.轻量级的开源 JavaScript 库,用于创建交互式地图. Leaflet 是一个用于呈现地图数据的框架.数据以及底图图层必须由开发人员 ...

  3. Leaflet创建,tileLayer,marker,面的绘制

    1.创建地图 GOD.LMap = L.map("LMap", {zoom: 13,minZoom: 5,zoomControl: false,attributionControl ...

  4. Unity 3D为策略游戏创建地图学习教程

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:30节课(7h 42m) |大小:5 GB 含项目文 ...

  5. 《精通Unreal游戏引擎》一第4步 使用BSP创建地图

    本节书摘来异步社区<精通Unreal游戏引擎>一书中的第4步,作者: [英]Ryan Shah(沙哈)译者: 王晓慧 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区&qu ...

  6. Google Map API使用详解(十)——使用JavaScript创建地图详解(上)

    在网页MyTest1.html中我们已经使用了JavaScript来创建地图,下面总结一下使用JavaScript创建一个地图的核心步骤: 1.  导入地图API类库. <script src= ...

  7. ROS学习(11)使用ROS创建地图

    文章目录 前言 一.创建编译功能包 二.更新启动文件 三.启动模型 四.保存地图 五.加载地图 六.总结 前言 创建地图是一件比较复杂的工作,ROS利用map_server地图服务器,借助激光雷达和机 ...

  8. carla创建地图(四)基于ue4创建地图

    对于carla这其实是一种没有完成的方法,因为没有办法产生xodr文件,但是其实可以通过采集的道路经纬度通过脚本生成osm文件(已经补充了相关脚本).这种方法的优势是自由度高,因为在ue4里其实什么都 ...

  9. 使用激光雷达创建地图

    @ 使用激光雷达创建地图 本人小白,把使用激光雷达创建地图的方法写一下,只是一些简单的总结. 安装必要的包.软件 1.最基本的安装ros 2.安装gmapping功能包 3.安装karto功能包 4. ...

最新文章

  1. 大数据分布式集群搭建(9)
  2. 常玩手机会导致手指残疾? 专家称没依据
  3. 华为+京东数科(原京东金融)面经--Java后台开发
  4. 什么笔记本电脑好_买个什么价格的笔记本电脑好,如何选购笔记本电脑
  5. Java GUI编程:swing创建窗体代码详解
  6. [css] 请描述下你对translate()方法的理解
  7. java正则表达式及api_Java API 之 正则表达式
  8. 台大李宏毅Machine Learning 2017Fall学习笔记 (5)Classification: Probabilistic Generative Model
  9. DNF游戏私服搭建过程
  10. 电脑主板故障维修案例
  11. C盘下出现msdia80.dll文件
  12. 红包算法-二倍均值法
  13. 安装mysql数据库,Install/Remove of the Service Denied,服务名无效,No All Pattern Found.File Already Patched?问题解决
  14. 刘江川院士:边缘计算如何应对能源互联网的碎片化和复杂性? | CCF-GAIR 2020
  15. 华为路由器BGP联邦综合实验
  16. 下载没有种子链接用特征码下片的方法
  17. 拼多多商家制作商品详情页的技巧?
  18. 大数据使磁带重获新生
  19. 电脑文件夹改名快速重命名文件夹名的方法
  20. TCP/IP 面试题整理

热门文章

  1. 【线程】——volatile关键字
  2. php 错误500排错,如何排查Web服务器HTTP ERROR 500的错误?
  3. 03-17 APP自动遍历测试技术
  4. android 判断fragment类型,Android 判断当前Fragment是否可见(Visible)
  5. linux中关于ssh实验,操作系统实验三linux的telnetftpssh的相关配置及验证
  6. 顺序表中有效元素的长度_图解线性表,启动数据结构的大门,深刻理解链式存储和顺序存储!...
  7. macos php开发环境,macOS 10.13 High Sierra PHP开发环境配置
  8. mysql 知识_关于mysql基础知识的介绍
  9. 前端开发使用react实现简易路由
  10. 前端开发,必知ES5、ES6的7种继承