`
it_liuyong
  • 浏览: 100537 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mapnik 介绍

 
阅读更多
一、 Mapnik 介绍

Mapnik 是一个开源的 Python/C++ 地图渲染引擎,他的功能是把数据形式的地图,包含一些地理对象,如地图、层、数据源、特征和地理几何等,通过 一个样式表的定义,渲染成位图格式,用来提供 WMS 服务。其核心是一个 C++ 的共享库提供空间数据访问和可视化的算法和模式。该共享库支持多种操作系统,可以在多线程环境下很好的运行,主要面向一些提供 GIS 服务的 Web 应用开发。图一为使用 mapnik 渲染出来的街区图:



图一

二、 地图数据组织

Mapnik 数据组织包括地图、图层、风格、规则、符号等,其具体以渲染地图文件的方式或者是编程实现的方式予以提供,其地图文件的组织结构如下图二:



图二

备注:地图中可以包含多个风格( Style )、多个图层( Layer ),图层包含对应一个数据源及多个风格,风格包含多个规则,一个规则可以包含多种符号,不同的符号包含不同的属性设置,以 LineSymbolizer 为例,包含 stroke (颜色)、 stroke-width (宽度)、透明度( stroke-opacity )、线相交处模式( stroke-linejoin )、线头模式( stroke-linecap )、线段绘制迭代间隔( stroke-dasharray )。不同的符号之间也有一些相同的属性如 line_pattern_symbolizer 、polygon_pattern_symbolizer 、point_symbolizer 都需要一个file 属性来作为填充图片!

以下是一个仅有路(Road )表述信息的Mapnik 配置文件,可以对map 文件有初步的了解:

<?xml version="1.0" encoding="utf-8"?>

<Map 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" bgcolor="rgb(247,239,239)">

         <Style name="highway-border">

        <Rule>

            <Filter>([NR]&lt;=3)</Filter>

            <LineSymbolizer stroke="rgb(188,149,28)" stroke-width="7" stroke-linejoin="round" stroke-linecap="round"/>

        </Rule>

    </Style>

    <Style name="highway-fill">

        <Rule>

            <Filter>([NR]&lt;=3)</Filter>

            <LineSymbolizer stroke="rgb(242,191,36)" stroke-width="5" stroke-linejoin="round" stroke-linecap="round"/>

        </Rule>

    </Style>

         <Style name="road-border">

        <Rule>

            <Filter>(([NR]=4) or ([NR]=5)or ([NR]=6))</Filter>

            <LineSymbolizer stroke="rgb(171,158,137)" stroke-width="5" stroke-linejoin="round" stroke-linecap="round"/>

        </Rule>

    </Style>

    <Style name="road-fill">

        <Rule>

            <Filter>(([NR]=4) or ([NR]=5)or ([NR]=6))</Filter>

            <LineSymbolizer stroke="rgb(255,250,115)" stroke-width="3" stroke-linejoin="round" stroke-linecap="round"/>

        </Rule>

    </Style>

     <Style name="highway-label">

        <Rule>

                            <Filter>([NR] = 1)</Filter>

            <TextSymbolizer name="[STNAMEC]" face_name="Microsoft YaHei Regular" size="12" fill="rgb(0,0,200)" placement="line" halo_radius="1" max_char_angle_delta="60" halo_fill="rgb(255,255,200)" line_spacing="100" character_spacing="3"  avoid_edges="1" allow_overlap="0"  min_distance="50" spacing="500" />

        </Rule>

                   <Rule>

                            <Filter>(([NR]&lt;=6) and ([NR] &gt;= 2))</Filter>

                            <TextSymbolizer name="[STNAMEC]" face_name="Microsoft YaHei Regular" size="9" fill="rgb(10,10,150)" placement="line" halo_radius="1" halo_fill="rgb(255,255,200)" line_spacing="100" character_spacing="1" avoid_edges="1" allow_overlap="0"  min_distance="20"

                            spacing="300" max_char_angle_delta="35"/>

                   </Rule>

         </Style>

           <Layer name="Roads" 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">

        <StyleName>road-border</StyleName>

        <StyleName>road-fill</StyleName>

        <StyleName>highway-border</StyleName>

        <StyleName>highway-fill</StyleName>

                   <StyleName>highway-label</StyleName>

        <Datasource>

            <Parameter name="encoding">GB2312</Parameter>

            <Parameter name="file">F:/BeijingM/Pathline1-6</Parameter>

            <Parameter name="type">shape</Parameter>

        </Datasource>

    </Layer>

</Map>

三、 Mapnik 主要架构类关系图



图三

图三右边 feature_type_style 部分,为一系列的参数描述,主要是承载地图渲染所需要的相关绘制参数信息; Map 为组织图层数据及绘制风格的载体; feature_style_processor 为地图渲染的抽象基类, agg_renderer 、 cairo_renderer 就是具体负责渲染绘制的类,在绘制时,需要一个用来绘制的设备,如 agg_renderer 需要一个 image_32 的内存图像缓冲区,来承载最终绘制的图片,然后可以使用 save_to_file<image_data_32>() 函数将内存图片保存成最终文件格式!

四、 Mapnik 使用示例

Mapnik 开发主要流程:

l  定义 Map 对象,设置绘制使用的设备大小,及投影信息

l  加载 Map 的配置信息

l  设置 Map 绘制的地理范围

l  定义绘制使用的设备( agg_renderer 为内存图片缓冲区)

l  使用 agg_renderer 或者 cairo_renderer 渲染

l  保存到文件(可选,对于 cairo_renderer 渲染到 pdf 及 svg 等矢量文件时不需要)

具体示例代码如下:

#include <mapnik/map.hpp>

#include <mapnik/datasource_cache.hpp>

#include <mapnik/font_engine_freetype.hpp>

#include <mapnik/agg_renderer.hpp>

#include <mapnik/image_util.hpp>

#include <mapnik/config_error.hpp>

#include <mapnik/box2d.hpp>



#include <iostream>

#include <mapnik/save_map.hpp>

#include "mapnik/load_map.hpp"



  int main ( int argc , char** argv)

  {

     using namespace mapnik;// 使用 mapnik 命名空间

     try {

         std::cout << " running demo ... /n";

                     // 注册数据源插件

         datasource_cache::instance()->register_datasources("F:/work/mapnik/trunk/builds/win32/Bin");

                     // 注册字体

                   freetype_engine::register_font("F:/work/fonts/simkai.ttf");

                   freetype_engine::register_font("F:/work/fonts/msyh.ttf");

         std::vector<std::string> names = freetype_engine::face_names();

         std::cout << "face names size:" << names.size() << "/n";

         for (unsigned i = 0; i < names.size(); ++i){

             std::cout << names[i] << "/n";

         }

                     // 声明 Map 对象,包括绘制使用的设备大小,及投影信息

         Map m(1024,1024,"+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");

         //m.set_background(color_factory::from_string("white"));

                     // 加载 Map 配置文件

                     load_map(m,"mapconfig.xml");

                   // 设置地图绘制地理范围

         m.zoomToBox(box2d<double>(12934400,4862620,12944200,4872400));

                   // 定义具体绘制的内存图片缓冲区

         image_32 buf(m.getWidth(),m.getHeight());

                     // 使用 agg_renderer 渲染绘制

         agg_renderer<image_32> ren(m,buf);

          ren.apply();

                   //save_map(m,"mapconfig.xml");

         //save_to_file<image_data_32>(buf.data(),"demo.jpg","jpeg");

         //save_to_file<image_data_32>(buf.data(),"demo.png","png");

                     // 保存到文件

         save_to_file<image_data_32>(buf.data(),"demo256.png","png256");

                   //save_map(m,"map.xml",false);

         std::cout << "One maps have been rendered using AGG in the current directory:/n"

            "Have a look!/n";

     }

     catch ( const mapnik::config_error & ex )

     {

         std::cerr << "### Configuration error: " << ex.what() << std::endl;

         return EXIT_FAILURE;

     }

     catch ( const std::exception & ex )

     {

         std::cerr << "### std::exception: " << ex.what() << std::endl;

         return EXIT_FAILURE;

     }

     catch ( ... )

     {

         std::cerr << "### Unknown exception." << std::endl;

         return EXIT_FAILURE;

     }

     return EXIT_SUCCESS;  

  }

五、 总结

Mapnik 作为一个开源的地图渲染引擎,拥有良好的技术架构,并使用了很多成熟的开源技术如 proj4 、 freetype 、 libxml2 、 GDAL 、 Boost 、 ltdl 等,并使用 AGG 、 Cairo-Graphics 来具体渲染绘制,具有良好的反锯齿效果!大量使用了 Boost 库特有的 C++ 技术,如 variant 、 tuple ,并利用 C++ STL (仿函数等)、泛型编程技术及相关设计模式(单件模式、访问者模式等),使用插件式的数据源开发方式,使 Mapnik 可以灵活扩展出针对自己的数据格式插件!

然而对于开发人员, mapnik 采用的属性与具体渲染操作分开的模式,屏蔽了内部复杂的实现细节,而对外提供的接口确是简单易用!
分享到:
评论

相关推荐

    mapnik简要介绍

    ### Mapnik简要介绍 #### 1. Mapnik 介绍 Mapnik是一个强大的开源地图渲染引擎,它结合了Python和C++的技术优势,能够高效地处理各种地理信息系统的(GIS)数据并将其转换为视觉上丰富的地图图像。Mapnik的核心是...

    mapnik地图符号化

    1. **符号化说明文档**:这份文档可能详细介绍了如何创建和配置Mapnik的XML风格文件,包括各个元素和属性的解释,以及如何使用SLD(Styled Layer Descriptor)标准来设计地图样式。你可能会学习到如何定义符号化规则...

    PyPI 官网下载 | large-image-source-mapnik-1.4.2.dev7.tar.gz

    本文将详细介绍这个库的背景、功能、使用方法以及与Mapnik的关系。 **大型图像源Mapnik库** large-image-source-mapnik是Python中处理大型图像的一个库,它提供了对地图渲染工具Mapnik的支持。Mapnik是一个强大的...

    PyPI 官网下载 | large-image-source-mapnik-1.8.7.dev7.tar.gz

    Python库的结构通常包括`setup.py`(用于安装和配置)、`README`(介绍项目信息)、`LICENSE`(授权信息)、`requirements.txt`(依赖库列表)、`src`或`lib`目录(存放源代码)以及可能的`tests`目录(单元测试)。...

    Scons V3.0.5

    接下来将详细介绍这些文件及其包含的关键技术知识点。 #### 关键技术知识点详解 ##### agg_renderer.os - **Agg Renderer**:此文件涉及Agg库中的渲染器部分。Agg(Anti-Grain Geometry)是一个高质量、快速的2D...

    custom-map-tiles-part-3-TileStache

    文章的标题为“Custom Map Tiles (Part 3 - TileStache)”,表明这是一系列关于自定义地图瓦片的文章的第三部分,专注于介绍TileStache的相关内容。TileStache是一个用于生成、缓存和提供地图瓦片的Web服务。之前的...

    Python Geospatial Analysis Essentials

    - 介绍Mapnik库,这是一个用于创建地图的Python库。 - 学习Mapnik的基本使用方法,包括如何安装、配置数据源,以及地图渲染。 - 详细讲解不同类型的符号器(Symbolizers),包括点(PointSymbolizer)、线...

    基于Python的开源GIS应用开发.pdf

    本文件介绍基于Python语言开发开源地理信息系统(GIS)应用的方法和流程,特别是利用一些关键的Python库如Pyproj、Shapely和Mapnik进行地图渲染和地理空间数据处理。以下是详细的知识点梳理: ### Python在GIS应用...

    android 使用osmdroid 加载离线map格式数据以及地图网格

    本教程将详细介绍如何使用osmdroid库加载离线map格式数据以及地图网格。 首先,我们需要理解osmdroid的核心概念。osmdroid提供了一个灵活的地图视图组件(MapView),可以加载不同来源的地图瓦片。离线地图是通过...

    地图服务器

    本知识点将详细介绍几种流行的开源地图服务器:Mapserver、GeoServer、QGIS以及MapNik,同时也会涉及与这些服务器相关的地理信息库,如GDAL/OGR、Geotools和Geotoolkit,以及一些开源的地理信息系统解决方案。...

    SCons 2.5.0手册

    手册中可能详细介绍了SCons的安装、配置、编写SConstruct脚本的规范、构建过程的优化、各种构建选项和环境变量的设置、构建错误的诊断等内容。手册还可能包含了大量关于如何使用SCons进行各种类型项目构建的示例和...

    离线地图_openstreetmap_postgresql_瓦片

    离线地图_openstreetmap_postgresql_瓦片 ...介绍(免积分) http://download.csdn.net/detail/a137015127302/8594877 如果懒得自己慢慢找,我想你不介意花点积分的吧。 1.postgreSql_1.&postgis_install ...

    tilestrata:可插拔的Node.js地图图块服务器

    介绍 TileStrata由五个主要参与者组成,通常以插件的形式实现: “提供者” –生成一个新的图块(例如mapnik) “缓存” –保留一个切片以供以后的请求(例如文件系统) “转换” –提取原始图块并对其进行转换...

    Python在乡级土地利用总体规划图批量制图中的应用.zip

    以下将详细介绍Python在这个领域的应用及其相关知识点。 1. **GDAL/OGR库**:GDAL(Geospatial Data Abstraction Library)和OGR(OpenGIS Simple Features Reference Implementation)是Python中处理地理空间数据...

    tilecloud:一个强大的实用程序,用于生成,管理,转换和可视化多种格式的地图图块

    [Mapnik]( )(通过[mapnik2]( )) [Memcached]( ) 本地文件系统 记录任何格式的文件 TileCloud不限于图像图块,它还可以处理其他图块数据,例如[UTFGrid]( )或JSON格式的高程数据。 TileCloud使用Python...

    render-nyc:从OpenStreetMap数据渲染NYC

    此仓库介绍了如何使用OSM数据在Mac OS X上渲染曼哈顿的高质量栅格图像。它比您预期的要复杂一些。 这是我刚开始时希望得到的指南。 它可以轻松地适应不同的城市-我就像具体的[0]示例:) 有两个主要组成部分: 一...

    Leaflet-Basic:这包含有关传单编程的基本代码。 它包括一些重要的传单插件和其他一些用于分析地图的不同技术

    介绍 这个 repo 包含关于传单的所有基本想法。 我添加了关于各种功能。 基本的 在这个文件夹中,我添加了以下功能。 添加底图 var map = L . map ( "map" ) . setView ( [ 28.2521 , 83.9774 ] , 18 ) ; var Open...

Global site tag (gtag.js) - Google Analytics