一种基于矢量瓦片的地图绘制方法技术领域
本发明涉及瓦片地图技术领域,尤其是涉及一种基于矢量瓦片的地图绘制方法。
背景技术
随着国民经济的不断发展、国家基础地理信息数据不断丰富和完善,地图作为数
据信息可视化的载体对上级的决策发挥着越来越重要的作用。地图的绘制主要有基于栅格
瓦片和矢量瓦片技术。但栅格瓦片技术地理要素样式不易更新并且不易得到高分率的地
图,实际中多采用矢量瓦片技术。
实现方案一般为先根据实际地理区域确定所需要的瓦片,再将每个瓦片单独渲染
成图片并拼接,最后截取实际图幅大小输出。此方案对多数据源的支持不佳,实现较为复
杂。另外在瓦片拼接的过程中容易造成注记错位和重复的问题,并且最后的的截取操作会
造成注记的截断,这些都不符合高性能地图绘制的要求。
发明内容
本发明的目的在于提供一种基于矢量瓦片的地图绘制方法,支持多源异构数据,
操作简单,能够在高分辨率的矢量瓦片绘图基础上,有效解决注记错位和边缘切割的问题。
第一方面,本发明实施例提供了一种基于矢量瓦片的地图绘制方法,所述方法包
括;
读取地图绘制参数;
将所述地图绘制参数进行计算并变换坐标生成地图画布;
从本地数据源信息总表中查找是否存在地图图层数据参数;
如果存在,则将存在于所述本地数据源信息总表中的地图图层数据参数作为本地
数据;
如果不存在,则将不存在于所述本地数据源信息总表中的地图图层数据参数作为
在线数据;
从所述本地数据和所述在线数据中分别获取数据库数据和矢量瓦片集数据;
将所述数据库数据和所述矢量瓦片集数据分别添加到所述地图画布中对应的图
层,并绘制地图。
结合第一方面,本发明实施例提供了第一方面第一种可能的实施方式,所述将所
述地图绘制参数进行计算并变换坐标生成地图画布包括:
将所述地图绘制参数进行计算,得到瓦片坐标和地图图像的像素尺寸;
使用球面墨卡托模块将经纬度坐标范围变换为投影坐标范围;
加载样式说明文件,将所述瓦片坐标、所述地图图像的像素尺寸和所述投影坐标
范围通过引擎生成所述地图画布。
结合第一方面,本发明实施例提供了第一方面第二种可能的实施方式,所述从所
述本地数据和所述在线数据中分别获取数据库数据和矢量瓦片数据包括:所述本地数据通
过读取目标数据的配置说明文件获取所述数据库数据。
结合第一方面第二种可能的实施方式,本发明实施例提供了第一方面第三种可能
的实施方式,所述从所述本地数据和所述在线数据中分别获取数据库数据和矢量瓦片集数
据还包括:
所述在线数据通过发送Http请求获取矢量瓦片数据,将绘图区域内的所有所述矢
量瓦片数据合并,生成矢量瓦片集数据。
结合第一方面第三种可能的实施方式,本发明实施例提供了第一方面第四种可能
的实施方式,,所述在线数据通过发送Http请求获取矢量瓦片数据,将绘图区域内的所有所
述矢量瓦片数据合并,生成矢量瓦片集数据包括:
将所述在线数据的地理坐标替换成瓦片地理坐标得到所述瓦片数据网络地址,发
送Http请求得到所述矢量瓦片数据;
将所述矢量瓦片数据进行格式转换,并将所述矢量瓦片数据按数据层进行地理要
素合并,生成所述矢量瓦片集数据。
结合第一方面第四种可能的实施方式,本发明实施例提供了第一方面第五种可能
的实施方式,所述地理要素包括面要素,所述将所述矢量瓦片数据按数据层进行地理要素
合并包括:
建立瓦片间的邻接表,所述邻接表初始值为0;
根据与相邻瓦片不相交的所述面要素,直接将所述矢量瓦片数据进行合并;
根据与所述相邻瓦片相交的所述面要素,如果所述邻接表的值为1,则继续遍历所
述瓦片;
根据与所述相邻瓦片相交的所述面要素,如果所述邻接表的值为0,则将所述矢量
瓦片数据进行合并,并同时将所述邻接表的值更新为1。
结合第一方面第五种可能的实施方式,本发明实施例提供了第一方面第六种可能
的实施方式,所述将所述矢量瓦片数据按数据层进行地理要素合并还包括:
根据与所述瓦片的边缘不相交的所述面要素,直接将所述矢量瓦片数据进行合
并;
根据与所述瓦片的边缘相交的所述面要素,用所述瓦片边缘对所述面要素进行切
割,截取相交面数据;
将所述相交面数据进行合并。
结合第一方面第四种可能的实施方式,本发明实施例提供了第一方面第七种可能
的实施方式,所述地理要素还包括点要素和线要素,所述将所述矢量瓦片数据按数据层进
行地理要素合并还包括:
根据所述点要素和所述线要素,直接将所述矢量瓦片数据进行合并。
结合第一方面,本发明实施例提供了第一方面第八种可能的实施方式,所述地图
绘制参数包括区域经纬度范围、缩放级别、制图分辨率、瓦片原始大小和地图样式说明中的
一种或几种。
结合第一方面,本发明实施例提供了第一方面第九种可能的实施方式,所述数据
库数据包括主机号、端口号、数据库中地理字段名、空间引用标识符、数据库名、用户名、密
码、数据查询语句和地理范围中的一种或几种。
本发明提供一种基于矢量瓦片的地图绘制方法,通过读取地图绘制参数;将地图
绘制参数进行计算并变换坐标生成地图画布;从本地数据源信息总表中查找是否存在地图
图层数据参数;判断地图图层数据参数是否存在于本地数据源信息总表中,如果存在,则将
存在于本地数据源信息总表中的地图图层数据参数作为本地数据;如果不存在,则将不存
在于本地数据源信息总表中的地图图层数据参数作为在线数据;从本地数据和在线数据中
分别获取数据库数据和矢量瓦片集数据;将数据库数据和矢量瓦片集数据分别添加到地图
画布中对应的图层,并绘制地图。本发明方法支持多源异构数据,操作简单,能够在高分辨
率的矢量瓦片绘图基础上,有效解决注记错位和边缘切割的问题。
附图说明
为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体
实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的
附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前
提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种基于矢量瓦片的地图绘制方法流程图;
图2为本发明实施例提供的一种基于矢量瓦片的地图绘制方法流程图中步骤S102
的流程图;
图3为本发明实施例提供的一种基于矢量瓦片的地图绘制方法流程图中步骤S106
的流程图;
图4为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取本地数据流
程图;
图5为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据流
程图;
图6为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据中
第一种面要素合并流程图;
图7为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据中
第二种面要素合并流程图;
图8为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据和
第一种面要素合并流程图;
图9为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据和
第二种面要素合并流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例
中附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅
是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实
施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本发明的
实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实
施例。基于本发明的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所
有其他实施例,都属于本发明保护的范围。
现有的实现方案一般先根据实际地理区域确定所需要的瓦片,再将每个瓦片单独
渲染成图片并拼接,最后截取实际图幅大小输出。此方案对多数据源的支持不佳,实现较为
复杂。另外在瓦片拼接的过程中容易造成注记错位和重复的问题,并且最后的的截取操作
必然造成注记的截断,这些都不符合高性能地图绘制的要求。
本发明提供一种基于矢量瓦片的地图绘制方法,通过读取地图绘制参数;将地图
绘制参数进行计算并变换坐标生成地图画布;从本地数据源信息总表中查找是否存在地图
图层数据参数;判断地图图层数据参数是否存在于本地数据源信息总表中,如果存在,则将
存在于本地数据源信息总表中的地图图层数据参数作为本地数据;如果不存在,则将不存
在于本地数据源信息总表中的地图图层数据参数作为在线数据;从本地数据和在线数据中
分别获取数据库数据和矢量瓦片集数据;将数据库数据和矢量瓦片集数据分别添加到地图
画布中对应的图层,并绘制地图。本发明方法支持多源异构数据,操作简单,能够在高分辨
率的矢量瓦片绘图基础上,有效解决注记错位和边缘切割的问题。
下面通过实施例进行详细描述。
图1为本发明实施例提供的一种基于矢量瓦片的地图绘制方法流程图。
参照图1,该方法包括如下步骤:
步骤S101,读取地图绘制参数;
具体地,地图绘制参数包括,区域经纬度范围bbox,缩放级别zoom,制图分辨率
Scale,瓦片原始大小Tilesize以及地图样式说明Xml。
其中,bbox范围即为需要绘制地图的实际地理区域。zoom为当前绘图所在的级别
是比例尺的体现,不同级别所展现的地理要素不同。Scale参数设置的是地图图像的分辨
率,为1是表示72dpi,4表示288dpi。Tilesize为提供瓦片的服务器端瓦片原始大小,默认为
256像素。Xml中包含地图的图层、风格、规则、符号和数据等说明。
步骤S102,将地图绘制参数进行计算并变换坐标生成地图画布;
这里,利用abaculus模块计算,得出瓦片地理坐标坐标[z][x][y]以及地图图像的
像素尺寸width和height。
具体地,abaculus模块是一个开源库,主要用于将瓦片拼接在一起生成静态地图。
其中,使用Spherical Mercator(球面墨卡托)模块将经纬度坐标范围变换为web
Mercator投影坐标范围。
步骤S103,从本地数据源信息总表中查找是否存在地图图层数据参数,如果存在,
则执行步骤S104;如果不存在,则执行步骤S105;
步骤S104,将存在于本地数据源信息总表中的地图图层数据参数作为本地数据;
具体地,本地数据通过查询PostGIS数据库获得。
其中,PostGIS是对象-关系型数据库系统PostgreSQL的一个扩展,提供空间对
象、空间索引、空间操作函数和空间操作符等空间信息服务功能,并支持所有的空间数据类
型,这些类型包括:点(POINT)、线(LINESTRING)、多边形(POLYGON)、多点(MULTIPOINT)、多
线(MULTILINESTRING)、多多边形(MULTIPOLYGON)和集合对象集(GEOMETRYCOLLECTION)等。
步骤S105,将不存在于本地数据源信息总表中的地图图层数据参数作为在线数
据;
这里,在线数据通过发送http请求获取瓦片数据。
步骤S106,从本地数据和在线数据中分别获取数据库数据和矢量瓦片集数据;
这里,在线获取的瓦片数据,并将绘图区域内所有瓦片数据合并。
步骤S107,将数据库数据和矢量瓦片集数据分别添加到地图画布中对应的图层,
并绘制地图。
具体地,按样式中图层顺序依次添加数据,用Mapnik引擎中render接口实现地图
的绘制。
其中,该步骤中按Map中layer的先后顺序遍历,依次将步骤S106中所得到的数据
加入到Map中。将数据作为一个整体进行绘制,有效的解决了注记错位以及边缘切割的问
题。
这里,Mapnik支持多种数据源格式,如:shape,PostGIS,pgraster,raster,gdal,
org,osm,geojson等。
数据一定要按顺序添加,Mapnik在绘制地图的过程中先绘制样式里面最前面的数
据层,并将其作为底图,其他层按顺序叠加在前面的图层上。绘制过过程中存在着严格的先
后顺序。
进一步的,如图2所示,上述实施例基于矢量瓦片的地图绘制方法中,步骤S102可
采用如下步骤实现,包括:
步骤S201,将地图绘制参数进行计算,得到瓦片坐标和地图图像的像素尺寸;
这里,利用abaculus模块计算,得出瓦片地理坐标坐标[z][x][y]以及地图图像的
像素尺寸width和height。
具体地,abaculus模块是一个开源库,主要用于将瓦片拼接在一起生成静态地图。
步骤S202,使用球面墨卡托模块将经纬度坐标范围变换为投影坐标范围;
其中,使用Spherical Mercator模块将经纬度坐标范围bbox转变为web Mercator
投影坐标范围bbox’。Spherical Mercator模块是一个用于Mercator坐标系,屏幕像素坐标
系和经纬度坐标系间的相互转换工具。
这里,墨卡托(Mercator)投影,又名“等角正轴圆柱投影”。“等角”特性,保证了对
象的形状的不变性,也保证了方向和相互位置的正确性。Web墨卡托投影坐标系以整个世界
范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标原点,向东向北为正,
向西向南为负。
赤道半径为6378137米,则赤道周长为2*PI*r=20037508.3427892,
X轴的取值范围:[-20037508.3427892,20037508.3427892],
Y轴的取值范围也限定在[-20037508.3427892,20037508.3427892]之间,故整体
为正方形区域。
步骤S203,加载样式说明文件,将瓦片坐标、地图图像的像素尺寸和投影坐标范围
通过引擎生成地图画布。
具体地,新建Mapnik画布Map,加载Xml样式说明文件,并设置Map范围为bbox’。
Mapnik是一个开源的地图渲染引擎,他的功能是把数据形式的地图,包含一些地
理对象,如地图、层、数据源、特征和地理几何等,通过一个样式表的定义,渲染成位图格式,
用来提供WMS服务。Xml里面定义了Map的配置信息,主要包括风格(style)对象和图层
(layer)对象。地图中可以包含多个风格、多个图层,图层包含对应一个数据源及多个风格,
风格包含多个规则,一个规则可以包含多种符号,不同的符号包含不同的属性设置。其中为
避免注记被切割,需要把TextSymbolizer中avoid-edges设为true。Map加载Xml后,要约束
其图幅地理范围,使其与目标区域一致。
具体地,如图3所示,上述实施例基于矢量瓦片的地图绘制方法中,步骤S106可采
用如下步骤实现,包括:
步骤S301,本地数据通过读取目标数据的配置说明文件获取数据库数据;
具体地,若为本地数据,则读取目标数据的配置说明文件,获取PostGIS数据源的
相关参数。
步骤S302,在线数据通过发送Http请求获取矢量瓦片数据,将绘图区域内的所有
矢量瓦片数据合并,生成矢量瓦片集数据。
具体地,如图4本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取本
地数据流程图所示,上述实施例基于矢量瓦片的地图绘制方法中,步骤S301可采用如下步
骤实现,包括:
步骤S401,解析URL获取本地数据源说明文件入口;
步骤S402,读取配置说明文件获取数据库数据;
这里,数据库数据包括host,port,dbname,user,password,table,geome_field,
srid,extent等。
这里type为数据源类型,host为主机号,port为端口号,geometry_field为数据库
中地理字段名,srid为空间引用标识符,dbname为数据库名,user和password为用户名和密
码,table为数据查询语句,extent为地理范围。
步骤S403,取出地图中相对应的图层数据。
其中,本地数据按照Mapnik PostGIS数据源的格式进行添加。
具体地,如图5本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在
线数据流程图所示,上述实施例基于矢量瓦片的地图绘制方法中,步骤S302可采用如下步
骤实现,包括:
步骤S501,在线数据的地理坐标替换成瓦片地理坐标得到瓦片数据网络地址,发
送Http请求得到矢量瓦片数据;
这里,为了便于数据的存储与快速传输,常对数据进行压缩。为此,在进行后续步
骤之前先要对数据进行解压缩操作,以获得瓦片真实数据
步骤S502,矢量瓦片数据进行格式转换,并将矢量瓦片数据按数据层进行地理要
素合并,生成矢量瓦片集数据。
这里,在线数据获取到的瓦片数据被转成geojson格式,按照Mapnik中内联的方式
加入。
具体地,将矢量瓦片数据从pbf格式转成geojson格式。
pbf(Protocolbuffer Binary Format)是一种轻便高效的结构化数据存储格式,
可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可
用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
geojson是一种对各种地理数据结构进行编码的格式,基于Javascript对象表示法的地理
空间信息数据交换格式,其对象可以表示几何、特征或者特征集合。geojson支持点、线、面、
多点、多线、多面和几何集合这几种几何类型,里面的特征包含一个几何对象和其他属性,
特征集合表示一系列特征。
将pbf格式数据转成geojson格式,实现了数据的解析。使用js对象对数据进行存
储,便于数据的分析处理。
这里,每个瓦片只取出该区域所包含的地理要素特征,不包括瓦片buffer里面的
数据。但面要素为多点构成的闭合多边形,其边缘难以和瓦片边缘刚好重合,会出现跨越多
个瓦片的情形,在合并后会造成面要素重叠的问题。
具体地,如图6本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在
线数据中第一种面要素合并流程图所示,上述实施例基于矢量瓦片的地图绘制方法中,步
骤S502可采用如下步骤实现,包括:
步骤S601,建立瓦片间的邻接表,邻接表初始值为0;
步骤S602,根据与相邻瓦片不相交的面要素,直接将矢量瓦片数据进行合并;
步骤S603,根据与相邻瓦片相交的所述面要素,如果邻接表的值为1,则继续遍历
瓦片;
步骤S604,根据与相邻瓦片相交的所述面要素,如果邻接表的值为0,则将矢量瓦
片数据进行合并,并同时将邻接表的值更新为1。
其中,直至所有数据被合并。此方法适用于面要素完整并需要显示轮廓的地理数
据,如行政区划面数据。
具体地,如图7本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在
线数据中第二种面要素合并流程图所示,上述实施例矢量瓦片的地图绘制方法中,步骤
S502还可采用如下步骤实现,包括:
步骤S701,根据与瓦片的边缘不相交的所述面要素,直接将矢量瓦片数据进行合
并;
步骤S702,根据与瓦片的边缘相交的所述面要素,用瓦片边缘对面要素进行切割,
截取相交面数据,将相交面数据进行合并。
此方法适用于不需要画轮廓的地理数据,如山影数据。
根据本发明的示例性实施例,地理要素还包括点要素和线要素,将矢量瓦片数据
按数据层进行地理要素合并还包括:
根据点要素和所述线要素,直接将矢量瓦片数据进行合并。
根据本发明的示例性实施例,地图绘制参数包括区域经纬度范围、缩放级别、制图
分辨率、瓦片原始大小和地图样式说明中的一种或几种。
根据本发明的示例性实施例,数据库数据包括主机号、端口号、数据库中地理字段
名、空间引用标识符、数据库名、用户名、密码、数据查询语句和地理范围中的一种或几种。
本发明提供一种基于矢量瓦片的地图绘制方法,通过读取地图绘制参数;将地图
绘制参数进行计算并变换坐标生成地图画布;判断地图图层数据参数是否存在于本地数据
源信息总表中,如果存在,则将存在于本地数据源信息总表中的地图图层数据参数作为本
地数据;如果不存在,则将不存在于本地数据源信息总表中的地图图层数据参数作为在线
数据;从本地数据和在线数据中分别获取数据库数据和矢量瓦片集数据;将数据库数据和
矢量瓦片集数据分别添加到地图画布中对应的图层,并绘制地图。本发明方法支持多源异
构数据,操作简单,能够在高分辨率的矢量瓦片绘图基础上,有效解决注记错位和边缘切割
的问题。
图8为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据和
第一种面要素合并流程图。
参照图8,包括如下步骤:
步骤S801,遍历在线数据的地理坐标;
步骤S802,在线数据的地理坐标替换成瓦片地理坐标得到瓦片数据网络地址;
步骤S803,发送Http请求得到矢量瓦片数据;
步骤S804,将矢量瓦片数据进行格式转换,
步骤S805,将矢量瓦片数据按数据层进行地理要素合并,生成矢量瓦片集数据;
步骤S806,建立瓦片间的邻接表,邻接表初始值为0;
步骤S807,根据与相邻瓦片不相交的面要素,直接将矢量瓦片数据进行合并;
步骤S808,根据与相邻瓦片相交的面要素,如果邻接表的值为1,则继续遍历瓦片;
步骤S809,根据与相邻瓦片相交的面要素,如果邻接表的值为0,则将矢量瓦片数
据进行合并,并同时将邻接表的值更新为1。
图9为本发明实施例提供的一种基于矢量瓦片的地图绘制方法中获取在线数据和
第二种面要素合并流程图。
参照图9,包括如下步骤:
步骤S901,遍历在线数据的地理坐标;
步骤S902,在线数据的地理坐标替换成瓦片地理坐标得到瓦片数据网络地址;
步骤S903,发送Http请求得到矢量瓦片数据;
步骤S904,将矢量瓦片数据进行格式转换,
步骤S905,将矢量瓦片数据按数据层进行地理要素合并,生成矢量瓦片集数据;
步骤S906,根据与瓦片的边缘不相交的面要素,直接将矢量瓦片数据进行合并;
步骤S907,根据与瓦片的边缘相交的面要素,用瓦片边缘对面要素进行切割,截取
相交面数据,将相交面数据进行合并。
其中,如果Map中包含多个在线数据源,则重复图8和图9中流程,直至将所有数据
获取。
最后应说明的是:以上各实施例仅用于说明本发明的技术方案,而非对其限制;尽
管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依
然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进
行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术
方案的范围。