`

使用Leaflet创建地图拓扑图

 
阅读更多
摘要 之前我们采用过Openlayers+Qunee的方案,实现地图拓扑图,鉴于Openlayers是一个古老项目,略显臃肿,对于现代的前端地图应用,显得笨重,在客户的介绍下,我们找到了leaflet – 基于HTML5的轻量地图客户端方案,结合Qunee使用,以及第三方插件,实现更加轻快的地图拓扑图应用

之前我们采用过 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();

运行效果如下: 

hello leaflet

结合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 

leaflet + qunee

分享到:
评论

相关推荐

    地图两点之间画线

    在地图上实现两点之间的...3. 使用地图API(如Leaflet或Google Maps API)进行线路绘制。 4. 地图瓦片的概念和瓦片加载机制。 5. 地图投影的基本原理。 掌握这些知识点后,你就能在地图上顺利地画出两点之间的线路了。

    离线路径规划

    Leaflet是一个轻量级的JavaScript库,专门用于创建交互式的地图应用。它提供了丰富的API,可以方便地添加图层、标记、控制等元素,使得开发者能够轻松地构建自定义地图。在离线路径规划中,Leaflet主要负责地图的...

    OpenNetworkMap:从 OpenStreetMap 数据生成拓扑图(如地铁图)

    开放网络地图自述OpenNetworkMap 是一种允许从 OpenStreetMap 数据创建拓扑图的工具。 最终目标是为最终用户提供一个简单易用的程序,使创建任何类型的网络地图(公共交通、能源、水……)并以多种格式(SVG、PNG、...

    Minimap小地图

    通过以上知识点的学习和实践,开发者能够创建出功能完善、用户体验良好的小地图系统。在Unity3D中,小地图的实现既需要理解2D和3D图形的交互,也需要掌握游戏逻辑和优化技巧。同时,利用社区资源和现成的插件可以...

    shp文件矢量地图下载

    4. **地图发布**:将处理后的shp数据导入Web制图平台,如Leaflet或OpenLayers,创建交互式地图。 总之,shp文件作为GIS领域常用的矢量数据格式,对于地图制作、空间分析和数据共享具有重要意义。理解并熟练操作shp...

    中国各省地图js.zip

    这种技术通常基于开源的地图库,如Leaflet、OpenLayers或者百度地图API、高德地图API等。 在这个压缩包中,"中国各省地图js"很可能是包含了一系列地理数据的JavaScript文件,这些数据可能以GeoJSON、TopoJSON或SVG...

    地图编辑源码

    地图编辑源码是一种用于创建、修改和管理地图数据的软件开发资源,通常包含了一系列的编程文件,如C++、Java或JavaScript代码,以及可能的数据库结构和图形用户界面设计。在"地图编辑源码"这个主题中,我们将深入...

    贵阳地图(含贵安新区)

    - WebGIS(Web地理信息系统):该项目可能基于WebGIS技术,如Leaflet或OpenLayers等开源库,将地图数据集成到网页中,允许用户通过浏览器查看、交互。 - GeoJSON:地图数据可能以GeoJSON格式存储,这是一种轻量级...

    我自己做的 GIS 工大地图

    可能使用开源GIS框架如OpenLayers、Leaflet,或者使用GIS软件如QGIS、ArcGIS的API来构建交互式地图界面。 8. 更新与维护:随着时间推移,地图数据需要不断更新以保持准确。这可能涉及到定期的数据采集和导入,以及...

    gis开发北京地图,包括各种要素数据,楼房,道路,公园等shp类型数据和gdb类型数据,非常完整的GIS开发用图

    熟悉GIS软件API,如ArcGIS API for Python或Leaflet.js,用于地图展示和交互功能的开发;同时,理解地理坐标系统和投影转换也是必不可少的。 总之,这个资源为GIS开发者提供了一个全面的北京地图数据集,涵盖了楼房...

    jts,JTS拓扑套件是一个用于创建和操作向量几何的Java库。.zip

    - **Web应用**:结合Web GIS框架,如OpenLayers或Leaflet,JTS能够帮助在Web端进行复杂的地理空间计算。 - **教育和研究**:JTS的开放源码性质使其成为教学和研究GIS算法的理想工具,开发者可以深入理解并扩展其...

    中国国界九段线topojson格式数据.zip

    在Web应用中,可以使用D3.js结合Leaflet.js或Mapbox GL JS等库,将TopoJSON数据加载到交互式地图上,创建出动态、可缩放的中国地图,显示九段线边界,增强用户对中国领土范围的认知。 综上所述,"中国国界九段线...

    地理信息系统嵌入式开发ehotgis电子地图.rar

    开发者需要熟悉GIS数据模型,理解如Shapefile、GeoJSON、GPX等常见的地理数据格式,同时还需要掌握如OpenLayers、Leaflet、Mapbox GL JS等开源GIS库,以及可能的后端GIS服务如ArcGIS Server或GeoServer的使用。...

    UMAP做的map应用

    这篇博文“UMAP做的map应用”可能是作者分享了如何使用UMAP库来创建地图应用的过程,可能涉及以下知识点: 1. **UMAP算法原理**:UMAP基于流形理论和图论,通过构建高维数据的邻接图,然后进行图拉普拉斯矩阵的谱...

    draw画图示列,WEBGPS是关于MIS信息在网上的显示\报表打印等

    "draw画图示例"通常指的是使用特定的绘图工具或编程库来创建图表、流程图、网络拓扑图等,以便更好地理解和展示数据。在本案例中,"WEBGPS"是一个关键概念,它涉及到地理信息系统(GIS)与Web技术的结合,主要用于...

    gis开发基础知识的电子书

    - 地图的创建:使用GIS软件如ArcGIS、QGIS等创建和编辑地图。 - 图层操作:添加、删除、调整图层顺序、图层透明度设置等。 - 查询与检索:基于属性或空间关系的查询功能,如查找某一区域内的设施或找出距离最近的...

    mapping-past-denver:网络地图可视化丹佛过去的城市环境

    例如,可以加载不同年代的拓扑图,通过透明度调整显示不同时期的城市面貌。 其次,项目可能使用WebGL技术增强地图的视觉效果。WebGL是一种基于OpenGL标准的JavaScript API,可以在浏览器中实现硬件加速的3D图形渲染...

    制图符号

    这可能涉及到SVG(可缩放矢量图形)或像素渲染,以及使用GIS库如Leaflet或Mapbox进行地图叠加和交互。 **道路**的表示则更为复杂,因为它涉及到路线的线性表示、宽度变化、交通标志、分隔带等。在编程中,我们可能...

    Shp文件 Webgis编程中国省市shp图

    转换后的数据可以被WebGIS库(如Leaflet、OpenLayers、Mapbox GL JS等)加载,以创建交互式地图。 在实现过程中,开发者需要考虑以下几个关键技术点: 1. 数据预处理:对Shp文件进行裁剪、简化和编码,以减小文件...

    postgis矢量瓦片.zip

    4. **拓扑构建**:PostGIS可以创建拓扑结构,允许进行高级的空间分析,如缓冲区、相交和距离计算。 5. **矢量瓦片服务**:如Mapbox Vector Tile或GeoJSON格式,用于将PostGIS中的矢量数据转化为适合Web服务的瓦片...

Global site tag (gtag.js) - Google Analytics