大数据量点的地图展示,借助PostGIS实现动态点抽稀/聚合效果
目录
-
需求场景
Web端通过地图范围变化事件,动态请求加载空间数据库中的点数据进行展示,指定的屏幕像素范围内,在不同的地图缩放级别显示不同数量的点(大比例尺下展示较多的点,表比例尺下加载一些特征点展示),从而使Web页面能够更为美观的展示数据。
-
技术点
聚合算法,屏幕像素转地图距离、PostGIS、查询优化、存储过程
-
接口参数
在此需求下,前端要调用服务接口,需要传入指定的像素celCount,当前地图分辨率mapResolution,当前地图比例尺mapScale,要查询的数据库表名tableName。考虑到查询返回一些点并不在当前屏幕显示的地图范围内,为避免显示这些多余的点而造成浏览器压力,可将当前地图范围作为查询条件,因此,还需要传入一个当前地图范围参数mapExtent。
-
实现流程
获取数据表的空间范围tableExtent——》与mapExtent求交得到tempExtent——》获取tempExtent的空间矩形范围showExtent——》根据celCount,mapResolution和mapScale计算屏幕像素对应的地图距离showLen——》格网化分,根据showExtent和showLen计算横向和纵向格网数量——》双层for循环,用个网作为查询条件查询数据库在格网范围内的点集合,求取距离集合质心点最近的点返回——》最终返回一个点集合
-
缺陷
使用格网将要查询的数据范围showExtent进行分割,在计算每个格网最终要显示的点时都需要调用一个数据库请求,在数据量大,像素数小的情况下,将显示范围在横向和纵向进行分割,最终的格网数量很多,反复调用数据库请求会造成该应用接口的性能很低,在控制器设置超时时间的情况下,后台没有返回数据,造成请求超时,后台出错的假象,最终的计算结果也展示不出来。
-
优化
为了减少数据库请求的次数,使用存储过程!将格网的横向距离和纵向距离、横向数量和纵向数量、showExtent的左上坐标、数据表名作为存储过程的参数。存储过程的核心实现如图:
-
效果展示:
小比例尺下展示效果
大比例尺下展示效果
-
性能测试
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和数字高程模型,最终能够保证通过地形分析获得最终想要的结果。
点的聚合在地图点的展示形态上和点抽稀直观的表现类似,大量的点在地图上能够动态且美观的展示的实现,其实是聚合的实现效果。
聚合结果要展示聚合区域内数据最全面的信息,而且又不产生重叠覆盖,动态比例尺下展示数据不仅需要保证地图展示效果,而且展示出的点位又说明了点位数据的空间分布特性,并且,最终的聚合点并不一定是原来数据中的点,有可能是通过聚合算法计算出的一个位置,这是与 点抽稀一个显著的差别!!!!
试想,如果在筛选外业测量的地形数据点时,使用了聚合算法,就很有可能造成接下来差值结果与真是结果相差甚远,接下来的地形分析也很有可能是错误的,这样产生的最终决策也就不具备的参考价值。
本博客为原创博客,拥有绝对版权,转载请标明源地址:https://blog.csdn.net/luojingweikai/article/details/88401201
参考:https://blog.csdn.net/yaoxiaochuang/article/details/50571957
http://www.cnblogs.com/LBSer/p/4417127.html
转载自:https://blog.csdn.net/luojingweikai/article/details/88401201