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:中间的白条是别的程序死机导致的,一时无法清除。在此影响观看,说声抱歉。

 

posted @ 2013-12-23 14:33  嘉轩  阅读(1374)  评论(1)    收藏  举报