com.supermap.data

类 DatasetVector



  • public class DatasetVector
    extends Dataset

    矢量数据集类。

    用于对矢量数据集进行描述,并对之进行相应的管理和操作。对矢量数据集的操作主要包括数据查询、修改、删除等。

    用户在对矢量数据集进行操作之前,需要先打开该数据集,即调用打开数据集的方法—— Dataset.open() 方法。

    • 方法详细资料

      • getFieldCount

        public int getFieldCount()
        返回矢量数据集中字段的数目。

        该方法是线程安全的,线程安全级别为 level2。有关线程安全的详细说明请参考《多线程技术文档》。

        返回:
        矢量数据集中字段的数目。
      • getFieldInfos

        public FieldInfos getFieldInfos()
        返回字段信息集合的对象。即数据集属性表中所有字段的信息。

        该方法是线程安全的,线程安全级别为 level2。有关线程安全的详细说明请参考《多线程技术文档》。

        返回:
        字段信息集合的对象。
      • getRecordset

        public Recordset getRecordset(boolean isEmptyRecordset,
                                      CursorType cursorType)
        根据给定的参数来返回空的记录集或者返回包括所有记录的记录集对象。
        参数:
        isEmptyRecordset - 给定的判断是否返回空的记录集参数。为 true 时返回空记录集。为 false 时返回包含所有记录的记录集合对象。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。详细信息请参见 CursorType 类型。
        返回:
        isEmptyRecordset 参数为 true 时返回空的记录集;false 时返回包含所有记录的记录集。
      • query

        public Recordset query(QueryParameter queryParameter)
        通过设置查询条件对矢量数据集进行查询,该方法默认查询空间信息与属性信息。

        该方法是线程安全的,线程安全级别为 level2。有关线程安全的详细说明请参考《多线程技术文档》。

        参数:
        queryParameter - 定义的查询条件。
        返回:
        查询的记录集。
      • append

        public boolean append(Recordset recordset)
        用于将记录集(Recordset)追加到矢量数据集(DatasetVector)中。追加时,记录集与矢量数据集中字段名相同的字段直接追加,矢量数据集中没有而记录集中有的字段将跳过不处理。

        执行完追加后 recordset 会指向最后一条记录的后面,即 isEOF 方法为 true。

        参数:
        recordset - 添加的记录集对象。
        返回:
        添加成功返回 true,否则返回 false。
        Example:
        以下代码示范如何将记录集追加到矢量数据集中。
         public void appendTest() {
                // 假设打开一个工作空间 workspace 对象,工作空间中存在一个数据源 datasource 对象
                // 数据源包含两个矢量数据集,分别为“World”和“Ocean”
                DatasetVector datasetVector = (DatasetVector) datasource.getDatasets().
                                              get("World");
                DatasetVector datasetVector1 = (DatasetVector) datasource.getDatasets().
                                               get("Ocean");
        
                // 返回名为“Ocean”的数据集的所有记录,将其追加到名为“World”的数据集中
                Recordset recordset = datasetVector1.getRecordset(false,
                        CursorType.DYNAMIC);
                if (datasetVector.append(recordset)) {
                    System.out.println("追加数据集成功");
                }
        
                // 释放资源
                recordset.dispose();
                datasetVector.close();
                datasetVector1.close();
            }
         
      • append

        public boolean append(Recordset recordset,
                              java.lang.String tileName)
        用于将记录集(Recordset)按图幅名字追加到矢量数据集(DatasetVector)中,要求该矢量数据集的空间索引为图库索引,追加后记录集中的所有记录将作为图库索引的一幅。追加时,记录集与矢量数据集中字段名相同的字段直接追加,矢量数据集中没有而记录集中有的字段将跳过不处理。该方法一般用于标准图幅数据入库过程。

        执行完追加后 recordset 会指向最后一条记录的后面,即 isEOF 方法为 true。

        注:目前,仅有 EngineType中的 ORACLEPLUS 引擎,支持矢量数据集按图幅追加数据。

        参数:
        recordset - 添加的记录集对象。
        tileName - 新增的图幅名称标记。
        返回:
        添加成功返回 true,否则返回 false。
      • deleteRecords

        public boolean deleteRecords(int[] id)
        通过 ID 数组删除数据集中的记录。
        参数:
        id - 待删除记录的 ID 数组。
        返回:
        删除成功返回 true,否则返回 false。
      • query

        public Recordset query(int[] id,
                               CursorType cursorType)
        根据 ID 进行查询。
        参数:
        id - ID 数组。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。详细信息请参见 CursorType 类型。
        返回:
        查询的记录集。
      • query

        public Recordset query(Rectangle2D bounds,
                               java.lang.String attributeFilter,
                               CursorType cursorType)
        用于查询落在已知空间范围内,并且满足一定条件的记录。
        参数:
        bounds - 已知的空间范围。
        attributeFilter - 查询过滤条件,相当于 SQL 语句中的 Where 子句部分。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。详细信息请参见 CursorType 类型。
        返回:
        查询的记录集。
      • query

        public Recordset query(Rectangle2D bounds,
                               CursorType cursorType)
        用于查询落在已知空间范围内的记录。
        参数:
        bounds - 已知的空间范围。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。详细信息请参见 CursorType 类型。
        返回:
        查询的记录集。
      • query

        public Recordset query(java.lang.String attributeFilter,
                               CursorType cursorType)
        利用查询条件查询数据。该方法默认查询空间数据与属性数据。

        对于 UDB 引擎,当用户传入字符串型时间字段并用此时间值构造查询条件时,需遵循以下规则:将时间值格式化到 ”to_data()” 字符串的括号中,例如,时间值 "2008-5-12 14:28:00",写为 "to_date(2008-5-12 14:28:00)",注意括号中时间值无需引号。

        参数:
        attributeFilter - 查询条件,相当于 SQL 语句中的 Where 子句。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读属性。详细信息请参见 CursorType 类型。
        返回:
        查询得到的记录集。
        Example:
        以下代码示范了对于 UDB 引擎如何根据字符串型时间字段构造查询条件。
         public void queryTest(){
               SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
               //构造一个时间对象
               Date dateOld=new Date(2010,1,10,11,12,13);
               //构造一个当前时间的对象
               Date dateNow = new Date();
               //格式化成字符串
               String dtStrOld = format.format(dateOld);
               String dtStrNow = format.format(dateNow);
               //用两个时间字符串构造查询条件
               String filter = "TimeField between to_date(" + dtStrOld + ") and to_date(" + dtStrNow + ")";
               //将查询条件传入到Query方法,查询记录集
               Recordset recordset = vector.Query(filter,CursorType.Static);
               }
         
      • query

        public Recordset query(Geometry geometry,
                               double bufferDistance,
                               CursorType cursorType)
        用于查询数据集中落在指定空间对象的缓冲区内的记录。
        参数:
        geometry - 用于查询的空间对象。
        bufferDistance - 缓冲区的半径。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读属性。详细信息请参见 CursorType 类型。
        返回:
        查询的记录集。
      • query

        public Recordset query(Geometry geometry,
                               double bufferDistance,
                               java.lang.String attributeFilter,
                               CursorType cursorType)
        用于查询数据集中落在指定空间对象的缓冲区内,并且满足一定条件的记录。
        参数:
        geometry - 用于查询的空间对象。
        bufferDistance - 缓冲区的半径。
        attributeFilter - 查询条件,通常是一个 SQL 语句。
        cursorType - 指定的游标类型,以便用户控制查询出来的记录集的属性。当游标类型为动态时,记录集可以被修改,当游标类型为静态时,记录集为只读。详细信息请参见 CursorType 类型。
        返回:
        查询的记录集。
      • getChildDataset

        public DatasetVector getChildDataset()
        获取矢量数据集的子数据集。主要用于网络数据集。
        返回:
        子数据集。
      • fromGeoJSON

        public boolean fromGeoJSON(java.lang.String geoJSON)
        从GeoJSON字符串中获取几何对象,并将其存入数据集中

        仅支持点、线、面和CAD数据集,获取点、线、面对象

        参数:
        geoJSON - GeoJSON格式的字符串
        返回:
        获取成功,返回true;否则,返回false
      • toGeoJSON

        public java.lang.String toGeoJSON(boolean hasAttributte,
                                          int startID,
                                          int endID)
        将数据集中指定起止SmID的对象,转换成GeoJSON格式的字符串

        仅支持点、线、面和CAD数据集,转换点、线、面对象.hasAtrributte为true时,结果中包含属性值;hasAtrribute为false时,只有几何对象。

        参数:
        hasAttributte - 是否包含属性值
        startID - 起始SmID
        endID - 结束SmID
        返回:
        返回GeoJSON格式的字符串,没有转换成功,返回null;
      • queryByKeyword

        public void queryByKeyword(java.lang.String fieldName,
                                   java.lang.String keywords,
                                   Geometry geoRegion,
                                   int count)
        属性查询,查询指定字段之中包含关键字的记录; 获取结果的方式:setQueryListener(QueryListener listener)
        参数:
        fieldName - 查询的字段名,如Name, Name_PY, Name_PYSZM,即名称字段,名称拼音字段,名称拼音首字母字段
        keywords - 对查询字段做查询的关键字
        geoRegion - 可以指定范围,如果为NULL,则表示全范围查询
        count - 返回的查询结果个数,默认10个,超过100按100算
      • queryByFilter

        public void queryByFilter(java.lang.String attributeFilter,
                                  Geometry geoRegion,
                                  int count)
        空间查询,查询指定空间范围内符合字段条件的记录; 获取结果的方式:setQueryListener(QueryListener listener)
        参数:
        attributeFilter - 查询的条件,比如说 Kind=2008
        geoRegion - 查询的区域
        count - 返回的查询结果个数,默认10个,超过100按100算
      • fromGeoJSON

        public int fromGeoJSON(java.io.File file)
        从指定文件(txt)中读取dataset的GeoJSON数据,并导入到当前dataset中.导入时,导入一条记录的SmID已经存在,那么就修改这条记录,否则增加记录。 支持的数据集类型:点、线、面、CAD数据集,几何类型:点、线、面(即GeoPoint, GeoLine, GeoRegion)。 注:该方法与toGeoJSON(File)配合使用,读取文件也是根据toGeoJSON(File)而设定的, 若是使用的文件与toGeoJSON(File)导出文件的格式不一致,很可能会导入失败。
        参数:
        file - 存储dataset的GeoJSON数据,通常为txt文件
        返回:
        count 成功导入的记录数
      • toGeoJSON

        public int toGeoJSON(java.io.File file)
        将当前数据集中的所有记录都转成GeoJSON字符串,并存入指定的文件(txt)中,并且每一行为一条记录,以"\n"结尾。 支持的数据集类型:点、线、面、CAD数据集,几何类型:点、线、面(即GeoPoint, GeoLine, GeoRegion)。
        参数:
        file - 用于存储GeoJSON字符串的文件,如果文件存在,则在其后追加,如果不存在,会新建一个文件。
        返回:
        count 成功导出的记录数
      • convertToLine

        public GeoLine convertToLine()
        将点数据集中的所有点转换成线对象,仅支持点数据集

        若不是点数据集,会抛出异常。若点数据集中少于两个点,则返回null

        返回:
        GeoLine 转换成功,返回转换后的线对象;否则返回null
      • convertToLine

        public GeoLine convertToLine(java.lang.String fieldName,
                                     java.lang.String fieldValue)
        将点数据集中的有相同字段值的点转换成线对象,仅支持点数据集

        若不是点数据集,会抛出异常。若点数据集中不存在指定的字段或没有包含该字段值的点,以及匹配结果少于两个点,则返回null

        参数:
        fieldName - 字段名
        fieldValue - 字段值
        返回:
        GeoLine 转换成功,返回转换后的线对象;否则返回null
      • getSpatialIndexType

        public SpatialIndexType getSpatialIndexType()
        返回当前的空间索引类型
        返回:
        当前的空间索引类型
      • isSpatialIndexDirty

        public boolean isSpatialIndexDirty()
        返回矢量数据集中空间索引是否需要重建。因为在修改数据过程后,可能需要重建空间索引。 注意: 当矢量数据集无空间索引时,如果其记录条数已达到建立空间索引的要求,则返回 true,建议用户创建空间索引;否则返回 false。 如果矢量数据集已有空间索引(图库索引除外),但其记录条数已经不能达到建立空间索引的要求时,返回 true。
        返回:
        需要重建索引,返回 true;否则返回 false
      • isSpatialIndexTypeSupported

        public boolean isSpatialIndexTypeSupported(SpatialIndexType spatialIndexType)
        判断当前数据集是否支持指定的类型的空间索引
        参数:
        spatialIndexType - 指定的空间索引的类型
        返回:
        如果支持指定的空间索引类型,返回值为 true,否则为 false
      • buildSpatialIndex

        public boolean buildSpatialIndex(SpatialIndexInfo spatialIndexInfo)

        根据指定的空间索引信息为矢量数据集创建空间索引。

        注意:

        1. 数据库中的点数据集不支持四叉树(QTree)索引和 R 树索引(RTree);
        2. 网络数据集不支持任何类型的空间索引;
        3. 属性数据集不支持任何类型的空间索引;
        4. 路由数据集不支持图幅索引(TILE);
        5. 复合数据集不支持多级网格索引;
        6. 数据库记录要大于1000条时才可以创建索引
        参数:
        spatialIndexInfo - 指定的空间索引信息对象
        返回:
        创建索引成功返回 true,否则返回 false
      • buildSpatialIndex

        public boolean buildSpatialIndex(SpatialIndexType spatialIndexType)

        根据给定的空间索引类型来为矢量数据集创建空间索引。有关空间索引类型请参见 SpatialIndexType 枚举类型说明。

        注意:

        1. 数据库中的点数据集不支持四叉树(QTree)索引和 R 树索引(RTree);
        2. 网络数据集不支持任何类型的空间索引;
        3. 属性数据集不支持任何类型的空间索引;
        4. 路由数据集不支持图幅索引(TILE);
        5. 复合数据集不支持多级网格索引;
        6. 数据库记录要大于1000条时才可以创建索引。
        7. 本操作需要在数据集关闭状态时进行,如当前数据集仍然打开,则重建空间索引失败。
        参数:
        spatialIndexType - 指定的需要创建空间索引的类型
        返回:
        创建索引成功返回 true,否则返回 false。
        Example:
        以下代码示范判断某数据集的空间索引是否需要重建,如果需要重建,建立一个R 树索引,如果不需重建,则判断现有数据集是否支持多级网格索引。
          
             public void buildSpatialIndexTest() { 
                 // 假设打开一个工作空间 workspace 对象,工作空间中存在一个数据源 datasource 对象 
                 // 取出数据源中名为 "World" 的矢量数据集(datasetVector)
                 // 判断此数据集的空间索引是否需要重建,如果需要重建,建立一个 R 树索引,如果不需重建,则判断现有数据集是否支持多级网格索引
                 DatasetVector datasetVector = (DatasetVector)
                 datasource.getDatasets(). get("World"); 
                 if (datasetVector.isSpatialIndexDirty()) { 
                     // 删除已存在的索引
                     datasetVector.dropSpatialIndex(); 
                     // 关闭数据集
                     datasetVector.close();
         
                     // 重建 R 树索引 
                     if(datasetVector.buildSpatialIndex(SpatialIndexType.RTREE)) {
                         SpatialIndexType spatialindextype = datasetVector.
                         getSpatialIndexType(); 
                         System.out.println("新建空间索引的类型为:" + spatialindextype); 
                     } 
                 } else { 
                     // 如果不需要重建,判断现有数据集是否支持多级网格索引 
                     if(datasetVector.isSpatialIndexTypeSupported(SpatialIndexType.MULTI_LEVEL_GRID)) { 
                         System.out.println("该数据集支持多级网格索引"); 
                     } else {
                         System.out.println("该数据集不支持多级网格索引"); 
                     } 
                 } 
             }
             
      • reBuildSpatialIndex

        public boolean reBuildSpatialIndex()
        在原有的空间索引基础上进行重建,如果原来的空间索引被破坏,那么重建成功后还可以继续使用。
        返回:
        重建索引成功返回 true,否则返回 false。
      • dropSpatialIndex

        public boolean dropSpatialIndex()
        删除空间索引
        返回:
        删除成功返回 true,否则返回 false。
      • computeBounds

        public Rectangle2D computeBounds()
        计算数据集的空间范围
        返回:
        返回数据集的空间范围。
      • getCharset

        public Charset getCharset()
        获取矢量数据集的字符集
        返回:
        字符集