大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果

时间:2024-04-01 12:41:37
  • 需求场景

Web端通过地图范围变化事件,动态请求加载空间数据库中的点数据进行展示,指定的屏幕像素范围内,在不同的地图缩放级别显示不同数量的点(大比例尺下展示较多的点,表比例尺下加载一些特征点展示),从而使Web页面能够更为美观的展示数据。

  • 技术点

聚合算法,屏幕像素转地图距离、PostGIS、查询优化、存储过程

  • 接口参数

在此需求下,前端要调用服务接口,需要传入指定的像素celCount,当前地图分辨率mapResolution,当前地图比例尺mapScale,要查询的数据库表名tableName。考虑到查询返回一些点并不在当前屏幕显示的地图范围内,为避免显示这些多余的点而造成浏览器压力,可将当前地图范围作为查询条件,因此,还需要传入一个当前地图范围参数mapExtent

  • 实现流程

获取数据表的空间范围tableExtent——》与mapExtent求交得到tempExtent——》获取tempExtent的空间矩形范围showExtent——》根据celCount,mapResolutionmapScale计算屏幕像素对应的地图距离showLen——》格网化分,根据showExtent和showLen计算横向和纵向格网数量——》双层for循环,用个网作为查询条件查询数据库在格网范围内的点集合,求取距离集合质心点最近的点返回——》最终返回一个点集合

  • 缺陷

使用格网将要查询的数据范围showExtent进行分割,在计算每个格网最终要显示的点时都需要调用一个数据库请求,在数据量大,像素数小的情况下,将显示范围在横向和纵向进行分割,最终的格网数量很多,反复调用数据库请求会造成该应用接口的性能很低,在控制器设置超时时间的情况下,后台没有返回数据,造成请求超时,后台出错的假象,最终的计算结果也展示不出来。

  • 优化

为了减少数据库请求的次数,使用存储过程!将格网的横向距离和纵向距离、横向数量和纵向数量、showExtent的左上坐标、数据表名作为存储过程的参数。存储过程的核心实现如图:

大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果

  • 效果展示:

大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果小比例尺下展示效果

大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果

大比例尺下展示效果

大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果

  • 性能测试

100,0000数据量的动态查询性能测试结果,时间:秒


层级(比例尺)

10(像素)

 

20(像素)

40(像素)

60(像素)

4508.93552506767

0.669

0.218

0.103

0.078

9017.87105013534

0.794

0.328

0.152

0.087

18035.7421002707

1.071

0.390

0.150

0.096

36071.4842005414

1.466

0.488

0.166

0.113

72142.9684010827

1.608

0.563

0.194

0.129

144285.936802165

1.711

0.587

0.211

0.163

288571.873604331

1.665

0.565

0.239

0.205

577143.7364428712

1.549

0.539

0.301

0.220

1154287.4728857423

1.728

0.737

0.387

0.337

2308574.9457714846

2.149

1.185

0.846

0.846

  • 总结

在考虑实现该需求的时候,一直都在考虑这个功能是点抽稀的效果还是点聚合的效果。最终的结果说不上是抽稀结果也谈不上聚合效果,但最终的结果实实在在的高效地实现了动态筛选数据并加载显示在Web端。在参考了高德和Wish3D做的聚合标注效果之后,搜索了一些点抽稀和点聚合的相关算法,觉得两者的实现和使用场景是有很大区别的。

首先,点抽稀的特征抽稀结果是较少点的数量,最终保留的点的坐标值仍然是原来的值。以地形高程采样点为例,矢量化原始采样点数据,在一些区域存在密集程度较高的采样点,统计该区域内的采样点的高程值,若该区域密集点的高程值在高程差范围内,在该比例尺该区域内则没有必要保留所有的采样点,需要对该区域内的高程点进行抽稀,通常会根据一些运算规则指定优先级,依据该优先级对高程差范围内的采样点进行抽稀,最终在能够表现该区域地形形态的基础上均匀地保留一些采样点,以便于高效的进行差值运算获得等高线、TIN和数字高程模型,最终能够保证通过地形分析获得最终想要的结果。

点的聚合在地图点的展示形态上和点抽稀直观的表现类似,大量的点在地图上能够动态且美观的展示的实现,其实是聚合的实现效果。

大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果

聚合结果要展示聚合区域内数据最全面的信息,而且又不产生重叠覆盖,动态比例尺下展示数据不仅需要保证地图展示效果,而且展示出的点位又说明了点位数据的空间分布特性,并且,最终的聚合点并不一定是原来数据中的点,有可能是通过聚合算法计算出的一个位置,这是与 点抽稀一个显著的差别!!!!

试想,如果在筛选外业测量的地形数据点时,使用了聚合算法,就很有可能造成接下来差值结果与真是结果相差甚远,接下来的地形分析也很有可能是错误的,这样产生的最终决策也就不具备的参考价值。

 

本博客为原创博客,拥有绝对版权,转载请标明源地址:https://blog.csdn.net/luojingweikai/article/details/88401201

参考:https://blog.csdn.net/yaoxiaochuang/article/details/50571957

           http://www.cnblogs.com/LBSer/p/4417127.html