网格剖分算法引擎手册
GDS网格数据引擎手册
1. 网格数据引擎
网格数据引擎包括:GeoSOT2D全球空间二维剖分网格编码及数据的导入。 有关GeoSOT2D网格剖分算法,请参考地球空间参考网格系统建设初探。
1.1 功能列表
受限于机器内存,函数输出网格数过多时,存在内存溢出风险,请合理输入参数。例如:GeoSOT2D网格编码:网格编码(矩形),网格编码(多边形)等
网格数据引擎提供JDK接口访问方式,属于Geosot2d类。软件功能列表说明如下。
| 软件功能项目 | 功能说明 | 函数名称 |
|---|---|---|
| 四进制转二进制 | 将网格编码从四进制转换为二进制 | quaternary_to_binary |
| 二进制转四进制 | 将网格编码从二进制转换为四进制 | binary_to_quaternary |
| 四进制转十进制 | 将网格编码从四进制转换为十进制 | quaternary_to_decimal |
| 十进制转四进制 | 将网格编码从十进制转换为四进制 | decimal_to_quaternary |
| 网格编码地理含义真实性判断 | 根据给定的网格编码,判断网格是否存在真实地理位置 | geographyMeanGeonum |
| 网格编码(点) | 将单个点经纬度转换网格编码 | point |
| 网格编码(线) | 将线经纬度数组转换网格编码 | line |
| 网格编码(面) | 将多边形经纬度数组转换网格编码 | polygon |
| 网格编码(面,带聚合) | 将geometry或polygon编码,返回结果带聚合效果 | polygon_with_agg |
| 网格编码(geometry) | 计算gdal的geometry对象的网格编码 | geometry_code |
| 网格编码(geometry,带聚合) | 计算gdal的geometry对象的网格编码,返回结果带聚合效果 | geometry_with_agg |
| 计算网格编码中心经纬度 | 计算单个网格编码的中心经纬度 | center_point |
| 计算网格编码的定位点 | 计算网格编码的定位点(左下坐标) | location_point |
| 计算网格范围 | 根据给定网格编码,计算该网格编码的范围 | scope_of_geonum |
| 子网格编码 | 根据网格编码、指定层级,返回其指定层级的子网格编码 | child_geo_num |
| 父网格编码 | 根据网格编码、指定层级,返回其指定层级的父网格编码 | parent_geo_num |
| 网格聚合 | 给定同一层级的多个网格编码,将其聚合成多个层级的父网格编码 | aggregation_by_geonum |
| 网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级) | 网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级) | outer_rectangle_geo_num_list |
| 网格的4邻域 | 根据给定的网格,返回网格相邻(北、南、西、东)的4个邻域网格 | adjoin4_geo_num |
| 网格的8邻域 | 根据给定的网格,返回网格相邻(:0-北,1-东北,2-东,3-东南,4-南,5-西南,6-西,7-西北)的8个邻域网格 | adjoin8_geo_num |
| 计算矩形覆盖网格的经线数组和纬线数组 | 根据给定的矩形区域,返回矩形覆盖网格的经线数组和纬线数组 | show_geo_num |
| 网格转换为行列序号 | 根据给定的网格编码,返回对应层级的行列序号 | q_geonum_2_rowcol |
| 行列序号转换为网格 | 根据给定的行列序号,返回对应层级的网格编码 | row_col_to_q_geonum |
| 网格编码排序(按编码值) | 网格码升序排序 | sort_asc_geo_num_list |
| 计算最大网格码 | 计算geonum_range的最大值 | get_max_geonum |
| 计算网格面积 | 计算网格的面积 | area_geo_num |
| 计算网格周长 | 计算网格的周长 | circumference_geo_num |
| 点的缓冲区域 | 计算单个点的缓冲区域 | point_buffer |
网格数据引擎提供开放源码作数据存储与管理,属于DataManage类,数据管理说明列表如下。
| 数据管理项目 | 功能说明 | 函数名称 |
|---|---|---|
| 矢量数据导入 | 解析shp矢量数据 | vectorfile |
1.2 GeoSOT2D 网格编码接口说明
| 接口描述说明 | |
|---|---|
| 输入格式 | 函数都是以四进制网格码作参数,字符串格式,如“G0011302221030023";列表格式List <String> |
| 经度描述 | 数据类型为浮点数,取值范围[-180,180] |
| 纬度描述 | 数据类型为浮点数,取值范围[-90,90] |
| 网格层级 | 数据类型为整数,取值范围[1,32] |
| 二进制网格编码 | 数据类型为字符串,网格编码长度范围[2,64],并且长度是2的整数倍,每位编码的取值范围为[0,1] |
| 四进制网格编码 | 数据类型为字符串,网格编码长度范围[1,32],每位编码的取值范围为[0,3] |
| 十进制网格编码 | 数据类型为长整型数 |
1.3 GeoSOT2D 接口详细说明
接口名称:网格编码的进制转换(四进制转二进制)
接口:quaternary_to_binary
接口说明:将网格编码从四进制转换为二进制
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格码,例:"G0011302221030023" |
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | 00000101110010101001001100001011 | 二进制网格编码 |
接口名称:网格编码的进制转换(二进制转四进制)
接口:binary_to_quaternary
接口说明: 将网格编码从二进制转换为四进制
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | b_geonum | String | 网格编码 | 是 | 二进制网格码,例:"00000101110010101001001100001011" |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | G0011302221030023 | 四进制网格编码 |
接口名称:网格编码的进制转换(四进制转十进制)
接口:quaternary_to_decimal
接口说明: 将网格编码从四进制转换为十进制
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格码,例:"G0011302221030023" |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | 417307590939115520-16 | 十进制网格编码 |
接口名称:网格编码的进制转换(十进制转四进制)
接口:decimal_to_quaternary
接口说明: 将网格编码从十进制转换为四进制
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | d_geonum | String | 网格编码 | 是 | 十进制网格码,例:"417307590939115520-16" |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | G0011302221030023 | 四进制网格编码 |
接口名称:网格编码地理含义真实性判断
接口:geographyMeanGeonum
接口说明:根据给定的网格编码,判断网格是否存在真实地理位置
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 十进制网格码,例:"417307590939115520-16" |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Boolean | 是否具备地理意义 | True/False | 并非所有网格码都具备地理意义 |
接口名称:网格编码(点)
接口:point
接口说明:将单个点经纬度转换网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lat | Double | 纬度 | 是 | |
| lng | Double | 经度 | 是 | ||
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | G00113023300110 | 四进制网格编码 |

接口名称:网格编码(线)
接口:line
接口说明:将线经纬度数组转换网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lats | String | 纬度列表 | 是 | 纬度列表以逗号分隔,如:String lats= "23.1886824727009,23.1813288385671,23.18099458247"; |
| lngs | String | 经度列表 | 是 | 经度列表以逗号分隔,如:String lngs = "112.676393271507,112.722854868989,112.722854868989" | |
| geolevel | Integer | 网格层级 | 是 |
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lat_list | List<String> | 纬度列表 | 是 | |
| lng_list | List<String> | 经度列表 | 是 | ||
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | ["G00113023300110","..."] | 四进制网格编码列表,注意下图中大网格是聚合后的结果 |

接口名称:网格编码(面)
接口:polygon
接口说明:将多边形经纬度数组转换网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lats | String | 纬度列表 | 是 | 纬度列表以逗号分隔,且首尾相等,如:String lats= "23.1886824727009,23.1813288385671,23.18099458247,"23.1886824727009"; |
| lngs | String | 经度列表 | 是 | 经度列表以逗号分隔,且首尾相等,如:String lngs = "112.676393271507,112.722854868989,112.722854868989,112.676393271507" | |
| geolevel | Integer | 网格层级 | 是 |
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lat_list | List<String> | 纬度列表 | 是 | |
| lng_list | List<String> | 经度列表 | 是 | ||
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | ["G00113023300110","..."] | 四进制网格编码列表 |

接口名称:网格编码(geometry)
接口:geometry_code
接口说明:计算gdal的geometry对象的网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | geometry | Geometry | geometry对象 | 是 | |
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | ["G00113023300110","..."] | 四进制网格编码列表 |
接口名称:网格编码(面,带聚合)
接口:polygon_with_agg
接口说明:将geometry或polygon编码,返回结果带聚合效果
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lat_list | List<String> | 纬度列表 | 是 | |
| lng_list | List<String> | 经度列表 | 是 | ||
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | ["G00113023300110","..."] | 四进制网格编码列表 |

接口名称:网格编码(geometry,带聚合)
接口:geometry_with_agg
接口说明:计算gdal的geometry对象的网格编码,返回结果带聚合效果
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | geometry | Geometry | geometry对象 | 是 | |
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | ["G00113023300110","..."] | 四进制网格编码列表 |

接口名称:计算网格编码中心经纬度
接口:center_point
接口说明:计算单个网格编码的中心经纬度
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Map<String,Double> | 中心经纬度 | {lng=112.67944444444444, lat=23.162777777777777} |

接口名称:计算网格编码的定位点
接口:location_point
接口说明:计算网格编码的定位点(左下坐标)
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Map<String,Double> | 左下角经纬度 | {min_lng=112.67555555555556, min_lat=23.15888888888889} |

接口名称:计算网格范围
接口:scope_of_geonum
接口说明:根据给定网格编码,计算该网格编码的范围
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Map<String,Double> | 四角点经纬度 | {lbLng=112.67555555555556, rtLat=23.166666666666668, lbLat=23.15888888888889, rtLng=112.68333333333334} | 左下角、右上角经纬度 |
接口名称:子网格编码
接口:child_geo_num
接口说明:根据网格编码、指定层级,返回其指定层级的子网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| child_level | Integer | 子网格层级 | 是 | child_level > geo_level |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 子网格列表 | ["G00113022210300230000" , ...] | q_geonum的指定层级子网格列表 |
接口名称:父网格编码
接口:parent_geo_num
接口说明:根据网格编码、指定层级,返回其指定层级的父网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| parent_level | Integer | 父网格层级 | 是 | parent_level < geo_level |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 网格编码 | "G00113022" | q_geonum的指定层级父网格编码 |
接口名称:网格聚合
接口:aggregation_by_geonum
接口说明:给定同一层级的多个网格编码,将其聚合成多个层级的父网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum_list | List<String> | 网格编码 | 是 | 四进制网格编码列表,如下图 |

| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 聚合后网格码列表 | 聚合后网格码列表,如下图 |

接口名称:网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级)
接口: outer_rectangle_geo_num_list
接口说明:网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级)
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum_list | List<String> | 网格编码列表 | 是 | 四进制网格编码列表 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | [G0011302221021, G0011302221030] | 最小外包矩阵面片网格码 |
| Integer | 网格层级 | 13 | 最小外包矩阵面片网格层级 |

接口名称:网格的4邻域
接口: adjoin4_geo_num
接口说明:根据给定的网格,返回网格相邻(北、南、西、东)的4个邻域网格
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | [G0011302221030201, G0011302221030021, G0011302221030022, G0011302221030032] | (北、南、西、东)的4个邻域网格 |

接口名称:网格的8邻域
接口: adjoin8_geo_num
接口说明:根据给定的网格,返回网格相邻(:0-北,1-东北,2-东,3-东南,4-南,5-西南,6-西,7-西北)的8个邻域网格
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格编码 | [G0011302221030201, G0011302221030210, G0011302221030032, G0011302221030030, G0011302221030021, G0011302221030020, G0011302221030022, G0011302221030200] | 0-北,1-东北,2-东,3-东南,4-南,5-西南,6-西,7-西北)的8个邻域网格 |

接口名称:计算矩形覆盖网格的经线数组和纬线数组
接口: show_geo_num
接口说明:根据给定的矩形区域,返回矩形覆盖网格的经线数组和纬线数组
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | min_lat | Double | 左下角纬度 | 是 | |
| min_lng | Double | 左下角经度 | 是 | ||
| max_lat | Double | 右上角纬度 | 是 | ||
| max_lng | Double | 右上角经度 | 是 | ||
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<Double> | 给定范围内的纬线 | lats | 升序排列 |
| List<Double> | 给定范围内的经线 | lons | 升序排列 |
接口名称:网格转换为行列序号
接口:q_geonum_2_rowcol
接口说明:根据给定的网格编码,返回对应层级的行列序号
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 网格编码 | 是 | 四进制网格编码,如"G00000000022133210102203" |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Map<String, Long> | 网格码所在层级的行列号 | {col=3521, row=13213} |
接口名称:行列序号转换为网格
接口:row_col_to_q_geonum
接口说明:根据给定的行列序号,返回对应层级的网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | row | Long | 行号 | 是 | Long row = new Long(13213) |
| col | Long | 列号 | 是 | Long col = new Long(3521) | |
| geolevel | Integer | 网格层级 | 是 | int geolevel = 23 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Map<String, Long> | 给定层级所在行列号对应的网格编码 | G00000000022133210102203 |
接口名称:网格编码排序(按编码值)
接口:sort_asc_geo_num_list
接口说明:网格码升序排序
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum_list | List<String> | 四进制网格码 | 是 | 四进制网格码列表 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 四进制网格码 | 升序排序后的四进制网格码列表 |
接口名称:计算最大网格码
接口:get_max_geonum
接口说明:计算geonum_range的最大值
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | d_geonum | String | 十进制网格码 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | String | 十进制网格码 | 返回不带-的十进制网格码 |
接口名称:计算网格面积
接口:area_geo_num
接口说明:计算网格的面积
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 四进制网格码 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Double | 网格的面积 | 单位:平方米 |
接口名称:计算网格周长
接口:circumference_geo_num
接口说明:计算网格的周长
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | q_geonum | String | 四进制网格码 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | Double | 网格的周长 | 单位:米 |
接口名称:点的缓冲区域
接口:point_buffer
接口说明:计算单个点的缓冲区域
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | lat | Double | 纬度 | 是 | |
| lng | Double | 经度 | 是 | ||
| geolevel | Integer | 网格层级 | 是 | ||
| distance | Double | 缓冲区距离 | 是 | 单位:米 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<String> | 网格码列表 | 缓冲区范围内的网格码列表 |

1.4 数据导入接口说明
接口名称:矢量数据导入
接口:vectorfile
接口说明:加载矢量数据后进行网格编码
| 参数名称 | 数据类型 | 名称 | 是否必选项 | 说明 | |
|---|---|---|---|---|---|
| 输入参数 | shp_path | String | 网格编码 | 是 | 例:ssh_tdlyxz_polygon.shp |
| geolevel | Integer | 网格层级 | 是 |
| 数据类型 | 名称 | 值 | 说明 | |
|---|---|---|---|---|
| 输出数据 | List<JSONObject> | geojson | geojson数据格式列表 | 逐个要素为单位存放在列表中 |
| List<List<String>> | geonum | 网格编码列表 | 逐个要素为单位存放在列表中 | |
| List<Map<String,Object>> | data | 矢量属性表数据列表 | 逐个要素为单位存放在列表中 |

2. 常见问题说明
2.1 关于网格码层级说明问题
对于四进制网格码 q_geonum,G后有多少位四进制数就代表了多少层级。如:G0000000002213321010220,G后面有22位四进制数,则该网格码的默认层级是22。
2.2 关于网格大小不一致问题
如图,该20层级网格码每间隔一段距离会产生网格大小不一致的现象。其原因在于网格码在分级与秒级网格从60扩展到64,其中6164分、6164秒属于不具备实际地理意义的范围,会进行裁切。如下图,右上角红色方框是网格码原本的大小,在裁去无效区域后网格码只剩绿色方框部分。
- 在多少级网格会出现这种情况?
答: 大于等于10级时。
网格码由32级组成,其中
第0级:G代表了全球区域。大小为[-512,512]。
第1级:定位码。[0,1,2,3]分别代表[东北,西北,东南,西南]半球。
第2~9级(8bit):,度级。具备地理意义的经度[-180,180],纬度[-90,90],其中网格码将其扩展到[-256,256]大小,超出区域的是不具备地理意义的。
第10~15级(6bit):分级。具备地理意义的分级度数是[0,60),网格码将其扩展到[0,63],超出区域的[60,63]是不具备地理意义的。
第16~21级(6bit):秒级。具备地理意义的秒级度数是[0,60),网格码将其扩展到[0,63],超出区域的[60,63]是不具备地理意义的。
第22~32级(11bit):秒以下。可表示的范围是[0,2048],若该级别的网格码在分级与秒级的部分具备地理意义,则秒以下部分的网格码必然具备地理意义。
综上,当网格层级大于等于10级的时候就会有无效网格码的出现。
一般来说,度级的无效网格码是容易判断的,而分级与秒级的判断需要一些技巧。
分级与秒级有6位2进制网格码。其表示的十进制范围是[0,2^6]即[0,64],然而[60,64]属于无效区域,即二进制的前四位是1111的情况下属于无效网格。
-
当出现不规则剖分的情况时,如何计算网格大小
答:将原始尺寸减去无效范围后即可。
当规则剖分时,每一个层级的网格面片大小是一致的,假定计算方法为 f ( level )。
计算网格码的左下角定位点(lbPoint)后,加上面片的尺寸 f ( level )就能得到右上角定位点(rtPoint),此时原始尺寸计算完成。
判断右上角经纬度与左下角经纬度,当发现右上角经纬度比左下角的度级部分大时(分级、秒级往上进位),那么一定发生了网格码越界到无效网格的情况[60,64)。此时右上角经纬度进行取整操作防止进位即可。
int lng_l = (int)Math.floor(min_lng); int lng_r = (int)Math.floor(max_lng); int lat_b = (int)Math.floor(min_lat); int lat_t = (int)Math.floor(max_lat); if(lng_l < lng_r){ // 进位越界 max_lng = (int)Math.floor(max_lng); } if(lat_b < lat_t) { // // 进位越界 max_lat = (int) Math.floor(max_lat); }

