摘要 之前我们采用过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();
运行效果如下:
结合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);
此外还可以通过可见过滤器实现,不同比例尺显示不同的节点
相关推荐
在地图上实现两点之间的...3. 使用地图API(如Leaflet或Google Maps API)进行线路绘制。 4. 地图瓦片的概念和瓦片加载机制。 5. 地图投影的基本原理。 掌握这些知识点后,你就能在地图上顺利地画出两点之间的线路了。
Leaflet是一个轻量级的JavaScript库,专门用于创建交互式的地图应用。它提供了丰富的API,可以方便地添加图层、标记、控制等元素,使得开发者能够轻松地构建自定义地图。在离线路径规划中,Leaflet主要负责地图的...
开放网络地图自述OpenNetworkMap 是一种允许从 OpenStreetMap 数据创建拓扑图的工具。 最终目标是为最终用户提供一个简单易用的程序,使创建任何类型的网络地图(公共交通、能源、水……)并以多种格式(SVG、PNG、...
通过以上知识点的学习和实践,开发者能够创建出功能完善、用户体验良好的小地图系统。在Unity3D中,小地图的实现既需要理解2D和3D图形的交互,也需要掌握游戏逻辑和优化技巧。同时,利用社区资源和现成的插件可以...
4. **地图发布**:将处理后的shp数据导入Web制图平台,如Leaflet或OpenLayers,创建交互式地图。 总之,shp文件作为GIS领域常用的矢量数据格式,对于地图制作、空间分析和数据共享具有重要意义。理解并熟练操作shp...
这种技术通常基于开源的地图库,如Leaflet、OpenLayers或者百度地图API、高德地图API等。 在这个压缩包中,"中国各省地图js"很可能是包含了一系列地理数据的JavaScript文件,这些数据可能以GeoJSON、TopoJSON或SVG...
地图编辑源码是一种用于创建、修改和管理地图数据的软件开发资源,通常包含了一系列的编程文件,如C++、Java或JavaScript代码,以及可能的数据库结构和图形用户界面设计。在"地图编辑源码"这个主题中,我们将深入...
- WebGIS(Web地理信息系统):该项目可能基于WebGIS技术,如Leaflet或OpenLayers等开源库,将地图数据集成到网页中,允许用户通过浏览器查看、交互。 - GeoJSON:地图数据可能以GeoJSON格式存储,这是一种轻量级...
可能使用开源GIS框架如OpenLayers、Leaflet,或者使用GIS软件如QGIS、ArcGIS的API来构建交互式地图界面。 8. 更新与维护:随着时间推移,地图数据需要不断更新以保持准确。这可能涉及到定期的数据采集和导入,以及...
熟悉GIS软件API,如ArcGIS API for Python或Leaflet.js,用于地图展示和交互功能的开发;同时,理解地理坐标系统和投影转换也是必不可少的。 总之,这个资源为GIS开发者提供了一个全面的北京地图数据集,涵盖了楼房...
- **Web应用**:结合Web GIS框架,如OpenLayers或Leaflet,JTS能够帮助在Web端进行复杂的地理空间计算。 - **教育和研究**:JTS的开放源码性质使其成为教学和研究GIS算法的理想工具,开发者可以深入理解并扩展其...
在Web应用中,可以使用D3.js结合Leaflet.js或Mapbox GL JS等库,将TopoJSON数据加载到交互式地图上,创建出动态、可缩放的中国地图,显示九段线边界,增强用户对中国领土范围的认知。 综上所述,"中国国界九段线...
开发者需要熟悉GIS数据模型,理解如Shapefile、GeoJSON、GPX等常见的地理数据格式,同时还需要掌握如OpenLayers、Leaflet、Mapbox GL JS等开源GIS库,以及可能的后端GIS服务如ArcGIS Server或GeoServer的使用。...
这篇博文“UMAP做的map应用”可能是作者分享了如何使用UMAP库来创建地图应用的过程,可能涉及以下知识点: 1. **UMAP算法原理**:UMAP基于流形理论和图论,通过构建高维数据的邻接图,然后进行图拉普拉斯矩阵的谱...
"draw画图示例"通常指的是使用特定的绘图工具或编程库来创建图表、流程图、网络拓扑图等,以便更好地理解和展示数据。在本案例中,"WEBGPS"是一个关键概念,它涉及到地理信息系统(GIS)与Web技术的结合,主要用于...
- 地图的创建:使用GIS软件如ArcGIS、QGIS等创建和编辑地图。 - 图层操作:添加、删除、调整图层顺序、图层透明度设置等。 - 查询与检索:基于属性或空间关系的查询功能,如查找某一区域内的设施或找出距离最近的...
例如,可以加载不同年代的拓扑图,通过透明度调整显示不同时期的城市面貌。 其次,项目可能使用WebGL技术增强地图的视觉效果。WebGL是一种基于OpenGL标准的JavaScript API,可以在浏览器中实现硬件加速的3D图形渲染...
这可能涉及到SVG(可缩放矢量图形)或像素渲染,以及使用GIS库如Leaflet或Mapbox进行地图叠加和交互。 **道路**的表示则更为复杂,因为它涉及到路线的线性表示、宽度变化、交通标志、分隔带等。在编程中,我们可能...
转换后的数据可以被WebGIS库(如Leaflet、OpenLayers、Mapbox GL JS等)加载,以创建交互式地图。 在实现过程中,开发者需要考虑以下几个关键技术点: 1. 数据预处理:对Shp文件进行裁剪、简化和编码,以减小文件...
4. **拓扑构建**:PostGIS可以创建拓扑结构,允许进行高级的空间分析,如缓冲区、相交和距离计算。 5. **矢量瓦片服务**:如Mapbox Vector Tile或GeoJSON格式,用于将PostGIS中的矢量数据转化为适合Web服务的瓦片...