背景
人们为了更好的描述一个东西,有一种将大化小的思路,比如时钟被分为了12个区域,每个区域表示一个小时,然后每个小的区域又被划分为更小的区域表示分钟。
在GIS系统中,也有类似的思想,比如将地图划分成网格。通过编码来简化地理位置的判断(比如相交,包含,距离计算等),但是请注意使用网格带来的问题,比如精度的问题,网格的大小决定了精度,又比如相对坐标的问题,可能无法描述清楚边界的归属。
PS:
1. 在PostGIS中虽然也支持网格对象的描述方式,但是并不是使用这种方法来进行几何运算(比如相交,包含,距离计算等),所以不存在类似的精度问题,个人建议没有强需求的话,不必做这样的网格转换。
PostgreSQL GIS索引的原理请参考
2. 如果是多种精度地图的切换(比如多个图层,每个图层代表一种地图精度),建议使用辐射的方式逐渐展开更精细的图层,以点为中心,逐渐辐射。(很多专业的地图软件是这样做的)
回到主题,还记得最强大脑的蜂巢迷宫吗?
还有勤劳的蜜蜂兄弟
我们接下来要做的就是如何将几何图形转换为网格对象。
回忆一下六边形的几何特性
首先要了解一下六边形的几何特性,提供转换的计算基础。
六边形可以切分为6个等边三角形
所以它的边长关系如下
面积计算
更多细节详见
将几何图形(sharp)转换为六边形网格
比如要将澳大利亚的版图,转换为六边形网格,
有两种方法,一种使用geotools的JAVA 类(在程序中转换),另一种是使用PostGIS插件的UDF(在数据库中转换)。
当然,如果PostgreSQL安装了pljava插件的话,那么也可以在PostgreSQL中调用geotools提供的java类进行转换。