怎么把dxf格式转换成kml

您所在的位置:网站首页 文件怎么转换dxf格式 怎么把dxf格式转换成kml

怎么把dxf格式转换成kml

#怎么把dxf格式转换成kml| 来源: 网络整理| 查看: 265

最近接到一个不大不小的地形测量项目,对方发来了一个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 LW = (IEnumerable)dxf.LwPolylines.GetEnumerator();

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

图片

 foreach (LwPolyline PS in LW)

 {

       List vt = PS.Vertexes;

}

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

图片

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

 foreach (LwPolyline PS in LW)

  {

  List 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的范围线了。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3