GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复

目录

一、修复效果

1.内环效果gif动图

2.外环效果gif动图

二、java代码

1.修复核心方法makeValid()代码

2.数据源打开方法openSource()

3.调用示例


在GIS开发中,使用geotools、JTS、PostGIS等进行某些几何操作,例如裁剪、擦除等,如果几何图形存在拓扑问题,即不符合OGC标准的几何图形,就会报错,导致程序无法继续执行。

一般的几何拓扑问题可以使用ArcGIS的“几何修复”工具可以解决。但是遇到有一类问题,使用ArcGIS几何修复后,在geotools、JTS、PostGIS裁剪依然会报错自相交。下面通过gif动态展示该图形示例。

工具类源代码下载:https://download.csdn.net/download/tylkhx/85196867

GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复_第1张图片

原始图形

GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复_第2张图片

原始图形坐标(坐标为演示伪坐标)

图上的的红点跳动的顺序是该图层的坐标点顺序,可以看到并不存在互相交叉的自相交,但是因为存在两个重叠的坐标点重叠,导致不符合OGC简单要素规范。该问题困扰了我很长一段时间,经过研究发现使用GDAL库可以修复此类问题,并编写修复工具类。关注微行公众号:“GIS工具乐园”,持续更新开发技巧分享哦。

一、修复效果

先看GDAL几何修复后的图形效果,经过修复后图形变成环形面,由内环和外环坐标组成。经测试,在geotools、JTS、PostGIS中使用,不再报错。

1.内环效果gif动图

 修复后内环图形演示

GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复_第3张图片

修复后内环坐标

2.外环效果gif动图

 修复后外环图形演示

GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复_第4张图片

修复后外环坐标

二、java代码

1.修复核心方法makeValid()代码

在该方法会图层添加“修复情况”字段,并将填写修复情况信息。在修复的过程中,先检查图形是否存在拓扑错误,当存在拓扑错误时,才进行几何修复,以在进行大批量修复时提高速度,同时在修复前后分别计算图形面积,如果修复前面面积出现变化,则“修复情况”字段中填入提示信息,提醒用户检查核对。

  public static void makeValid(Layer layer){
    if (layer == null){
      return;
    }
    FeatureDefn featureDefn = layer.GetLayerDefn();
    String fieldName = "修复情况";
    int fieldNum = 0;
    while (featureDefn.GetFieldIndex(fieldName) != -1 || fieldNum > 9){
      fieldName = "修复情况" + fieldNum;
      fieldNum += 1;
    }
    FieldDefn fieldDefn = new FieldDefn();
    fieldDefn.SetName(fieldName);
    fieldDefn.SetType(ogr.OFTString);
    fieldDefn.SetWidth(200);
    layer.CreateField(fieldDefn);

    layer.ResetReading();
    long featureCount = layer.GetFeatureCount();
    for (long i=0;i

2.数据源打开方法openSource()

使用该方法打开数据源,注意update参数得传true,否则无法修改保存数据。

  public static DataSource openSource(String path,boolean update){
    if (StringUtil.isEmpty(path)){
      return null;
    }
    if (update){
      return ogr.Open(path,1);
    }else {
      return ogr.Open(path,0);
    }
  }

3.调用示例

以修复shapefile格式数据为例进行示范,首先使用openSource()打开数据,然后调用makeValid()方法进行修复,注意调用makeValid()时传入的是GDAL的图层,因此该几何修复方法不限于shapefile数据格式,gdb数据也可,shapefile数据从数据源中获取第一个图层即可。最后进行数据存盘,即完成几何修复操作。

public static void main(String args[]) throws IOException {
    String shpPath = "D:\\新建文件夹\\拓扑错误示例.shp";
    DataSource dataSource = openSource(shpPath, true);
    if (dataSource == null){
      return;
    }
    makeValid(dataSource.GetLayer(0));
    dataSource.FlushCache();
    dataSource.delete();
  }

你可能感兴趣的:(GIS,java,GDAL,java,GIS,gdal,拓扑,geotools)