DXF转KML初探

最近接到一个不大不小的地形测量项目,对方发来了一个dwg的范围图,由于对这个地方不是很熟,并且拐弯抹角的地方比较多,想要准确的确定位置,最好能叠加到影像上,主流的卫星影像如水经注,LSV等,其实都是支持dwg直接导入的,但是牵扯到投影设置等,且需要会员支持,繁琐且不一定能成功,既然如此,趁着十一没事,决定自己简单搞一下。

简单分析一下,主要分2步,第一步就是解析dxf(dxf为CAD的交换文件格式),第二步就是序列化输出kml文件。

解析dxf

记得以前解析dxf文件的时候,是将dxf当做一个文本文档,根据标签一点点解析自己需要的东西,今天网上看一下有没有现成的,竟然发现,有一个支持.net的dxf类库netdxf非常好用。

直接上连接:https://github.com/haplokuon/netDxf

其实最早一版的netdxf在2013年就发布了,最新版本是v2.4.2,netdxf提供了dxf的很全面的读写功能,所以决定试一试,本文使用开发语言为C#。

想要用netdxf并不需要下载它,如果使用visual studio开发并且电脑联网的话,可以通过下面方式添加netdxf的引用。

首先正常新建一个项目,然后在项目上右键,弹出管理NuGet程序包对话框,在浏览中输入netdxf之后,点击右侧安装,完了就可以直接引用了。

图片

根据需要添加名称空间引用,本文添加

using netDxf;

using netDxf.Entities;

如果电脑没有联网,可以下载netdxf.dll,在项目的引用里添加该dll,则可以直接使用了,网上有很多,找不到的话可以关注回复netdxf获取

netdxf的DxfDocument类提供了一个load方法,该方法可以直接以文件路径名的字符串作为参数来加载一个dxf文件,所以首先加载一个dxf文件看一下能读出什么东西。加载的是一个简单线的dxf文件,该文件直接放在程序主目录里

DxfDocument dxf = DxfDocument.Load("1.dxf");

发现数据都存储在document下的LwPolylines下面(测试用途图形类型比较单一),LwPolylines是一个IEnumerable类型的可遍历的LwPolyline类型的数据,可以通过LwPolyline的GetEnumberator()方法获得,所以接着获取LwPolyline类型的LwPolylines。

图片

IEnumerable<LwPolyline> LW = (IEnumerable<LwPolyline>)dxf.LwPolylines.GetEnumerator();

LwPolyline有一个List<LwPolylinevertex>类型的属性Vertexes用来存放坐标等属性,考虑到LwPolylines是一个可列举的类型,所以遍历每一个LwPolyline

图片

 foreach (LwPolyline PS in LW)

 {

       List<LwPolylineVertex> vt = PS.Vertexes;

}

LwPolylineVertex里,坐标存在Position下,遍历LwPolylineVertex列表

图片

vector2类型有X和Y两个读写属性,可以直接访问读取数据了。

 foreach (LwPolyline PS in LW)

  {

  List<LwPolylineVertex> vt = PS.Vertexes;

  foreach(LwPolylineVertex lpv in vt)

   {

    double x = lpv.Position.X;

    double y = lpv.Position.Y;

    }

 }

至此,关于LwPolyline线的解析就结束了。

当然CAD数据类型很多,可以按照类似的方法分别解析需要的数据。

序列化kml

序列化输出KML比解析dxf更加简单一些,因为.net自带了一个类库system.xml.Serialization,通过如下方法可以实现对象的序列化。

public void Serialize(TextWriter textWriter, object o)

层层解析kml的polygon的结构,kml-document-placemark-polygon-outerBoundaryIs-LingearRing-coordinates,依次构造最后形成一个层层包含的对象,最后借助Serialize(TextWriter textWriter, object o)可以直接输出

图片

下一篇再细说一下序列化的东西,因为本文数据为投影平面坐标,还需要进行高斯反算,一番操作之后,输出了一个kml,这是原来的CAD图

图片

这是生成KML导入到地图里

图片

本文结束,简单记录一下,最后完善了一些异常处理和坐标系统变换,以后就可以不用怕遇到CAD的范围线了。

如果有更好的方法可以一起交流

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值