DWG提取地理要素(JAVA)

文章讲述了如何使用开源工具LibreDWG将DWG文件转换为DXF格式,然后利用GDAL库将DXF转换为SHP地理文件,以避免商业授权成本,主要涉及AutoCad、GIS和文件格式转换技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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文件,但我暂且无法找到。

参考

libredwg:https://github.com/LibreDWG/libredwg/releases

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值