GIS之自定义暗黑系地图
1.前言
在大屏展示系统中,多以蓝色背景为主,显的比较高大上,所以将地图嵌入进去的时候,就要比较偏黑色,比如高德地图的极夜蓝地图,arcgis的午夜蓝地图。
可以实现自定地图样式的地图:
高德地图
高德自定义地图样式,提供了多种地图风格,比如:幻影黑、月光银、极夜蓝等等风格百度地图
百度地图自定义地图样式,可以根据自己的喜好,不同的主题,定义不同的道路,水系等的地图风格。[Basemaps]
Basemaps也提供了一些黑色系地图,但是我在官方地址上没有找到哪里说明样式的地方,只是在一些地图引擎上看到如何使用,比如maptalks中引入地图 :https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png
,这个light_all模式就是地图的样式,黑色的。
使用百度或者是高德的地图,可以是可以实现自定义地图样式,但是因为这两者的坐标系,一个是火星坐标系——GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系。 百度坐标系——BD-09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理。而我们自己生产的坐标系,通常是地球坐标系——WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标体系。同时使用他们的地图API不够灵活,不如OpenLayer、Leftlet等单纯的地图引擎来的较为灵活。使用ArcGIS提供的午夜蓝地图,在大尺度上,可以满足要求,但是在小尺度,比如一个厂区,一条街道上,就显的力不从心了。
于是我提出了,如何使用公共数据,生产自己的样式地图,如果可以的,还可以做成矢量切片的形式,类似于Mapbox中的pbf进行加载。我这里说的自定义地图,不是自己矢量化,然后进行发布,自己矢量化,其实人工成本也是很高的,一条路一幢房子,都是要自己一点点的手工绘制。而是使用商业的地图,进行自定义样式,类似于现在的高德、百度地图,可以自定义地图的样式,毕竟他们的使用的也是矢量切片的技术。
1.中国地图午夜蓝版-副本 ArcGIS的午夜蓝风格地图,但是精细度不够
2.自定义地图样式 这里提到了一个方法,就是使用 css滤镜 实现整体地图的样式修改。
3.在线自定义谷歌地图配色网站 Snazzy Maps 是一个提供 Google 地图配色大全的网站,它利用地图开发工具,为 Google Map 提供不同配色方案。
4.你离最美的自定义地图,只差5步!来自Mapbox设计团队的心得 使用 Mapbox Studio中的样式组件 提供的功能,可以实现自定义地图风格。
2.数据获取
数据获取的方式很多,有些是需要自己手动矢量化的,但是工作量太大了,唯一能借助的就是OpenStreetMap的数据了,可以从管网上导出.osm格式的数据和pbf格式的数据,如果使用范围下载的话,范围是有限制的,最大只能下载5000个节点,当然,还有就是提供了全国(中国全国的矢量数据 这里没有台湾,甚至在地图上,中国的范围边界中,没有向其他的中国地图一样,把台湾包裹进来)的数据,以及各个省(中国省级矢量地图数据)的打包数据,也可以从相应的地方进行下载。当然,下载下来的数据,都是非常的粗糙的,不会像天地图一样到达20级,很多重要的地方也不会给你标出来,但是作为一个背景或者说是轮廓,我觉得应该足够用了,如果还有办法获取更加精细的数据,我会继续更新的。
下载了OpenStreetMap的数据后,可以在Maperitive中加载进来,选择菜单栏->File->Open Map Sources,加载pbf格式的数据。我下载了浙江的数据,我觉得数据还是挺清晰的,而且内容也比较丰富,作为一个不大不小的底图来说,完全够用了,数据的精度,我觉得应该有16级吧。
1.在OSM上下载历史数据
2.OSM数据下载及两种格式转换方法(shp等格式)
3.OSM和PBF数据格式说明 这里主要是OSM数据格式和PBF数据格式的说明,还有相应的格式转换方法,对格式的文件头,内容,和二进制查看方式,做了简单的介绍。
4.获取OpenStreetMap(OSM)数据方法知多少? 方法1: 网站直接下载;方法2: 通过ArcGIS Editor for OpenStreetMap插件下载;方法3:网站直接下载再经过ArcGIS Editor for OpenStreetMap插件工具转换;方法4: 使用QGIS软件获取,几种方法,都有详细的步骤。
5.OpenStreetMap开源地图数据下载方法(含shp格式)) 下载整个中国数据,osmconvert工具将pbf文件转为osm文件
6.下载OpenStreetMap数据 Cloudmade(Cloudmade不再提供OSM的下载)和Geofabrik 提供北美地区下载;JOSM,JOSM提供了一个简单的界面,可让您选择要下载的矩形区域,但是它是通过编辑API下载的;该download.bbbike.org服务可为某些世界城市提供现成的下载;OSMXAPI API旨在用于对地理位置的只读访问。数据(不同于面向编辑的主要OSM API ),它还允许下载比主要API更大的区域;
https://extract.bbbike.org/
允许下载各种格式的必需区域;https://export.hotosm.org/
还在少数地区提供下载服务3.Maperitive
使用Maperitive可以自定义osm的地图样式。我刚开始使用Maperitive的时候,进行样式切换,总是不行,无论是切换为默认的样式,还是自定义的样式,还是其他的样式,都不起作用,为了看到样式的修改,你可以打开软件后,选择菜单栏->Map->Download OSM Data,下载当前页面的数据,然后再使用菜单栏上的->Map->Switch To Rules 切换样式,就可以看到效果了。
也就是说,要先加载自定义的OSM数据,然后才能使用自定义样式对其进行数据的修改,只有一个底图的时候,是没有办法应用样式的,因为底图是不会变化的。
(1) 加载数据
自定义地图,首先需要有数据,数据的来源,可以参考上一节中的内容,可以从OSM下载,也可以在Maperitive中自动下载,都是一样的。
(2) 创建样式规则
根据样式的规则,创建mrules文件,放到软件的Rules文件夹下,我这里放到了D:\soft\Maperitive\Rules 文件夹下
(3) 加载自定义样式规则
下方控制台输入:use-ruleset location=Rules\my.mrules,加载自定义的地图样式
(4) 导出数据
创建完样式之后,可以使用Maperitive的工具,生成相应的切片数据,选择菜单栏->Tools->Generate Tiles,将当前的地图,保存为切片,Mapertive会在软件安装目录下Tiles生成切片数据,我这里是:D:\soft\Maperitive\Tiles 目录下。
1.maperitive Maperitive is a FREE desktop application for drawing maps based on OpenStreetMap and GPS data. You can define what gets on the map and how it is painted. You can also export these maps into bitmaps and SVG files and print them.
2.矢量地图自定义切片样式 下载中国省级矢量地图数据,下载maperitive工具进行自定义样式与切片
4.样式的创建
这里我主要介绍的是maperitive的样式创建规则。
1 | // 定义地图显示的要素 |
1.如何基于OSM数据绘制和可视化自定义地图?
2.OCAD For creating and editing interactive and printed maps such as topographic maps, city maps and orienteering maps.Available in 17 languages. Successfully used in the cartography, city and surveying offices, universities and orienteering clubs.
3.获取OpenStreetMap的边界值GeoJSON数据 可以获取到某一个地区的边界,并转换为Geojson。
4.Rendering Rules Introduction 官方对于渲染规则和方法的说明
5.Based On Wildcards-Matching Feature Names
6.Rules Properties And Flow
7.OpenStreetMap Way OpenStreetMap中的道路的定义
8.OpenStreetMap Node
9.Map features 这里有全部的OpenStreetMap中的Features定义,包括了key和value,有了这份对照表,就可以编写mrules中的features了。
5.数据发布
使用Maperitive进行导出的数据,被进行了切片处理,导出的数据为tiles.json格式。
针对导出的数据文件,可以使用nginx或者IIS等服务器,作为一个静态资源进行数据发布,当然也可以在加载的时候,使用相对目录加载,只需要修改其中的tiles.json文件的tiles属性就可以了。
6.数据加载
生成的数据格式为tiles的切片,包含了一个tiles.json文件,可以使用Openlayers进行加载。
(1) 修改tiles.json
生成的tiles.json中会包含注释,需要删除其中的斜杆部分内容,因为json不允许有斜杠注释,然后生成的tiles中的路径如下,需要根据需要改成自己的,否在加载的就是相对于tile.json所在目录的tiles文件夹下的文件。
1 | "tiles": |
(2) 进行数据加载
这里我使用的是 openlayers 进行加载,因为 openlayers 默认的投影方式是3857,所以需要指定opensteemap的坐标系4326,否则瓦片计算不准确。
1 | import 'ol/ol.css'; |
1.OpenLayers 3 加载 Mapbox 图层 加载了Mapbox的tilejson格式的地图,这个也可以查找到tile.json的基本格式是怎么样的
2.在Mapbox中加载外部tileJSON文件
3.generate-tiles Command maperitive中关于生成切片的命令行操作说明
4.OpenLayers Simple Example 这个就更早了,使用的是Openlayer2加载的地图
5.Openlayers之使用XYZ的方式加载OpenStreetMap 这里是openlayers3中的加载方法,不是通过模块的方法,但是也没有关系openstreetmap坐标系是4326坐标系,官方数据说明中就明确是wgs84坐标,gps也是用的wgs84,所以在加载的时候需要设置view的投影:projection: ‘EPSG:4326’
6.Openlayers 3 绘制过程中坐标系统转换方法示例 (EPSG4326到 3857)
7.适用于GoogleMaps,OpenStreetMap和Leaflet的EPSG 3857或4326 Google地球位于具有wgs84基准的地理坐标系中。(EPSG:4326); Google Maps 位于 基于wgs84基准的投影坐标系中。(EPSG 3857); Open Street Map数据库中的数据存储在gcs中,单位为wgs84,其十进制度和数据为单位。(EPSG:4326); 开放式街道地图图块和WMS Web服务位于基于wgs84基准的投影坐标系中。(EPSG 3857)
8.OpenLayers 3使用的坐标系 目前OpenLayers 3支持两种投影,一个是EPSG:4326,等同于WGS84坐标系,参见详情。另一个是EPSG:3857,等同于900913,由Mercator投影而来,经常用于web地图,参见详情。一个是全球通用的,一个是web地图专用的,自然OpenLayers 3支持它们。在使用过程中,需要注意OpenLayers 3默认使用的是EPSG:3857。
7.openmaptiles
openmaptiles是一个可以在线编辑和发布OSM数据的开源软件,比 Maperitive 更方便一点。
1.如何实现OSM地图本地发布并自定义配图 openmaptiles提供了一套OSM数据使用的完整解决方案,可以实现OSM数据的下载、入库、分析、生成矢量瓦片、调整地图样式、地图预览的全套功能,并且开源。
2.Tilemill + PostGIS + Mapnik 获得自定义样式的 OSM 地图切片
3.获取OpenStreetMap(OSM)数据方法知多少? 方法1:网站直接下载,方法2 通过ArcGIS Editor for OpenStreetMap插件下载,方法3:网站直接下载再经过ArcGIS Editor for OpenStreetMap插件工具转换,方法4 使用QGIS软件获取
4.自建OpenStreetmap地图瓦片服务 笔者最近尝试基于tileserver-gl,openmaptiles和tilemaker等工具自建了一个openstreetsmap的地图瓦片服务器。