package util;
import org.gdal.gdal.gdal;
import org.gdal.ogr.*;
import java.io.IOException;
import java.math.BigDecimal;
/**
* gdal几何修复工具类
*
*/
public class GdalMakeValidUtil {
static {
gdal.AllRegister();
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
gdal.SetConfigOption("SHAPE_ENCODING","CP936");
}
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();
}
/**
* 几何修复
* @param layer 图层
* 对原图层进行修复,并增加“修复情况”字段
*/
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);
}
}
/**
* 打开数据源
* @param path 数据路径
* @param update 是否更新源数据
* @return
*/
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);
}
}
}
GIS工具乐园
- 粉丝: 0
- 资源: 26
会员权益专享
最新资源
- ChatGPT科研神器:润色论文,还能帮你读代码
- 脑电功能连接性分析工具包
- 22年开始整理从17年陆续收集的github源码链接,整理成Excel文档 此为第10个文档
- 22年开始整理从17年陆续收集的github源码链接,整理成Excel文档 此为第9个文档
- 【计算机专业VB-毕业设计100套之】VB健身中心会员管理系统(源代码+系统+开题报告+答辩PPT+中英文翻译)
- armarmarmarmarm
- 研究生人工智能机器学习PPT
- 【计算机专业VB-毕业设计100套之】VB计算机自动出卷系统(开题报告+外文翻译+源程序+可执行程序+论文正文+答辩ppt)
- MACMidjourney必备Discord
- 22年开始整理从17年陆续收集的github源码链接,整理成Excel文档 此为第8个文档
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


