(JAVA)全球格网图幅编号计算&基于图幅进行GIS数据切瓦片的思路

本篇就是随便写的,想到哪写到哪,不谈什么算法和源码,就是看效果,先看张图:


 

上面的格网(矢量图层)是采用1:25W的比例尺计算而来的

 


标准的比例尺总过有8种,如下:


       首先我们要想要对江浙沪皖(江苏,浙江、安徽和上海四个行政区划)的矢量或影像进行切图(瓦片)操作,(本篇QGIS中的图层是矢量数据,影像同理)我们有两种切法,第一种就是按shp图层的外接矩形来算瓦片的xyz,因为通过地图缩放层级(zoom)和范围(envelope)很容易就能算出瓦片的张数,并通过瓦片的xyz去计算和渲染瓦片结果,比如,我代码中对shp数据的读取解析可以知道其范围如下:



知道范围后,我们就可以算出在16地图缩放层级下,江浙沪皖的(矢量)栅格瓦片一共有多少张了,如下:

 


剩下的就是基于单张瓦片的xyz换算成具体的经纬度去计算,去切图了,比如,我们以其中一个xyz瓦片为例,如下:

 

 

{"type":"Polygon","coordinates":[[[114.8730469,35.1199086],[114.8730469,35.1244016],[114.87854,35.1244016],[114.87854,35.1199086],[114.8730469,35.1199086]]]}

 将这张瓦片的范围添加到QGIS中,叠加图层效果如下:

 


 

如果16缩放级别太大,看不出来瓦片和实际数据区域的"距离"效果的话,那我们就来个8级吧,重复计算,这次我们取一个落在数据区内的瓦片为例,如下:

 


瓦片范围:

{"type":"Polygon","coordinates":[[[118.125,29.5352296],[118.125,30.7512778],[119.53125,30.7512778],[119.53125,29.5352296],[118.125,29.5352296]]]}

添加到QGSI中,图层效果如下:

 


 

上面基于数据本身范围去计算xyz瓦片的方式有点"粗暴",甚至有点"浪费"计算资源,而下面要说的基于标准图幅切图的方式却是很"巧妙"的,比如上面我们是按照比例尺1:25w进行分幅的,可以明显看出来,这些区域其实是没有数据的,那么没有数据的格网(图幅)我们大可不必去理会(计算瓦片),如下:

 

 


上图中用黄色乱笔圈出来的图幅就是我们"无需理会"的区域,因为这些区域并没有和真实的行政区划数据有任何半毛线的关系,相反其余都是需要我们去关注的有效数据区域;通过对比我们发现,采用图幅切分法不仅会计算资源,同时也避免了无效数据的物理存储空间的浪费,因为有可能那些没有数据的区域经过切片计算渲染后的图片还要保存在磁盘上或mongodb、或sqlite或redis中...etc

 

当然,如果你比例尺越小(单个图幅所表示的面积等比缩小,但是相比较地图缩放层级而言,同比例尺下的图幅面积是固定的),就意味着单个图幅的面积缩小了,自然图幅所表示的范围就变小了,范围变小了也就意味着计算得出的瓦片范围越小,瓦片越小,越能反映出和实体数据的"相交"问题,也就是越"细致",不信的话,我就再来个1:2.5W比例尺下的分幅计算结果贴上去看下效果,如下:

 



 


添加到QGIS中效果如下:

 


91卫图·I50F023023图幅
XX卫图·I50F023023图幅

从上图我们可以看出,如果按照比例尺1:2.5w的图幅去切瓦片的话,会更加的精细,比如我们拿其中一个图幅编号(除了1:100W的图幅不是10位以外,其余都是10位):I50F023023来举例,首先我们先算出这个图幅的范围是多少,如下:

 

{"type":"Polygon","coordinates":[[[116.75,34.0833333],[116.75,34.1666667],[116.875,34.1666667],[116.875,34.0833333],[116.75,34.0833333]]]}

叠加到QGIS中图层整体效果如下:


OK,确认了图幅范围没问题后,我们基于该图幅的范围进行不同层级下的瓦片计算,如下:

 

 


得到瓦片的数量后,其实我们就已经知道每张瓦片的xy(行列号)了,知道了xy后,瓦片的范围就知道了,瓦片的范围知道了,理所当然我们就可以拿着瓦片的范围去计算瓦片中包含了多少像元、多少要素了;像元是针对影像数据而言的,像元有波段,波段有数据,通过波段分别映射RGBA色彩值,稍加处理就可以渲染成栅格PNG了;而要素是基于矢量数据而言的,知道了要素,就可以绘制点线面了,剩下的同理是渲染成栅格PNG或矢量瓦片的PB(google protocol buffers)流了

为了更加直观的看到不同层级下的瓦片的效果,我特意将16层级下,在图幅编号为I50F023023的范围下所计算出来的所有瓦片的范围写进了一个shp文件里,如下:

 


叠加到QGIS中效果如下:

 


剩下的就不多说了,有了上面的基础后,下面就可以嗨皮的搞切图任务了,管你是单机器单节点单线程单任务跑,还是多机器多节点集群跑亦或是单机器多线程跑,问题都是不大的,当然影像数据的波段拉伸、nodata值过滤及矢量栅格瓦片前期的样式渲染等也都是制作瓦片时需要考虑的问题,单总体来讲,还好,还好,还好?

 

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值