com.supermap.data
类 SpatialGridCoding

java.lang.Object
  继承者 com.supermap.data.SpatialGridCoding

public class SpatialGridCoding
extends java.lang.Object

空间网格编码类,该类提供对几何对象进行网格编码的功能。

网格编码可以根据《地球空间格网编码规则_GB_T 40087-2021》、《北斗网格位置码 GB/T 39409-2020》、《基础地理实体空间身份编码规则》等文件作为规范,将空间几何对象统一剖分成不同尺度的网格单元,并按统一编码规则进行标识和表达,从而为构建网格化的地球空间数据组织提供参考框架。


方法摘要
static java.lang.String beidouGridEncode(Geometry geometry)
          对指定的几何对象进行北斗二维网格位置编码 ,返回对应的二维网格位置码。
static java.lang.String beidouGridEncode3D(Geometry3D geometry3D)
          对指定的几何对象进行北斗三维网格位置编码 ,返回对应的三维网格位置码。
static java.lang.String geoEntityEncode(Geometry geometry)
          对指定的几何对象进行地理实体二维网格编码 ,返回对应的二维网格位置码。
static java.lang.String geoEntityEncode3D(Geometry3D geometry3D)
          对指定的三维几何对象进行地理实体编码 ,返回对应的三维网格位置码。
static java.lang.String geoSOTEncode(Geometry geometry)
          对几何对象进行基于GeoSOT的二维编码 ,返回对应的四进制网格编码。
static java.lang.String[] geoSOTEncode3D(Geometry3D geometry3D)
          对几何对象进行基于GeoSOT的三维编码 ,返回对应的四进制网格编码和高度域编码。
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法详细信息

geoSOTEncode

public static java.lang.String geoSOTEncode(Geometry geometry)
对几何对象进行基于GeoSOT的二维编码 ,返回对应的四进制网格编码。

该方法基于GeoSOT全球剖分模型,对几何对象所在的地球空间从经度、纬度两个方向进行剖分,找到几何对象所对应的网格编码。详细剖分及编码方法可参考《地球空间格网编码规则_GB_T 40087-2021》。

实现思路:

  1. 计算二维表达形式几何对象的最小外包矩形;
  2. 对比最小外包矩形的空间范围与各级网格单元的空间范围,获取可包含该最小外包矩形的最小网格单元所在层级 L(点对象会计算到32级);
  3. 判断该几何对象是否穿越 L-1 级以上的网格单元边界:
    1. 如未穿越,则以包含该几何对象的最小外包矩形左上角点和右下角点为基准,分别对两角点进行编码,以级为单位,取二者编码相同的部分。
    2. 如穿越,则以该几何对象的几何中心点为基准,对中心点进行由 1级至L级的编码;如该几何对象的几何中心点位于层级 L以上的格网边界,则以该结点右(上)侧格网作为该结点所在格网进行位置码编码。

      参数:
      geometry - 待编码对象,支持二维点、线、面和三维点、线、面、三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
      返回:
      以G开头的GeoSOT四进制二维网格编码。如果几何对象的经纬度超出范围,则返回为空。
      示例:
      以下代码示范了如何对面对象进行GeoSOT二维网格编码。
       public void testGeoSOTRegion2D() {
          Point2D point2D1 = new Point2D(126.48140951545128, 44.026401382119857);
          Point2D point2D2 = new Point2D(126.48140951366125, 44.026401380945153);
          Point2D point2D3 = new Point2D(126.60222928452474, 44.054986997893629);
          Point2D point2D4 = new Point2D(126.66857127909265, 44.022034532615365);
          Point2D point2D5 = new Point2D(126.70950326696368, 43.957012667582525);
          Point2Ds pntsRegion = new Point2Ds();
      
          pntsRegion.add(point2D1);
          pntsRegion.add(point2D2);
          pntsRegion.add(point2D3);
          pntsRegion.add(point2D4);
          pntsRegion.add(point2D5);
          pntsRegion.add(point2D1);
      
          GeoRegion geoRegion = new GeoRegion();
          geoRegion.addPart(pntsRegion);
      
          String code = SpatialGridCoding.geoSOTEncode(geoRegion);
          System.out.println("二维空间编码:" + code);
           //执行结果为:
       二维空间编码:G00131331010  编码结果表明完全包围该几何对象的最小网格剖分层级为第11级
       } 

geoSOTEncode3D

public static java.lang.String[] geoSOTEncode3D(Geometry3D geometry3D)
对几何对象进行基于GeoSOT的三维编码 ,返回对应的四进制网格编码和高度域编码。

该方法基于GeoSOT全球剖分模型,对几何对象所在的地球空间从经度、纬度、大地高三个方向进行剖分,找到几何对象所对应的二维网格编码和高度域编码。详细剖分及编码方法可参考《地球空间格网编码规则_GB_T 40087-2021》。

实现思路:

  1. 计算三维表达形式几何对象的最小外包立方体;
  2. 对比最小外包立方体的空间范围与各级三维网格单元的空间范围,获取可包含该最小外包立方体的最小网格单元所在二维网格层级 Lt 以及所在高度域层级 Lh ;
  3. 二维网格位置码编码同上述二维表达形式编码;
  4. 高度域编码,判断该几何对象是否穿越 Lh-1级以上的网格单元边界:
    1. 如未穿越,则以几何对象最小外包立方体对角线上的两个角点为基准,分别对两角点进行编码,以级为单位,取二者编码相同的部分。
    2. 如穿越,则以该几何对象的几何中心点基准,对中心点进行由 1级至 Lh 级的编码;如该几何对象的几何中心点位于层级 L以上的格网边界,则以该结点上侧格网作为该结点所在格网进行高度域编码。

      参数:
      geometry3D - 待编码对象,支持三维点、三维线、三维面、三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
      返回:
      GeoSOT四进制二维网格编码和二进制高度域编码。高度域编码地面以上以0开头,地面以下以1开头。如果几何对象的经纬度超出范围,则返回为空。
      示例:
      以下代码示范了如何对面对象进行GeoSOT三维网格编码。
       public void testGeoSOTRegion3D() {
      
          Point3Ds points = new Point3Ds();
          points.add(new Point3D(-120.15, -43.0, -150));
          points.add(new Point3D(-120.17, -43.2, 100));
          points.add(new Point3D(-120.19, -43.1, -260));
          points.add(new Point3D(-120.15, -43.0, 200));
          // 构造线对象
          GeoRegion3D geoRegion = new GeoRegion3D();
          geoRegion.addPart(points);
      
          String[] codes = SpatialGridCoding.geoSOTEncode3D(geoRegion);
      
          System.out.println("二维空间编码:" + codes[0]);
          System.out.println("高度域编码:" +codes[1]);
      
          //执行结果为: 
       二维空间编码:G30131302200
       高度域编码:11111111111111111  编码结果表明,从经纬度方向完全包围该几何对象的最小网格剖分层级为11级,大地高方向的剖分层级为17级
          }

geoEntityEncode

public static java.lang.String geoEntityEncode(Geometry geometry)
对指定的几何对象进行地理实体二维网格编码 ,返回对应的二维网格位置码。

基础地理实体是新型基础测绘产品体系中的核心成果,是推动基础测绘工作转型升级的关键。基础地理实体空间身份编码是适用于基础地理实体管理和应用的一种标识代码,具有可实现基础地理实体全球专有标识、唯一标识以及信息关联共享等特性。构建空间身份编码,可以有效提高基础地理实体数据的规范化、标准化管理,为各种应用提供更好用、更便捷的测绘地理信息服务。

地理实体编码范式采用“专有标识域+标准域+扩展域”三段划分,其中“标准域”又由二维/三维位置码+分类代码+顺序码组成,用以实现对基础地理实体的唯一标识。该方法则是生成地理实体对象的二维位置码,详细剖分及编码方法可参考《基础地理实体空间身份编码规则》。

参数:
geometry - 待编码对象,支持二维和三维点、线、面,三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
返回:
返回String类型的地理实体二维位置码,长度为26个字符。如果几何对象的经纬度超出范围,则返回为空。
示例:
以下代码示范了如何对面对象进行地理实体二维网格编码。
 public void testGeoEntityRegion2D() {
    Point2D point2D1 = new Point2D(126.48140951545128, 44.026401382119857);
    Point2D point2D2 = new Point2D(126.48140951366125, 44.026401380945153);
    Point2D point2D3 = new Point2D(126.60222928452474, 44.054986997893629);
    Point2D point2D4 = new Point2D(126.66857127909265, 44.022034532615365);
    Point2D point2D5 = new Point2D(126.70950326696368, 43.957012667582525);
    Point2Ds pntsRegion = new Point2Ds();

    pntsRegion.add(point2D1);
    pntsRegion.add(point2D2);
    pntsRegion.add(point2D3);
    pntsRegion.add(point2D4);
    pntsRegion.add(point2D5);
    pntsRegion.add(point2D1);

    GeoRegion geoRegion = new GeoRegion();
    geoRegion.addPart(pntsRegion);

    String code = SpatialGridCoding.geoEntityEncode(geoRegion);

    System.out.println("地理实体二维网格编码:" + code);

    //执行结果为: 
 地理实体二维网格编码:NE306A0010XXXXXXXXXXXXXXXX 
}

geoEntityEncode3D

public static java.lang.String geoEntityEncode3D(Geometry3D geometry3D)
对指定的三维几何对象进行地理实体编码 ,返回对应的三维网格位置码。

地理实体编码范式采用“专有标识域+标准域+扩展域”三段划分,其中“标准域”又由二维/三维位置码+分类代码+顺序码组成,用以实现对基础地理实体的唯一标识。该方法则是生成地理实体对象的三维位置码,详细剖分及编码方法可参考《基础地理实体空间身份编码规则》。

参数:
geometry3D - 待编码对象,支持三维点、三维线、三维面、三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
返回:
返回String类型的地理实体三维位置码,长度为44个字符。如果几何对象的经纬度超出范围,则返回为空。
示例:
以下代码示范了如何对三维面对象进行地理实体三维网格编码。
 public void testGeoEntityRegion3D() {

    Point3Ds points = new Point3Ds();
    points.add(new Point3D(-120.15, -43.0, -150));
    points.add(new Point3D(-120.17, -43.2, 100));
    points.add(new Point3D(-120.19, -43.1, -260));
    points.add(new Point3D(-120.15, -43.0, 200));
    // 构造线对象
    GeoRegion3D geoRegion = new GeoRegion3D();
    geoRegion.addPart(points);

    String code3D = SpatialGridCoding.geoEntityEncode3D(geoRegion);

    System.out.println("地理实体三维网格编码:" +code3D);

    //执行结果为: 
 地理实体三维网格编码:SW11105K10253K020350XX0XX5XXXXXXXXXXXXXXXXXX 
}

beidouGridEncode

public static java.lang.String beidouGridEncode(Geometry geometry)
对指定的几何对象进行北斗二维网格位置编码 ,返回对应的二维网格位置码。

北斗网格位置码是在地球空间剖分理论基础上发展起来的,适用于北斗卫星导航系统各种应用终端输出的一种网格位置编码,它与GeoSOT模型为基础的相关编码体系同根同源、一脉相承,设计上与北斗卫星导航系统的定位精度相适应,同时兼顾人和设备的使用,是经纬度点位置编码体系的重要补充。 详细剖分及编码方法可参考《北斗网格位置码 GB/T 39409-2020》。

参数:
geometry - 待编码对象,支持二维和三维点、线、面,三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
返回:
返回String类型的北斗二维网格位置码,长度为20个字符。如果几何对象的经纬度超出范围,则返回为空。

beidouGridEncode3D

public static java.lang.String beidouGridEncode3D(Geometry3D geometry3D)
对指定的几何对象进行北斗三维网格位置编码 ,返回对应的三维网格位置码。

北斗三维网格位置码由北斗二维网格位置码+高度域网格编码组成。详细剖分及编码方法可参考《北斗网格位置码 GB/T 39409-2020》。

参数:
geometry3D - 待编码对象,支持三维点、三维线、三维面、三维几何体、三维模型等类型,且只支持经纬度坐标系的对象。
返回:
返回String类型的北斗三维网格位置码,长度为32个字符。如果几何对象的经纬度超出范围,则返回为空。