离线地图

瓦片地图原理瓦片地图由一片一片的地图瓦片构成,它的尺寸是256px*256px,是一张张的图片。下面的金字塔图片,从上到下,呈一个指数关系的增长,最上面对应比例尺最小,表示范围最大的地图,一般而言,最大的这个就代表世界地图整个的地球范围。然后依次往下,对应不同的层级。对于瓦片地图256px*256px的图片组成结构,有一套自己的坐标系统。坐标系统有三个x,y,z。x,y确定当前瓦片的位置,z表示当前瓦片的缩放级别,对应的是金字塔里面的层级。 第一级瓦片 第二级瓦片 以指数增长,比例尺越来越大,清晰度越来越高。 瓦片地图的优势: 高效缓存渐进加载简单易用离线地图插件 - LeafletLeaflet是一个离线的地图插件,也是完全遵循瓦片地图的国际标准。在使用Leaflet时,首先需要获取它的js文件,可以直接去官网下载(https://leafletjs.com/ ),下载后,创建地图: 显示地图 //定义一个变量,L.map使用了一个id为map的div,之后setview 设置当前适口显示的地理坐标点和赋予它的层级var map = L.map('map').setView([51.505, -0.09], 13);//手动指定瓦片地图源 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);显示地图之后,我们需要添加一些地图的插件,比如添加一个Marker、Popup L.marker([51.5, -0.09]).addTo(map) .bindPopup('FirstMarker') .openPopup(); 除此之外还可以,添加线条 //确定坐标点 var latlngs = [ [51.5, -0.09], [55.5, -1.09], [56.5, -2.09] ]; var polyline = L.polyline(latlngs, { color: 'red' }).addTo(map); 添加多边形 var latlngs = [ [50, 0], [51, -1], [52, -2], [51, -3] ]; var polygon = L.polygon(latlngs, { color: 'red' }).addTo(map); ...

July 16, 2019 · 1 min · jiezi

制作百度离线地图

1、前言最近公司要给政府机关做项目要用到地图但是只限局域网所以要用到离线地图,在网上搜索了一些有用的文章并成功制作成功百度离线地图,希望能帮助到大家。 2、百度离线地图制作思路制作百度离线地图,分为6步: 下载百度JS API文件为本地文件;屏蔽百度ak验证;引用本地模块资源;下载所需城市或地区瓦片;按照想要的地区或城市切片;加载瓦片改为本地离线瓦片;2.1、下载百度JS API文件为本地文件访问baidu map api地址,代码如下: (function(){ window.BMap_loadScriptTime = (new Date).getTime(); document.write('<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=3.0&ak=&services=&t=20190527152033"></script>');})();然后复制上面代码中的http://api.map.baidu.com/gets...,并访问该网址,如图所示: 打开之后我们格式化代码并下载该文件,文件暂时命名为:map_offline_api_v3.0_min.js 2.2、屏蔽百度ak验证打开map_offline_api_v3.0_min.js文件,如下: 2.3、引用本地模块资源百度地图提供的各种图层类,标记类,控件类等等都可以看作是modules,当你在地图中用到这些模块时,它会自动加载,因此我们需要先把这些模块的js文件下载下来,保存到本地。定位到下面代码,没数错的话,一共是44个模块。 var Tb = { map: "se12k1", common: "jrzmva", style: "mqdswt", tile: "arfjro", groundoverlay: "zel1ht", pointcollection: "mprn2z", marker: "qqpi40", symbol: "4pk2fw", canvablepath: "yjpor5", vmlcontext: "41oars", markeranimation: "niyh4j", poly: "at23pi", draw: "arixo3", drawbysvg: "3vtpy2", drawbyvml: "zyy3jn", drawbycanvas: "ftbugn", infowindow: "itkghs", oppc: "xno3ew", opmb: "pg3p52", menu: "1hsakk", control: "r2lwlu", navictrl: "euxavb", geoctrl: "rxrafb", copyrightctrl: "fmarj0", citylistcontrol: "2qdahf", scommon: "cw3rwv", local: "lzkddz", route: "s0id2r", othersearch: "qmkldj", mapclick: "ooymdg", buslinesearch: "ltu1xb", hotspot: "4kz5w3", autocomplete: "fzh4vi", coordtrans: "m2wqef", coordtransutils: "hc2s5r", convertor: "xm44lc", clayer: "ikdlfv", pservice: "ankscv", pcommon: "qboudv", panorama: "50hi0x", panoramaflash: "rechul" };为了便于修改主文件里的一些内容,先创建一个map_load.js文件,加入下面代码: ...

June 2, 2019 · 2 min · jiezi

关于离线地图图层下载的原理

概述前段时间有个项目因为网络原因,需要再内网搭建一个地图,于是经过一个多星期的折腾,地图终于搭建完成,这里我们地图图层的核心部分简单的介绍一下。网上也有专门的图层下载器,不过都是要收钱的,如果不想付钱,就可以根据原理自己下载即可。 离线地图地图包括很多部分,其中图层是最基础的,其次是它js和css, 再次就是他们对应的地图数据,如: 我搜索“网吧”能把附件的网吧标注出来一样。 图层图层就是常说的瓦片地图,一种多分辨率层次的模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变。 如图: (图片来与百度百科) 我这里以百度地图为例: 我们仔细查看,我们发现百度地图也是一个一个的图片,通过CSS样式的排版控制来显示地图,当上一个图层在下一个图层中又是4个图片, 就这样一层一层的, 一共1 ~ 19层 同时我们也能发现,图片是一个连着一个的,我们注意到每个图片都是这么一个个链接: https://ss1.bdstatic.com/8bo_dTSlR1gBo1vgoIiO_jowehsv/tile/?qt=vtile&x=815&y=214&z=12&styles=pl&udt=20190425&scaler=1&showtext=0 https://ss0.bdstatic.com/8bo_dTSlR1gBo1vgoIiO_jowehsv/tile/?qt=vtile&x=815&y=213&z=12&styles=pl&udt=20190425&scaler=1&showtext=0 其中,x=815&y=214&z=12 就是我们的图片坐标, X - 横坐标 Y - 纵坐标 Z - 图层 ss1.bdstatic.com, ss2.bdstatic.com 等就是服务器集群的域名。 所以,这样我们就可以知道, 我们如果下载图层,我们只需要知道图层的坐标即可下载。那么图层的坐标是如何计算得到呢? 百度图层算法关于图层的算法,我大致介绍下,具体的算法还是查专业资料,O(∩_∩)O哈哈~... 如图: 因为地球是园的,地图是平面的,所以就有一个转换过程,叫什么墨卡托投影(具体查专业资料),大致意思是假想一个与地轴方向一致的圆柱切或割于地球,按等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面。平面后我们就可以通过 横坐标、纵坐标,来计算点的距离,然后在换算为像素坐标。具体算法示例如下: <!DOCTYPE html><html><head><meta charset="utf-8" /><title>地图坐标概念</title><script src="http://api.map.baidu.com/api?v=2.0&ak=GVehn0frGnwbDWjRPxGI6GR4rmfqw7DG"></script></head><body> <div id="map_container" style="width: 500px; height: 320px;"></div> <script> var map = new BMap.Map('map_container', { defaultCursor : 'default' }); // 设置中心点 map.centerAndZoom(new BMap.Point(120.035641, 30.246635), 17); var TILE_SIZE = 256; // 点击一个坐标点,返回对应的坐标 map.addEventListener('click', function(e) { var info = new BMap.InfoWindow('', { width : 260 }); var projection = this.getMapType().getProjection(); var lngLat = e.point; var lngLatStr = "经纬度:" + lngLat.lng + ", " + lngLat.lat; var worldCoordinate = projection.lngLatToPoint(lngLat); var worldCoordStr = "<br />平面坐标:" + worldCoordinate.x + ", " + worldCoordinate.y; var pixelCoordinate = new BMap.Pixel(Math.floor(worldCoordinate.x * Math.pow(2, this.getZoom() - 18)), Math.floor(worldCoordinate.y * Math.pow(2, this.getZoom() - 18))); var pixelCoordStr = "<br />像素坐标:" + pixelCoordinate.x + ", " + pixelCoordinate.y; var tileCoordinate = new BMap.Pixel(Math.floor(pixelCoordinate.x / 256), Math.floor(pixelCoordinate.y / 256)); var tileCoordStr = "<br />图块坐标:" + tileCoordinate.x + ", " + tileCoordinate.y; var viewportCoordinate = map.pointToPixel(lngLat); var viewportCoordStr = "<br />可视区域坐标:" + viewportCoordinate.x + ", " + viewportCoordinate.y; var overlayCoordinate = map.pointToOverlayPixel(lngLat); var overlayCoordStr = "<br />覆盖物坐标:" + overlayCoordinate.x + ", " + overlayCoordinate.y; info.setContent(lngLatStr + worldCoordStr + pixelCoordStr + tileCoordStr + viewportCoordStr + overlayCoordStr); map.openInfoWindow(info, lngLat); }); </script></body></html>天地图图层算法天地图原理也类似, 其坐标点和图层的算法如下: ...

April 28, 2019 · 2 min · jiezi