AutoCAD生产平台与GIS系统交互研究

2018-03-15 03:29张小波陈凯石吉宝白晓明陈军胜
城市勘测 2018年1期
关键词:调用切片坐标系

张小波,陈凯,石吉宝,白晓明,陈军胜

(成都市勘察测绘研究院,四川 成都 610081)

1 引 言

测绘地理信息采集生产的平台多基于AutoCAD,早期由于对数据要求不高,在生产平台只进行基本的图形绘制与编辑,随着地理信息技术的发展,在生产环节采集编辑的地理信息要素越来越多,生产时往往需要在外业采集的数据上叠加其他数据进行综合生产。

生产平台若能调用GIS系统的影像及地图服务,将极大地丰富基础数据来源,为数据生产提供便利。Esri官方推出了ArcGIS for AutoCAD插件,其可以使AutoCAD作为ArcGIS Server的客户端加载地图服务,并且可以作为GIS数据结构编辑器来组织CAD数据。其功能虽然强大,但是由于其沿袭专业GIS软件的风格和体系,更侧重GIS数据管理,若用于AutoCAD平台进行生产,缺点十分明显:一是需要手动输入服务路径等相关参数,对使用人员要求较高;二是需要在本地进行投影定义,不利于投影参数保密;三是不具备自动刷新及缓存机制,响应速度慢。

基于此,我们进行了AutoCAD生产平台与GIS系统交互的研究,使AutoCAD生产平台能够直接调用ArcGIS发布的服务,虽然功能不及ArcGIS for AutoCAD强大,但是对运行效率和易用性方面进行了优化,并将关键参数内置,而且内建缓存机制,达到了比较理想的使用效果。

2 实现方法

服务器端利用ArcGIS Server发布地图服务并进行切片处理;在AutoCAD客户端上开发插件:根据当前窗口的显示范围匹配地图服务的比例尺,按切片规则计算出相应的缓存图片集,将缓存图片插入后置于底层作为底图显示,并进行自动刷新检测,实现实时更新。其基本流程如图1所示。

图1 基本流程

虽然通过ArcGIS Server的REST接口以HTTP指令的形式能够直接获取指定范围的电子地图[1],但是经测试这种方式响应速度相当慢,在本场合不具备实用性,所以需要在客户端另行开发。通过实时获取当前范围和比例,依据ArcGIS Server的切片规则计算当前比例下需要显示的缓存图片,直接从地图服务的缓存目录获取对应的文件,以底图方式拼接显示,同时在本地建立缓存机制,以提高速度。

3 服务器配置

服务器端对需要发布的地图文档正常进行切片即可[2~4],切片完成后,根据客户端调用方式将切片数据设置HTTP,FTP或者文件共享。

需要注意的是ArcGIS Server 10.1之后发布地图服务必须要对Mxd文档添加地图投影文件,用户在调用地图服务时候很容易获取到坐标系参数,不利于参数保密,因而在对外发布地图服务通常使用标准3度带投影。为了保证发布的地图数据位置正确,能和常用的坐标系下数据叠合,需要先在常用坐标系下进行地图发布和切片;接着提取发布数据的范围线,去掉坐标信息,在标准3度带投影下配置mxd文档,必须保证只有mxd文件带有坐标系信息,范围线数据不能带有坐标系信息;然后使用配置好的mxd数据以同样的参数(包括起始点、分辨率、切片大小、级别等)在标准3度带投影下发布地图服务,再把常用坐标系下的地图切片数据拷贝过来,这样发布出来的地图坐标位置就和常用坐标系下坐标位置一致。

4 客户端开发

客户端基本功能是根据切片配置和当前显示范围,获取GIS平台的地图服务作为底图,其核心是缓存图片的计算;由于面对一线生产人员,客户端的易用性与显示速度非常重要,因此加入了自动刷新检测与缓存机制。为了方便与其他功能集成,本次客户端基本的缓存图片计算、显示缓存机制等采用Visual LISP开发,而自动刷新检测采用ObjectARX技术编写反应器回调LISP函数。

4.1 缓存图片计算原理

缓存目录结构如图2所示,在_alllayers文件夹以下,是切片设置的从小到大多个比例尺级别;一个比例尺文件夹下,是切图的“行”文件夹,命名规则是R加上16进制8位行号,不足补0;每行文件夹下就是该行的所有缓存文件了,命名规则是C加上16进制8位列号,不足补0。

图2 缓存目录结构

在缓存目录的conf.xml文件中,保存了切片的参数,其中涉及计算缓存图片的关键参数有切图原点TileOrigin,图片的DPI,每张图片的长度和宽度,各级比例尺及对应地图单位长度。

首先计算当前屏幕显示的比例尺Sins,并与切片参数中的各级比例尺进行比较,匹配最接近的地图比例尺。

式中:Viewsize为按图形单位存储当前视口的高度;ScreensizeY为以像素为单位存储当前视口的高度;Dpitch为显示器点距,根据显示效果取 0.1 mm~0.3 mm。

再根据当前坐标计算缓存图片的行列号:

式中:Row,Col为缓存图片的行列号;x,y为当前坐标;XOrigin,YOrigin为切片原点坐标;TileRows,TileCols为图片的长度和宽度;Resolution为当前比例尺对应的地图单位长度。

同时计算该缓存图片的插入点坐标Inx、Iny,按AutoCAD的规则,取图片的左下角点为插入点,计算公式如下:

Inx=XOrigin+Row×TileRows×Resolution

Iny=YOrigin-(Col+1)×TileCols×Resolution

4.2 自动刷新检测

电子地图随屏幕显示范围自动刷新的功能在GIS系统中可以通过地图控件的事件接口直接调用,但是由于AutoCAD并未直接提供类似功能的接口,因而需要单独开发。

基于ObjectARX编写一个反应器[5~6],获取窗口的中心点坐标,根据窗口长宽计算左下及右上角点坐标进行监视,若窗口显示范围有变化则触发一个事件,运行回调函数进行缓存图片更新。

自定义一个派生于ACED库中AcEdInputPointMonitor类的反应器类DBLCTTooltips,通过重写虚函数monitorInputPoint方法,以便在引发回调事件发生时对应的回调函数能够处理特定的事项。本项目重写的回调函数功能为:当光标移动、输入点等事件发生后,检测当前CAD活动文档的活动视口中心坐标是否移动,若移动了就在CAD命令行输出当前活动视口中心坐标、获得当前视口两个对角点坐标、同时执行CAD本地命令“myfun”。核心功能代码如下:

Acad::ErrorStatus DBLCTTooltips::monitorInputPoint (定义略)

{

struct resbuf rb;

acedGetVar("VIEWCTR",&rb);

if ((s_nowpoint.x == -100000)&&(s_nowpoint.y == -100000)){

s_nowpoint.x = rb.resval.rpoint[X];

s_nowpoint.y = rb.resval.rpoint[Y];

}

if (((fabs(rb.resval.rpoint[X] - s_nowpoint.x)) > 0) && ((fabs(rb.resval.rpoint[Y] - s_nowpoint.y)) > 0) ){

s_perpoint.x = s_nowpoint.x;

s_perpoint.y = s_nowpoint.y;

s_nowpoint.x = rb.resval.rpoint[X];

s_nowpoint.y = rb.resval.rpoint[Y];

ads_point ptMin;

ads_point ptMax;

GetViewPortBound(ptMin,ptMax);

//调用命令

resbuf *rp = acutBuildList(RTSTR,"c:myfun",RTNONE);

acedInvoke(rp,NULL);

}

return (Acad::eOk) ;

}

由于反应器优先级很高,在AutoCAD中利用鼠标中键执行窗口平移缩放时,一旦窗口变化即进行更新,不必等到释放鼠标,使用体验与主流GIS平台的电子地图类似。

4.3 显示与缓存机制

为了在客户端实现良好的用户体验,对一些细节进行了相应开发。

显示控制:AutoCAD 2006以后,在当前模型空间的ACAD_SORTENTS数据字典中存储了对象的显示顺序,通过设置缓存图片位于底层以确保待编辑图形始终可见,功能代码如下:

;ImgObj为图片对象

(setqedtab (VL-CATCH-ALL-APPLY

'VLA-GETOBJECT

(LIST edict "ACAD_SORTENTS")))

(setqtestvar (vlax-make-safearray vlax-vbobject '(0 . 0)))

(vlax-safearray-fill testvar (list ImgObj))

(vla-movetobottom edtab testvar)

当前窗口缓存图片计算:计算当前窗口左下及右上角点对应缓存图片的行列号以后,即可得到待插入图片的序列,依次插入即可[7~9];窗口刷新后,通过待插入图片序列与当前显示的序列进行比对,只对变化的图片进行刷新;

本地缓存:在本地建立缓存目录,从服务器获取缓存图片后,在缓存目录备份,下次再调用该图片可直接在本地加载,大大提高速度;

网络检测:网络不通时,客户端直接获取服务器的远程图片需要很长时间才会返回出错信息,在此期间AutoCAD会处于“假死机”状态无法操作,因此程序运行时首先进行网络检测,最简便的方法是获取一张服务器特定路径的问题,若成功则表明网络正常,否则有问题直接提示,检测代码如下:

(vl-catch-all-error-p

(vl-catch-all-apply

'vla-GetRemoteFile

(listutil "ftp://192.168.10.10/layers/_alllayers/test.png" 'tmp :vlax-true)

)

)

图3 AutoCAD与GIS系统交互示例

5 结 语

AutoCAD生产平台中调用GIS系统的地图服务,可以方便地实现矢量图和影像图等电子地图的叠加比对分析,广泛应用于中小比例尺地形图更新、专项调查、生产质检等方面,取得了良好的效果。

[1] 黄梦龙. 瓦片地图技术在桌面端GIS中的应用[J]. 地理空间信息,2011(4):149~151.

[2] 郭艺歌,王新云,李学斌. 基于ArcEngine的CAD图中GIS栅格影像数据的自动处理[J]. 地理空间信息,2012,10(6):89~90,93,3,2.

[3] 苏旭明,谭建成. WebGIS中瓦片地图关键技术研究[J]. 北京测绘,2012(2):9~12.

[4] 张广春,仲伟政. 基于ArcGIS Engine组件实现瓦片地图的应用[J]. 测绘通报,2015(3):115~116,120.

[5] 施立瑾,张贺忻. 面向对象的AutoCAD开发工具ARX Notification机制及Reactor类的使用[J]. 智能建筑与城市信息,2001(11):59~61.

[6] 赵清清,王建勇. ARX反应器智能关联技术在BIM施工图中的应用[J]. 土木建筑工程信息技术,2013(6):111~114.

[7] 张鹏程. 常用CAD与GIS平台影像自动配准方法及实现[J]. 地理空间信息,2010,8(4):28~31.

[8] 徐昌荣,周春波. 在AutoCAD中浏览Google卫星地图的方法研究[J]. 测绘通报,2013(1):77~79.

[9] 冯连好,单湛波,陈振宇. 地形图栅格化批量处理的实现与应用[J]. 东北测绘,2012(3):211~212,216.

猜你喜欢
调用切片坐标系
独立坐标系椭球变换与坐标换算
核电项目物项调用管理的应用研究
网络切片标准分析与发展现状
LabWindows/CVI下基于ActiveX技术的Excel调用
解密坐标系中的平移变换
坐标系背后的故事
基于系统调用的恶意软件检测技术研究
基于SDN与NFV的网络切片架构
肾穿刺组织冷冻切片技术的改进方法
冰冻切片、快速石蜡切片在中枢神经系统肿瘤诊断中的应用价值比较