前言
AutoCad目前仍是广泛用于GIS测量绘图中,DWG是一个AutoCad的专有文件格式,因此很难在不商用的情况下对其进行直接解析。无论是arcgis还是Autodesk公司的解析软件都是需要授权。再次先将DWG转化成支持性较好的DXF格式后再对DXF格式的文件进行地理要素的提取。
处理流程
DWG转DXF
github上的LibreDWG项目,直接下载编译好的软件,解压即用
转化命令 dwg2dxf.exe input.dwg -o output.dxf -y
public static void test1() throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe" , "/c" , "dwg2dxf C:\\Users\\wsh84\\Desktop\\test.dwg -o C:\\Users\\wsh84\\Desktop\\test.dxf -y");
Process process = processBuilder.start();
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
//莫名异常,防止异常阻塞
String errorLine = null;
while ((errorLine = errorReader.readLine()) != null) {}
errorReader.close();
int exitCode = process.waitFor();
System.out.println("命令执行完毕,退出码:" + exitCode);
}
DXF转SHP
这里我们使用GDAL进行转化,亦可以直接解析坐标串以供使用。
//dxf文件路径
String filePath ="C:\\Users\\wsh84\\Desktop\\test.dxf";
// 注册所有的驱动
ogr.RegisterAll();
gdal.SetConfigOption("DXF_ENCODING","UTF-8");
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");//支持中文路径
gdal.SetConfigOption("SHAPE_ENCODING","CP936");//属性表字段支持中文
DataSource ds = ogr.Open(filePath,1);
Driver dv = ogr.GetDriverByName("ESRI Shapefile"); //调用驱动转shp
String extfile = "C:\\Users\\wsh84\\Desktop\\高程数据\\export2.shp";
DataSource dataSource = dv.CreateDataSource(extfile);//创建shp文件并写入内容
SpatialReference sr = new SpatialReference();
//定义坐标系
sr.ImportFromEPSG(4526);
Layer ShpLayer = dataSource.CreateLayer("ZDXX", sr, ogr.wkbPoint25D, null);
if (ds == null)
{
System.out.println("打开文件失败!" );
}
System.out.println("打开文件成功!" );
Layer oLayer = ds.GetLayerByIndex(0);
if(oLayer == null){
System.out.println("获取失败");
}
//过滤图层
oLayer.SetAttributeFilter("Layer = '123'");
Feature feature;
//获取feature
while ((feature = oLayer.GetNextFeature()) != null)
{
//获取空间属性
org.gdal.ogr.Geometry geometry = feature.GetGeometryRef();
//只取点
if(geometry.GetGeometryType() == ogr.wkbPoint25D)
{
ShpLayer.CreateFeature(feature);
}
}
oLayer.ResetReading();
dataSource.SyncToDisk();
dataSource.FlushCache();
dataSource.delete();
结尾
本篇主要介绍了如何迂回的提取DWG中的地理要素,先通过DWG转DXF,再通过gdal提取要素,优点在于整个过程都是开源,能减少解析cad过程中商用授权的成本问题。或许还有其他的方法可以直接解析DWG文件,但我暂且无法找到。