在家乡的年度车库销售活动中,构建了一个网站,允许用户注册并显示他们的地址。使用Google Maps将这些地址显示在网站上的地图上。然而,地图并不是全年都活跃的,因此这里有一个图片示例。车库销售的组织者还需要打印传单和海报,但是使用Google Maps的免费版本打印地图是有限制的,因为免费版允许打印的副本数量有限。由于每个人都在业余时间参与车库销售(包括,还赞助了托管),因此没有预算支付Google Maps许可证,这将允许打印更多副本。
首先,需要一种替代方法来创建用于打印的地图。设法使用OpenLayers和OpenStreetMap找到了一种解决方案。基于在线找到的一些示例代码(不再有链接)构建了代码,它工作得很好,这里有一个简化的JSFiddle(右键点击地图并保存为图片)。但是,在第一次打印传单之后,出现了一个问题:街道名称的字体大小太小,名称不再可读。那是两年前的事了。去年没有时间找到更好的解决方案,所以他们只是打印了更大的传单。今年,终于有时间调查这个问题了。
运行瓦片服务器听起来令人印象深刻,不是吗?当搜索“如何在[随机网络制图解决方案]中增加字体大小”之类的东西时,很快就会发现:大多数解决方案使用第三方提供商提供的预制瓦片,作为图像。要改变这些瓦片的外观,需要更换提供商或者运行自己的瓦片服务器。运行瓦片服务器听起来很可怕,所以一开始没有调查这个,而是专注于使用不同的工具创建整个图像。最后,发现了Maperitive,它有自己的脚本语言,所以可以编写一个文本文件,其中包含命令,并在Maperitive中执行它,从头开始创建地图图像。
在玩这个的时候,发现了一个示例代码,它将地图保存为瓦片(=图像文件),并通过FTP上传。那是“啊哈”时刻:瓦片服务器不是一个复杂的软件,而只是一个普通的Web服务器,它通过HTTP提供预先生成的图像文件。所以只需要一些尝试和错误,直到瓦片看起来想要的样子。
以下是使用Maperitive(使用了v2.4.3.0)的步骤:
创建规则集:规则集是一个包含Maperitive渲染规则的文件。通过提供不同的规则集,可以改变Maperitive中地图的外观(颜色、细节、文本外观)。需要一些“简单”的东西(没有太多会干扰视线的细节),所以查看了所有的规则集,并选择了Google Maps规则集。这只是一个文件,在Maperitive应用程序文件夹的Rules子文件夹中。想要街道的字体更大……所以复制了那个文件,搜索了font-size并增加了一些听起来合适的街道类型的值(需要一些实验)。
获取OpenStreetMap数据作为XML:引用Maperitive的“十分钟介绍⇒加载地图数据”:使用浏览器,转到OSM地图,选择一个小区域(比如说几个城市街区的大小),然后点击“导出”标签。选择OpenStreetMap XML数据单选按钮值,点击“导出”按钮,将从服务器收到一个名为map.osm的文件。
编写Maperitive脚本:这段代码进入一个带有.mscript扩展名的文本文件:
use-ruleset location=sindorftiles.mrules
load-source sindorf.osm
move-pos x=6.674573 y=50.904049 zoom=16
export-bitmap file=map.png height=2000 width=1600
generate-tiles minzoom=16 maxzoom=16 subpixel=3 bounds=6.6554,50.8898,6.6924,50.9191
ftp-upload host=tiles.sindorf-troedelt.de user=USERNAME pwd=PASSWORD remote-dir=/
关于generate-tiles命令的一些说明:minzoom和maxzoom应该与move-pos命令的缩放级别匹配。在这种情况下,为单个缩放级别生成瓦片就足够了——只需要这个视图的地图用于打印,不需要更多的缩放。缩放级别越多,生成的瓦片就越多!对来说,FTP上传并不是真的必要,因为生成瓦片是一次性的事情。手动上传瓦片也是可以接受的……但是,Maperitive可以做到这一点仍然很好。
打开Maperitive并执行脚本:这只是一个两行代码,调用Maperitive并传递第3步的脚本:
rd /s /q Tiles
C:\Maperitive\Maperitive.exe "%~dp0\sindorftiles.mscript" -exitafter