在Cesium中实现与CAD的DWG图叠加显示分析

本文详细介绍了如何在Cesium中实现CAD DWG图层的加载,以及解决不同坐标系导致的瓦片错位问题。首先,传统方案涉及DWG转DXF再转SHP,然后通过GIS服务发布,但数据可能丢失。为解决此问题,唯杰地图(VJMap)支持直接将DWG发布为WMS图层。在Cesium中加载WMS图层时,由于坐标系差异,出现瓦片错开现象。通过四参数转换,将CAD坐标与Web Mercator 3857坐标进行线性转换,解决了错位问题。文章提供了完整代码示例,并展示了最终实现效果。

前言

Cesium是一个非常优秀的三维地球GIS引擎(开源且免费, 能够加载各种符合标准的地图图层,瓦片图、矢量图等都支持。而AutoCAD是为微型计算机上应用CAD技术而开发的绘图程序,它有很强的图形编辑能力,非常适合绘制工程图纸,绘图的精确性和绘图方法的丰富性使得它在机械、电子、建筑、航空航天等领域有着广泛的应用,常见的一些工程图纸基本上都是AutoCAD绘制的DWG格式的图纸;在实际中经常会遇到需要将CAD的图纸叠加到cesium上面,与地表地形叠加显示查看。那如何实现在Cesium中实现与CAD的DWG图叠加显示分析呢?

技术分析

业内一般的做法步骤为:

  • (1) 在AutoCAD中把DWG图导出为DXF明码格式文件
  • (2) 利用第三方工具如GDAL,把dxf转为shp等GIS数据格式
  • (3) 利用开源的gis服务,如geoserver或mapserver把shp文件发布成gis服务
  • (4) 在cesium中加载gis服务的瓦片图层

上面的方案的优点很明显,基本上利用开源的方案能把流程跑通。但在实际项目中缺点也很明显,主要是在步骤 (1)(2), 因为dwg是私有格式,通过dwg转出成dxf再转化成shp文件时,会丢失图中的很多数据,CAD数据类型较为丰富,支持点、块符号、线、面、多段线、椭圆、块、文字等多种数据类型,而转换到GIS中,只转换为点、线、面、注记等类型,这使得CAD图形数据不能很好的满足GIS的要求,如:CAD中的Text数据类型,直接转换后只转换为GIS中的Point。通过这种转换去绘制,会导致和原始CAD图形绘制不太一样, 同时CAD里面有线型、字体也会导致绘制上的差异性。

唯杰地图vjmap完全兼容AutoCAD格式的DWG文件,无需通过转换可直接发布成gis的WMS格式,可有效解决上面问题。实现步骤为:

  • (1) 上传DWG图形,利用唯杰地图发布为WMS图层
  • (2) 在cesium中加载wms瓦片图层

实现

先上效果图,(红色的线为cad图层)

cesiumcad.gif

具体步骤:

  • 确定CAD图的坐标系

    在打开的CAD图中,随便找了图中的一个点坐标,坐标为”614802.89177, 3257472.36997”

    那怎么确定这个坐标是哪个坐标系呢? 如果已经知道坐标能不能倒推坐标系呢?

    可以,但是得分情况。这里我们只讨论高斯克吕格投影。

    假设已经知道数据的投影是高斯克吕格,怎样判定是6°带还是3°带?怎样判定中央经线是多少呢?

    如果坐标范围是6位,我们可以判定坐标系不带带号的。如果Y值范围在333000m~667000m,可能是3°分带法;如果Y值范围在166 000m~834000m,一定是6°分带法。如果取值范围重合的部分有可能3°分带法也可能在6°分带法。

    如果坐标范围是8位,我们可以判定坐标系是以带号命名,并且根据带号可以知道是3°带还是6°带。我们国家的经度范围大致在73°33′E105°05′E,所以如果是以带号命名,带号在1323带之间的,说明是6°分带法;带号在25~45带之间的,说明是3°分带法。

    在这个图中,坐标为”614802“为6位,大概率能确定为省去了带系的3°分带坐标。并且根据图中图框中坐标系写的为2000坐标系,同时地点为重庆附近。而重庆的经度差不多是以106开头。我们去epsg官网查询得知,该坐标系应该是"EPSG:4544".

    在这里插入图片描述

  • 上传打开CAD图

    如果在Web网页端展示CAD图形(唯杰地图云端图纸管理平台 https://vjmap.com/app/cloud),这个在前面的博文中已讲过,这里不再重复,有需要的朋友可下载工程源代码研究下。

  • 在cesium增加cad图层

    let imageryProvider= new Cesium.WebMapTileServiceImageryProvider({
         
         
    			url: "http://t0.tianditu.gov.cn/img_w/wmts?tk=3346bb6ad29b5013c5952cf1117b80e9",
    			layer: "img",
    			style: "default",
    			tileMatrixSetID: "w",
    			format: "tiles",
    			maximumLevel: 14,
    		});
    
    		let viewer = new Cesium.Viewer('cesiumContainer', {
         
         
    			imageryProvider: imageryProvider,
    			contextOptions: {
         
         
    				webgl: {
         
         
    					alpha: true
    				}
    			},
    			selectionIndicator: false,
    			animation: false, //是否显示动画控件
    			baseLayerPicker: false, //是否显示图层选择控件
    			geocoder: false, //是否显示地名查找控件
    			timeline: false, //是否显示时间线控件
    			
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值