概述
目录
一、修复效果
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
原始图形
原始图形坐标(坐标为演示伪坐标)
图上的的红点跳动的顺序是该图层的坐标点顺序,可以看到并不存在互相交叉的自相交,但是因为存在两个重叠的坐标点重叠,导致不符合OGC简单要素规范。该问题困扰了我很长一段时间,经过研究发现使用GDAL库可以修复此类问题,并编写修复工具类。关注微行公众号:“GIS工具乐园”,持续更新开发技巧分享哦。
一、修复效果
先看GDAL几何修复后的图形效果,经过修复后图形变成环形面,由内环和外环坐标组成。经测试,在geotools、JTS、PostGIS中使用,不再报错。
1.内环效果gif动图
修复后内环图形演示
修复后内环坐标
2.外环效果gif动图
修复后外环图形演示
修复后外环坐标
二、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<featureCount;i++){
Feature feature = layer.GetNextFeature();
Geometry geometry = feature.GetGeometryRef();
if (!geometry.IsValid()){
double oldArea = MathCalculateUtils.round(geometry.GetArea(),4);
Geometry geometryNew = geometry.MakeValid();
if (!geometryNew.IsValid()){
feature.SetField(fieldName,"几何修复失败");
}else {
double newArea = MathCalculateUtils.round(geometryNew.GetArea(),4);
BigDecimal areaSubtract = new BigDecimal(String.valueOf(oldArea)).subtract(new BigDecimal(String.valueOf(newArea)));
if (areaSubtract.compareTo(new BigDecimal("0.0")) != 0){
feature.SetField(fieldName,"几何修复完成,修复前后面积差" + areaSubtract.toString() + "平方米,注意检查几何图形是否正确");
}else {
feature.SetField(fieldName,"几何修复完成");
}
feature.SetGeometry(geometryNew);
}
}else {
feature.SetField(fieldName,"几何正常,无需修复");
}
layer.SetFeature(feature);
}
}
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();
}
最后
以上就是唠叨口红为你收集整理的GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复的全部内容,希望文章能够帮你解决GDAL几何修复,java几何拓扑修复、修复几何图形自相交,shp拓扑修复,gdb拓扑修复,shp几何修复,gdb几何修复,GDAL修复所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复