在AutoCAD中浏览Google卫星地图的方法研究
2013-04-07徐昌荣周春波
徐昌荣,周春波
(江西理工大学建筑与测绘工程学院,江西赣州 341000)
一、引 言
AutoCAD是一款由Autodesk公司开发的自动计算机辅助设计软件,由于其具有功能强大、实用性强、易二次开发的特点,被广泛应用于建筑、规划、制造业等诸多行业。用户可以通过AutoCAD的二次开发接口开发出适用于本行业的专业软件,如测绘行业中广泛使用的南方CASS软件,以及建筑行业中使用的天正软件均是AutoCAD二次开发的产物。相比于从底层开发一个CAD软件,利用AutoCAD提供的接口进行二次开发所耗费的人力物力都更少,加之AutoCAD强大的功能支撑,这些二次开发软件在各自行业都发挥着巨大的作用。
Google卫星地图是Google公司提供的一种网络地图服务,这些卫星地图覆盖全球的各个角落,在世界诸多城市都可以达到1 m以内的精度[1],且用户可以在Google Map或Google Earth中浏览这些卫星地图。同时,Google允许用户使用它的网络地图服务,用户可以通过其提供的API在自己的网页或应用程序中嵌入Google Map,当每天的请求次数少于50 000次时,这种服务是免费的。这能够满足大部分用户的一般性需求。
在进行城市规划或道路设计等方面的工作时,一般需要事先了解该区域的道路、植被、地形等现状情况,而Google卫星地图平均每半年更新一次,具有较好的现势性,可完成这部分工作。将Google卫星地图等网络地图集成于桌面软件中的研究已有很多,杨帆等人将Google Map集成于桌面软件,用于对敏感目标的追踪[2];李木梓等以Google Map为例实现了将网络地图作为自定义图层的形式集成到GIS桌面系统[3]。而AutoCAD软件是城市规划或道路设计广泛应用的设计软件,若能在AutoCAD中实现Google卫星地图的浏览,设计人员势必能快速地了解设计区域,提高工作效率。基于此,本文对在AutoCAD中浏览Google卫星地图的方法进行了研究,并通过AutoCAD二次开发与Google Map二次开发技术实现了这一功能。
二、AutoCAD二次开发与Google Map二次开发
1.AutoCAD二次开发
AutoCAD为开发者提供了多种应用程序接口,其中.NET API因其开发简单及效率高的优势而被广泛使用。AutoCAD从2006年开始增加了.NET API,该API提供了一系列的托管外包类,是AutoCAD较为理想的二次开发方式。开发人员可在.NET框架下使用.NET支持的任何编程语言进行开发,本文采用C#语言进行AutoCAD的二次开发。
开发人员可以通过两种方式进行AutoCAD.NET的二次开发:一种是通过Visual Studio 2010的AutoCAD 2011 Plug-in模板建立解决方案进行开发,这种方式不需要开发人员手动引用AutoCAD组件库;另一种是在Visual Studio 2010中建立一个解决方案,手动添加需要在开发中用到的组件库,如Ac-DbMgd.dll、AcMgd.dll等,并将 AutoCAD 的执行文件添加到解决方案中且设置为启动项,可实现调试。
2.Google Map二次开发
Google为开发者提供了各种类型的API来实现对Google Map的二次开发,这些API处于不断更新中,Google Maps JavaScript API V3目前是JavaScript API的最新版本。对于之前的版本,开发者需要申请API Key才能获得Google Map的使用权限,而该版本的API用户无需申请API Key即可使用。用户在网页中嵌入以下代码便能使用Google Maps JavaScript API V3开发自己的应用程序
Google卫星地图提供0~17共18个缩放级别的卫星地图,用户在初始化地图时通过设置地图选项(Map Options)来设置初始缩放级别、初始位置及其他内容。而对地图的其他设置可参照Google Maps JavaScript API V3的参考文档,里面提供了各个对象的属性、方法和事件等内容,可帮助用户开发自己的应用程序。另外,用户除了使用API中提供的控件外还可以使用自定义控件。
三、方法与实现
1.方法研究
本文利用上述的AutoCAD.NET API和Google Maps JavaScript API对AutoCAD进行二次开发,主要实现以下两个功能:
1)将Google卫星地图嵌入到窗体应用程序中,使用户能在窗体中实现对Google卫星地图的动态浏览,以及平移、缩放、查询位置、量距等基本的地图操作。
2)在AutoCAD中能自由调用该窗体应用程序,并且两者能实现一些简单的交互,如将当前显示的卫星地图插入到AutoCAD中的指定区域。
实现上述两个功能可分3个步骤:首先,在Auto-CAD中调用窗体程序比较容易实现,利用AutoCAD.NET API的模态对话框可以实现这一功能;其次,将Google卫星地图嵌入到窗体应用程序虽比较复杂,但可以通过创建一个静态的HTML页面来实现,该页面通过JavaScript脚本语言载入Google卫星地图;最后在窗体中创建一个WebBrowser控件,用于浏览该页面,既可实现与在Web浏览器上相同的效果[2],又可通过脚本语言来控制对地图的操作。由此可知,利用C#语言和JavaScript脚本语言编程基本可以实现在AutoCAD中浏览Google卫星地图的功能。
2.功能实现
(1)HTML页面与窗体应用程序交互
如程序中实现查询经纬度或地名来搜索地图的功能,采用在C#窗体程序中调用JavaScript中的方法实现,在Form1类之间添加两段代码
以上两段代码的目的是为程序集请求权限,并使得COM组件对应用程序可见,这样才能在C#窗体程序中调用JavaScript中的方法。
如要实现一个搜索目标位置的功能。首先在HTML中编写一个方法,实现用户输入经纬度或地名,并将地图显示到该位置;然后在窗体的事件方法中通过以下代码来调用脚本中的方法
这样就实现了在窗体类中调用脚本函数的方法。如图1所示,搜索地名“广州”,当前地图显示为广州市区。
图1 搜索目标(地图显示区域为广州市城区)
由于Google Maps JavaScript API V3中并未提供计算两点之间的距离的方法,因此需要在Google Map中自定义一个量距控件,实现测量折线距离的功能。虽然 JavaScript可以描述的数值范围很广,但事实证明,用JavaScript进行高精度计算会导致浏览器异常甚至崩溃[4]。为了保证程序的稳定性,笔者在Form1类中编写了一个方法,以实现由两点的经纬度求取距离的功能,然后在JavaScript中调用该方法,显示测量的距离。下面这段代码演示了如何在JavaScript中调用窗体中定义的方法
在Form1类中定义一个根据两点经纬度计算两点大地线长的方法,该方法采用白塞尔法进行大地主题反算,椭球参数采用WGS-84椭球参数,精度可靠。
(2)AutoCAD与C#窗体交互
该程序中有一个功能是将当前显示的卫星地图插入到AutoCAD的当前图形界面,并利用程序对当前显示的卫星地图进行截图保存,然后将该位置的图像插入到AutoCAD图面中。
在AutoCAD中实现插入光栅图像的功能比较复杂,其具体步骤为:
1)创建图像定义对象(RasterImageDef类型对象)。
2)创建图像实体对象(RasterImage类型对象)。
3)将以上两者关联起来,实现显示栅格图像的功能。
4)对栅格图像定位定向,通过RasterImage类型的Orientation属性实现栅格地图的定位定向[5]。
3.调试运行
首先编译程序,打开AutoCAD,在命令行输入命令“netload”,加载编译好的程序集,输入命令“showmap”,弹出浏览Google Map的主界面(如图2所示)。
图2 主界面(标注位置为江西理工大学建筑与测绘工程学院)
在主界面中可对Google卫星地图进行一些地图的基本操作,如缩放、漫游、量距、添加标记等。用户可通过搜索目标按钮输入经纬度或地名来进行地图的搜索,也可将当前卫星图片保存为本地磁盘中,或通过“导入AutoCAD”按钮将图片插入到AutoCAD的当前绘图窗口中(如图3所示)。
四、结束语
本文实现了在AutoCAD中浏览Google卫星地图的功能,该程序界面整洁、功能实用,可作为规划设计人员的辅助工具。设计人员通过对规划区域Google卫星地图的浏览,可以充分考虑土地的合理利用与节约等因素,通过对周围环境的查看可以较为方便地分析规划部分与整体环境的协调性[6]。该程序已应用于笔者所在学校城市规划专业的城市规划课程设计,获得了较好的评价。
图3 卫星图片插入AutoCAD中
本文通过AutoCAD二次开发与Google Map二次开发技术实现了在AutoCAD中浏览Google卫星地图的功能,但仍然存在需要改进的地方。如何在AutoCAD与Google地图之间实现更多的交互和更多实用的功能,如何实现与数据库的交互等,都是今后研究的重点。
[1] 《Google API大全》编委会.Google API大全:编程·开发·实例[M].北京:电子工业出版社,2009.
[2] 杨帆,张彩丽.桌面应用程序嵌入Google Map及其交互方法研究[J].陕西科技大学学报,2010,28(5):80-84.
[3] 李木梓,徐柱,黄泽纯,等.网络地图集成于GIS桌面系统的方法及试验[J].地球信息科学学报,2011,13(1):95-101.
[4] 冯曼菲.精通Ajax——基础概念、核心技术与典型案例[M].北京:人民邮电出版社,2008.
[5] 龚有亮,翟翊,曹歆宏,等.AutoCAD中栅格图像定位研究[J].测绘通报,2011(5):13-15.
[6] 张瑞.Google Earth在道路及规划设计中的应用[D].武汉:华中科技大学,2007.