autocad 动态加载ARCGISONLINE地图数据
我在公司以前开发过一个使用CAD加载GIS数据,并实现编辑以及渲染等功能的系统,应用于规委。原系统中数据 的刷新都是手动进行的。今天脑子一转,试试自动刷新数据的效率。
1. 要想自动刷新数据,首先要解决如果在CAD中捕获平行,以及给缩放的事件。经过分析实现,可以采用Editor对象的PointMonitor事件进行处理。
2.Arcgis Onlie提供的地图网站,通过后台监视,找到了他的服务地址为:http://cache1.arcgisonline.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer
从地址上看,应该是中国也布了一个服务器,以前了解到, 这个服务已经完全做过切片了,不知是否是这样。
3.在知道服务地址后,剩下的工作就是如何通过CAD窗口当前范围计算出相应的比例尺,这个还涉及到DPI的换算过程。通过确定比例尺,再计算出CAD当前范围内应该获取 的行和 列的图片号,再确定图片的坐标点以及缩放就能在CAD中正常显示了。

如果不设置CAD的环境变量IMAGEFRAME,则会导致图与图之间有黑边的问题。这个问题可以通过将IMAGEFRAME的值设置为0进行处理,或者用以下的代码:
// 删除光栅图像边框 public static void RemoveRasterImageFrame() { try { DocumentCollection dc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager; Database db = HostApplicationServices.WorkingDatabase; using (Transaction trans = db.TransactionManager.StartTransaction()) { DBDictionary dNod = (DBDictionary)trans.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead); RasterVariables rv = null; string imgV = "ACAD_IMAGE_VARS"; //对应系统变量IMAGEFRAME if (dNod.Contains(imgV)) { ObjectId rvObjId = dNod.GetAt(imgV); DBObject dbObj = trans.GetObject(rvObjId, OpenMode.ForWrite); rv = dbObj as RasterVariables; //isNewRaster = false; // rv.Erase(); //rv = new RasterVariables(); //isNewRaster = true; WorkLog.LogInfo("存在 ACAD_IMAGE_VARS"); } else { rv = new RasterVariables(); WorkLog.LogInfo("不存在 ACAD_IMAGE_VARS"); dNod.UpgradeOpen(); dNod.SetAt(imgV, rv); try { trans.AddNewlyCreatedDBObject(rv, true); } catch (System.Exception innterEx) { } } rv.ImageFrame = FrameSetting.ImageFrameOff; trans.Commit(); } } catch (System.Exception ex) { } }
经过处理后,就能正常显示了。

还能通过鼠标的缩放以及平移来动态刷新数据,与浏览地图网站的效果是一样的。
至于如果将SDE图层中的点线面要素与CAD中的要素实现相互转换以及对符号渲染的支持,以后再细说。
PS:中间的白条是别的程序死机导致的,一时无法清除。在此影响观看,说声抱歉。
浙公网安备 33010602011771号