Mapnik直接读取osm文件进行画图

Posted on 2010-09-18 22:21  流浪的矩阵  阅读(7130)  评论(1编辑  收藏  举报

.osm文件是Open Street Map的标准数据格式,OSM网站的SlippyMap使用Mapnik进行渲染。但其采用的方法需要转换成PostGis数据库文件格式才能绘制。Mapnik已经有了直接绘制.osm文件的插件,默认的二进制文件是不包含该插件的,需要下载代码自己编译,编译前修改config.py文件的INPUT_PLUGINS配置,加入“osm”。

 

在plugin/input/osm中有test的osm文件和xml文件。

 

osm文件是地理信息数据文件,存储经纬度及相应的街道名称等地理信息,osm文件格式分为两种普通osm文件和JSOM文件。JSOM文件格式是OSM的java桌面程序JOSM使用的文件格式,和普通的osm文件几乎没有差别,具体的详细内容见 http://wiki.openstreetmap.org/wiki/JOSM_file_format

 

xml文件是mapnik用来绘制地图的规则,包含使用的字体、线条的粗细颜色等信息。地图信息被划为一个个的Layer,根据Mapnik采用的“画家算法“,先绘制的Layer会被后绘制的Layer覆盖。

 

xml文件还有一个很重要的属性,那就是映射方法——srs。商业的地图软件如Google Map使用的都是 Mercator projectionosm文件采用的是lat/lon经纬度方法,如果映射失败,出现的地图就只有背景的颜色,我在这里卡了好几,最后到mapnik的邮件列表中问了下才弄清楚。

 

一开始使用plugin/input/osm/demo下的easymapnik和test.xml、test2.osm进行绘制地图,只能得到空白的地图,使用nik2img.py工具可以得到正确的地图。后来发现原因就是由于osm是lat/lon映射方式,而easymapnik把bounding box映射成了merc方式,这时需要将map的srs属性通过set_srs()函数进行设置,才能够正确地投影。

 

因为读取xml文件时会根据xml文件的srs进行设置,所以要在读取xml文件后加上如下语句。

 

//remenber set srs after load xml file
m.set_srs("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over");

 

 

最后就可以得到想要的地图文件了。

easymapnik demo img

Copyright © 2024 流浪的矩阵
Powered by .NET 8.0 on Kubernetes