在当前社会,大数据、云计算、人工智能等高大上词汇充斥的时代,既追求速度,又追求精度,传统的平台应对略显吃力。如果只是几百条数据里面查找一条结果,可能很容易,秒级出结果。但要在数十亿条数据中查找符合条件的数据响应时间就不可想象了。
如何快速高效的解决上述问题呢,我们需要打破传统的GIS数据检索与平台计算模式,可以使用数据库方式来完成上层应用的计算。
首先,我们先来了解一下所用到的数据库软件——金仓KingbaseES GIS(以下简称KGIS),KGIS提供了从空间数据类型、维度坐标、空间索引、空间处理函数等全栈能力,并通过空间算法优化到空间处理函数灵活扩展等创新架构,实现了对GIS平台全体系高效支撑。
1、KGIS产品介绍
KGIS提供近700种空间分析函数,应用于矢量、栅格、点云、三维等数据类型,在诸多国产数据库中KGIS对空间数据处理能力最强;KGIS支持GiST、BRIN和SP-GiST等多种空间索引,实现了数据高效检索;KGIS提供局部压缩、分块处理和网格计算等空间计算优化算法,可以实现更高的空间处理效率。
2、KGIS异构空间数据高效迁移及实时增量同步
KGIS异构空间数据智能转换功能,解决Oracle、MySQL、SQL Server等异构数据库的空间数据兼容问题,支持其数据库到金仓数据库的空间数据高效迁移及实时增量同步。
3、KGIS已取得大量空间信息应用案例
KGIS已应用到自然资源、水利、交通、能源、农业等行业,在众多重大项目中获得应用实践,例如综合办公管理平台国产化、不动产登记信息管理基础平台、自然资源“一张图”、国土空间基础信息平台、国家生态保护红线监管平台等项目,主要解决了架构复杂、开发及运维困难、海量GIS数据精确迁移困难、全XC环境系统性能亟待优化等问题。
4、KGIS数百万级真实试验测试过程介绍
本次测试数据为建筑物面状图层,数据量为2697974条记录,查询范围近似全国陆地范围的多边形。
测试方案一:使用传统的GIS平台进行相交计算。主要计算的数据为building层2697974条记录,polygon层1条数据,相交结果为1693786条数据,用时23分钟7秒;
测试方案二:使用KingbaseES数据库KGIS插件计算。运行简单的SQL直接计算两个图层相交,相交结果1688465条数据,用时仅为7.531秒;下面贴上具体实现代码:
select count(*) from (select distinct b.objectid from china c, building_polygon b where ST_Intersects(ST_Transform
(c.shape, 4326), b.shape));
count
---------
1688465
(1 row)
Time: 7530.577 ms (00:07.531)
测试方案三:使用KingbaseES数据库优化计算方式。这次测试我们来基于KingbaseES数据库尝试开展进一步优化计算,分步骤介绍如下:
(1)创建建筑物与查询范围的内联结果inner_table表(判断依据:首先通过ST_HexagonGrid函数将地图生成指定大小的六边形蜂窝网格,然后通过ST_Intersects函数判断建筑物表中每一个与蜂窝网格边界是否相交,如果相交将建筑物与蜂窝块状联合信息存入到表中)
create table inner_table as
with hexes as(
select(ST_HexagonGrid (0.5, ST_Transform(a.shape, 4326))).*
FROM china a
where bou1_4m_id = '3339'
)
select * from hexes
inner join "building_polygon" AS p ON ST_Intersects(p.shape, hexes.geom);
(2)内联后根据建筑物唯一标识只保留一个建筑物信息建立one_building表(建立依据:每个建筑物都有其唯一标识objectid号,通过检索inner_table表,只保留第一个objectid的建筑物-蜂窝块状信息,这样就去除了重复的建筑物信息)(其实到这一步,就已经可以了)这个表中存储了整个地图(包括边界)中每一个不重复的建筑物及其地址位置信息
create table one_building as
select distinct on(objectid) geom, i, j, objectid, osm_id, shape, name, type from inner_table;
(3)根据geom对这些区域进行划分分组geom_building(建立依据:具有相同geom的元组会被划分到一个表中,也就是说这个表中存储了每个蜂窝块中每一个不重复的建筑物总数和这个蜂窝块的地理信息)
create table geom_building as
select geom,count(*) from one_building group by geom;
(4)将全部区域的建筑物数量相加(将每一蜂窝块中的建筑物个数相加,就是整个地图中的建筑物总数)
select sum(count) from geom_building;
(5)综合1-4步骤的联合语句,计算建筑物总数量
create table3 result as
select geom, count(*) from
(
select distinct on (objectid) geom,i,j,objectid,osm_id,shape,name,type from
(
with hexes as(
select(ST_HexagonGrid (0.1, ST_Transform(a.shape, 4326))).*
FROM china a
where bou1_4m_id = '3339'
)
select * from hexes
inner join "building_polygon" AS p ON ST_Intersects(p.shape, hexes.geom)
)
)
group by geom;
select sum(count) from result;
---------
1725419
(1 row)
Time: 184.206 ms
5、KGIS数百万级真实试验测试情况总结
(1)测试方案1,传统GIS平台模式计算时长过多,结果很不理想,可见无法在实际项目中使用。
(2)测试方案2,使用KingbaseES数据库KGIS插件计算,我们使用通用的SQL计算,计算时间较传统GIS平台提高185倍,查询精度为99.6%;
(3)测试方案3,使用KingbaseES数据库优化计算方式,我们在通用方法基础上使用优化SQL计算,计算时间较传统GIS平台提高450倍,查询精度为98.2%;
综上所述,我们可以看到三种方法精度相差不大,但时间效率上影响是几百倍,如果第三种算法进一步进行细化,使得精度提升,达到99%以上的精度,计算速度相对传统GIS平台依然是优越几百倍。所以,GIS应用计算在精度允许范围内,放到数据存储层的数据库层面计算,可以大幅提升计算速度,同时可以优化节省前端GIS平台展示的资源,岂不两全其美!