网格剖分算法引擎手册

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_geonumString网格编码四进制网格码,例:"G0011302221030023"
geolevelInteger网格层级
数据类型名称说明
输出数据String网格编码00000101110010101001001100001011二进制网格编码

接口名称:网格编码的进制转换(二进制转四进制)

接口:binary_to_quaternary

接口说明: 将网格编码从二进制转换为四进制

参数名称数据类型名称是否必选项说明
输入参数b_geonumString网格编码二进制网格码,例:"00000101110010101001001100001011"
数据类型名称说明
输出数据String网格编码G0011302221030023四进制网格编码

接口名称:网格编码的进制转换(四进制转十进制)

接口:quaternary_to_decimal

接口说明: 将网格编码从四进制转换为十进制

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格码,例:"G0011302221030023"
数据类型名称说明
输出数据String网格编码417307590939115520-16十进制网格编码

接口名称:网格编码的进制转换(十进制转四进制)

接口:decimal_to_quaternary

接口说明: 将网格编码从十进制转换为四进制

参数名称数据类型名称是否必选项说明
输入参数d_geonumString网格编码十进制网格码,例:"417307590939115520-16"
数据类型名称说明
输出数据String网格编码G0011302221030023四进制网格编码

接口名称:网格编码地理含义真实性判断

接口:geographyMeanGeonum

接口说明:根据给定的网格编码,判断网格是否存在真实地理位置

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码十进制网格码,例:"417307590939115520-16"
数据类型名称说明
输出数据Boolean是否具备地理意义True/False并非所有网格码都具备地理意义

接口名称:网格编码(点)

接口:point

接口说明:将单个点经纬度转换网格编码

参数名称数据类型名称是否必选项说明
输入参数latDouble纬度
lngDouble经度
geolevelInteger网格层级
数据类型名称说明
输出数据String网格编码G00113023300110四进制网格编码

1662517499599


接口名称:网格编码(线)

接口:line

接口说明:将线经纬度数组转换网格编码

参数名称数据类型名称是否必选项说明
输入参数latsString纬度列表纬度列表以逗号分隔,如:String lats= "23.1886824727009,23.1813288385671,23.18099458247";
lngsString经度列表经度列表以逗号分隔,如:String lngs = "112.676393271507,112.722854868989,112.722854868989"
geolevelInteger网格层级
参数名称数据类型名称是否必选项说明
输入参数lat_listList<String>纬度列表
lng_listList<String>经度列表
geolevelInteger网格层级
数据类型名称说明
输出数据List<String>网格编码["G00113023300110","..."]四进制网格编码列表,注意下图中大网格是聚合后的结果

1662517626900


接口名称:网格编码(面)

接口:polygon

接口说明:将多边形经纬度数组转换网格编码

参数名称数据类型名称是否必选项说明
输入参数latsString纬度列表纬度列表以逗号分隔,且首尾相等,如:String lats= "23.1886824727009,23.1813288385671,23.18099458247,"23.1886824727009";
lngsString经度列表经度列表以逗号分隔,且首尾相等,如:String lngs = "112.676393271507,112.722854868989,112.722854868989,112.676393271507"
geolevelInteger网格层级
参数名称数据类型名称是否必选项说明
输入参数lat_listList<String>纬度列表
lng_listList<String>经度列表
geolevelInteger网格层级
数据类型名称说明
输出数据List<String>网格编码["G00113023300110","..."]四进制网格编码列表

1662517791776


接口名称:网格编码(geometry)

接口:geometry_code

接口说明:计算gdal的geometry对象的网格编码

参数名称数据类型名称是否必选项说明
输入参数geometryGeometrygeometry对象
geolevelInteger网格层级
数据类型名称说明
输出数据List<String>网格编码["G00113023300110","..."]四进制网格编码列表

接口名称:网格编码(面,带聚合)

接口:polygon_with_agg

接口说明:将geometry或polygon编码,返回结果带聚合效果

参数名称数据类型名称是否必选项说明
输入参数lat_listList<String>纬度列表
lng_listList<String>经度列表
geolevelInteger网格层级
数据类型名称说明
输出数据List<String>网格编码["G00113023300110","..."]四进制网格编码列表

image-20221008134237125


接口名称:网格编码(geometry,带聚合)

接口:geometry_with_agg

接口说明:计算gdal的geometry对象的网格编码,返回结果带聚合效果

参数名称数据类型名称是否必选项说明
输入参数geometryGeometrygeometry对象
geolevelInteger网格层级
数据类型名称说明
输出数据List<String>网格编码["G00113023300110","..."]四进制网格编码列表


接口名称:计算网格编码中心经纬度

接口:center_point

接口说明:计算单个网格编码的中心经纬度

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
数据类型名称说明
输出数据Map<String,Double>中心经纬度{lng=112.67944444444444, lat=23.162777777777777}

1662517406123


接口名称:计算网格编码的定位点

接口:location_point

接口说明:计算网格编码的定位点(左下坐标)

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
数据类型名称说明
输出数据Map<String,Double>左下角经纬度{min_lng=112.67555555555556, min_lat=23.15888888888889}

1662517355626


接口名称:计算网格范围

接口:scope_of_geonum

接口说明:根据给定网格编码,计算该网格编码的范围

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
数据类型名称说明
输出数据Map<String,Double>四角点经纬度{lbLng=112.67555555555556, rtLat=23.166666666666668, lbLat=23.15888888888889, rtLng=112.68333333333334}左下角、右上角经纬度

接口名称:子网格编码

接口:child_geo_num

接口说明:根据网格编码、指定层级,返回其指定层级的子网格编码

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
child_levelInteger子网格层级child_level > geo_level
数据类型名称说明
输出数据List<String>子网格列表["G00113022210300230000" , ...]q_geonum的指定层级子网格列表

接口名称:父网格编码

接口:parent_geo_num

接口说明:根据网格编码、指定层级,返回其指定层级的父网格编码

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
parent_levelInteger父网格层级parent_level < geo_level
数据类型名称说明
输出数据String网格编码"G00113022"q_geonum的指定层级父网格编码

接口名称:网格聚合

接口:aggregation_by_geonum

接口说明:给定同一层级的多个网格编码,将其聚合成多个层级的父网格编码

参数名称数据类型名称是否必选项说明
输入参数q_geonum_listList<String>网格编码四进制网格编码列表,如下图

1662517127510

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

1662517149372


接口名称:网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级)

接口: outer_rectangle_geo_num_list

接口说明:网格集最小外包矩形对应面片(面片可能数量1~4个,输出网格面片和对应层级)

参数名称数据类型名称是否必选项说明
输入参数q_geonum_listList<String>网格编码列表四进制网格编码列表
数据类型名称说明
输出数据List<String>网格编码[G0011302221021, G0011302221030]最小外包矩阵面片网格码
Integer网格层级13最小外包矩阵面片网格层级

1662518588904


接口名称:网格的4邻域

接口: adjoin4_geo_num

接口说明:根据给定的网格,返回网格相邻(北、南、西、东)的4个邻域网格

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
数据类型名称说明
输出数据List<String>网格编码[G0011302221030201, G0011302221030021, G0011302221030022, G0011302221030032](北、南、西、东)的4个邻域网格

1662519055405


接口名称:网格的8邻域

接口: adjoin8_geo_num

接口说明:根据给定的网格,返回网格相邻(:0-北,1-东北,2-东,3-东南,4-南,5-西南,6-西,7-西北)的8个邻域网格

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码
数据类型名称说明
输出数据List<String>网格编码[G0011302221030201, G0011302221030210, G0011302221030032, G0011302221030030, G0011302221030021, G0011302221030020, G0011302221030022, G0011302221030200]0-北,1-东北,2-东,3-东南,4-南,5-西南,6-西,7-西北)的8个邻域网格

1662519189703


接口名称:计算矩形覆盖网格的经线数组和纬线数组

接口: show_geo_num

接口说明:根据给定的矩形区域,返回矩形覆盖网格的经线数组和纬线数组

参数名称数据类型名称是否必选项说明
输入参数min_latDouble左下角纬度
min_lngDouble左下角经度
max_latDouble右上角纬度
max_lngDouble右上角经度
geolevelInteger网格层级
数据类型名称说明
输出数据List<Double>给定范围内的纬线lats升序排列
List<Double>给定范围内的经线lons升序排列

接口名称:网格转换为行列序号

接口:q_geonum_2_rowcol

接口说明:根据给定的网格编码,返回对应层级的行列序号

参数名称数据类型名称是否必选项说明
输入参数q_geonumString网格编码四进制网格编码,如"G00000000022133210102203"
数据类型名称说明
输出数据Map<String, Long>网格码所在层级的行列号{col=3521, row=13213}

接口名称:行列序号转换为网格

接口:row_col_to_q_geonum

接口说明:根据给定的行列序号,返回对应层级的网格编码

参数名称数据类型名称是否必选项说明
输入参数rowLong行号Long row = new Long(13213)
colLong列号Long col = new Long(3521)
geolevelInteger网格层级int geolevel = 23
数据类型名称说明
输出数据Map<String, Long>给定层级所在行列号对应的网格编码G00000000022133210102203

接口名称:网格编码排序(按编码值)

接口:sort_asc_geo_num_list

接口说明:网格码升序排序

参数名称数据类型名称是否必选项说明
输入参数q_geonum_listList<String>四进制网格码四进制网格码列表
数据类型名称说明
输出数据List<String>四进制网格码升序排序后的四进制网格码列表

接口名称:计算最大网格码

接口:get_max_geonum

接口说明:计算geonum_range的最大值

参数名称数据类型名称是否必选项说明
输入参数d_geonumString十进制网格码
数据类型名称说明
输出数据String十进制网格码返回不带-的十进制网格码

接口名称:计算网格面积

接口:area_geo_num

接口说明:计算网格的面积

参数名称数据类型名称是否必选项说明
输入参数q_geonumString四进制网格码
数据类型名称说明
输出数据Double网格的面积单位:平方米

接口名称:计算网格周长

接口:circumference_geo_num

接口说明:计算网格的周长

参数名称数据类型名称是否必选项说明
输入参数q_geonumString四进制网格码
数据类型名称说明
输出数据Double网格的周长单位:米

接口名称:点的缓冲区域

接口:point_buffer

接口说明:计算单个点的缓冲区域

参数名称数据类型名称是否必选项说明
输入参数latDouble纬度
lngDouble经度
geolevelInteger网格层级
distanceDouble缓冲区距离单位:米
数据类型名称说明
输出数据List<String>网格码列表缓冲区范围内的网格码列表

image-20220920181822488


1.4 数据导入接口说明

接口名称:矢量数据导入

接口:vectorfile

接口说明:加载矢量数据后进行网格编码

参数名称数据类型名称是否必选项说明
输入参数shp_pathString网格编码例:ssh_tdlyxz_polygon.shp
geolevelInteger网格层级
数据类型名称说明
输出数据List<JSONObject>geojsongeojson数据格式列表逐个要素为单位存放在列表中
List<List<String>>geonum网格编码列表逐个要素为单位存放在列表中
List<Map<String,Object>>data矢量属性表数据列表逐个要素为单位存放在列表中

1662520806844

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);
    }
    

1662517127510

不同层级网格码大小相同