APP下载

AutoCAD中动态浏览谷歌卫星地图的方法与应用

2012-01-10徐昌荣周春波张广弟

江西理工大学学报 2012年3期
关键词:窗体栅格应用程序

徐昌荣,周春波,张广弟

(江西理工大学建筑与测绘工程学院,江西赣州341000)

AutoCAD中动态浏览谷歌卫星地图的方法与应用

徐昌荣,周春波,张广弟

(江西理工大学建筑与测绘工程学院,江西赣州341000)

谷歌卫星地图免费且分辨率高,是不可多得的卫星影像数据,在AutoCAD中动态浏览谷歌卫星地图,有助于提高在AutoCAD平台上进行设计与规划的效率.文中对实现该方法所涉及的关键技术进行了深入剖析,在Visual Studio 2010平台下采用C#语言进行AutoCAD二次开发,最后实现了一个可以动态浏览谷歌卫星地图的插件,该插件允许用户浏览任意区域的谷歌卫星地图,并可将指定区域的卫星图片插入到AutoCAD中,以便进一步应用.将该插件应用于赣州市某工业园GPS控制网的布设中,取得了较好的效果.

AutoCAD;谷歌卫星地图;二次开发;插件;动态浏览

0 引言

AutoCAD具有优秀的绘图功能,特别是其通用性、具有多种工业标准和开放的体系结构,使其被广泛应用于土木建筑、城市规划、测绘勘察和设计制造等诸多行业.用户可通过AutoCAD支持的任意开发方式开发适用于本行业的专业软件,目前已有许多基于AutoCAD开发的行业软件被广泛使用.谷歌卫星地图是谷歌公司发布的一种免费的网络地图服务(Web Map Service,WMS),用户既可以通过GoogleMap网页或Google Earth软件对其进行浏览,亦可以利用Google提供的一系列API开发自己的应用程序.由于谷歌卫星影像具有分辨率高、现势性好以及免费等优点,目前已有许多基于谷歌卫星地图的应用,这些应用一般分为以下两种:一种是将谷歌卫星影像下载至本地计算机后再进行应用,例如,工程人员利用谷歌卫星影像进行道路选线或设计等工作[1-2];另一种是基于Google Maps API开发B/S或C/S架构的系统,其中B/S架构的系统较多,因为谷歌地图本身就是一种网络地图服务,用户可以之构建类似于WebGIS的系统,从而无需购买昂贵的GIS系统[3-4].C/S架构的桌面系统则可以满足用户不同的需求,杨帆等[5]研究了桌面应用程序嵌入Google Map及其交互方法,并开发了一个基于GPS的远程实时定位监测软件;李木梓等[6]对诸如Google Map的网络地图集成于GIS桌面系统的方法进行研究,实现了独立桌面系统与独立网站的连接.Google Map与AutoCAD相结合将会给使用AutoCAD软件进行规划设计的工程师们带来很大的便利,可获得的高分辨率谷歌卫星影像将使他们的工作变得高效而轻松.然而却很少看到针对这一问题的讨论,因此,有必要对此进行研究并将其应用到生产实践中.

AutoCAD Civil 3D是一款面向土木工程设计的软件产品,Civil 3D中具有导入Google Earth图像的功能,允许用户将Google Earth图像导入到当前的DWG图形中.但该功能必须在事先安装了Google Earth软件并打开的情况下才能生效,并且导入的Google Earth图像仅仅是Google Earth当前地图的截图,不能达到用户对高分辨率卫星影像的要求.为此,我们在AutoCAD中开发一个插件,以更方便、实用的方式实现谷歌卫星地图的动态浏览与插入,具体方法是:将谷歌卫星地图嵌入到窗体应用程序中,再在AutoCAD中自由调用该窗体应用程序,并实现AutoCAD与窗体应用程序之间的交互,如插入指定区域的卫星影像等.可利用Autodesk Raster Design功能模块对插入后的卫星影像进行后续处理.Raster Design提供了一整套用于光栅图像的工具,允许用户对栅格图像进行浏览、操作和分析,以满足对栅格图像的应用需求.下面对其中所涉及的关键技术及其应用进行探讨.

1 关键技术

1.1 谷歌卫星地图嵌入AutoCAD应用程序及其交互

首先,解决Google Map如何嵌入AutoCAD应用程序的问题.Google Map嵌入AutoCAD其实质是将Google Map嵌入Windows窗体应用程序,我们知道,Google Map是谷歌公司提供的一种网络地图服务,用户只有在网页中才能使用Google Map地图服务,而现在要实现在窗体应用程序中调用网络服务,这就要用到.NET提供的WebBrowser控件,该控件提供给用户类似于IE浏览器的功能,使用WebBrowser控件可以在Windows窗体应用程序中承载网页以及支持浏览器的其他文档.例如,可以使用WebBrowser控件在应用程序中提供基于HTML的集成用户帮助或Web浏览功能.此外,还可以使用WebBrowser控件向Windows窗体客户端应用程序添加基于Web的现有控件.在这里,只需要用到在WebBrowser控件中承载自定义的HTML网页的功能.谷歌卫星地图嵌入窗体应用程序的具体实现步骤是:①创建一个HTML的Web页面,该页面调用Google Map网络地图服务,用于显示谷歌卫星地图,并将其放置在程序文件夹中;②在Windows窗体应用程序中创建一个WebBrowser控件,将其URL属性设置为HTML文件所在的位置,如本文中为“file:\E:\AutoCAD_Googlemap\AutoCAD_Googlemap\ShowMap.htm”.当打开Windows窗体时,WebBrowser控件就会导航至自定义的HTML页面,通过调用地图服务显示谷歌卫星地图,此外,开发者可以创建HTML页面时,利用JavaScript脚本语言自定义一些实用的地图用户控件,如设置标注、距离量测等功能.

其次,解决谷歌卫星地图如何与AutoCAD进行交互的问题.谷歌卫星地图与AutoCAD进行交互的本质是HTML与Windows窗体应用程序之间的通信,可以通过WebBrowser控件的Document属性操作HTML页面中的内容,该属性包含一个HtmlDocument对象,向当前页提供对HTML文档对象模型(DOM)的托管访问.该属性与ObjectForScripting属性组合使用时,对在应用程序代码与网页中的动态HTML(DHTML)代码之间实现双向通信十分有用,在应用程序中可以使用Document属性调用脚本代码方法.脚本代码可以通过window.external对象访问应用程序,该对象是用于主机访问的内置DOM对象,它映射到为ObjectForScripting属性指定的对象.例如本文开发的插件有地图查询的功能,即将地图漫游至用户所输入的经纬度或能够解析的地名.在HTML中定义一个goto脚本函数,该函数用来实现将地图的中心位置设置为输入的经纬度:

function goto(lat,lng)

{

map.setCenter(new google.maps.LatLng(lat,lng));

map.setZoom(13);

}

要在windows窗体中调用这个方法就要进行如下工作,首先引用System.Runtime.InteropServices类库,并在窗体类前面添加“[ComVisible(true)]”代码,其目的是为程序集请求权限,并使得COM组件对应用程序可见[6],这样才能在C#窗体程序中调用JavaScript中的方法;其次在窗体构造函数或其Load事件处理程序中添加代码:mapBrowser.ObjectForScripting=this,目的是将窗体类自身用于脚本对象,即HTML中的脚本代码可访问该窗体对象.此时,windows窗体就可以通过WebBrowser.Document的InvokeScript方法来调用HTML中定义的goto函数:

object obj=mapBrowser.Document.InvokeScript("goto",new object[]

{Convert.ToDouble(txtlat.Text),Convert.ToDouble(txtlng.Text.ToString())});

Windows窗体亦可以通过WebBrowser的DocumentText属性调用HTML中未定义的脚本函数,此处不再赘述.并且HTML页面可以调用windows窗体中定义的方法,例如文中开发的插件中允许用户查询折线的距离,用户点击地图输入折线上各点,折线的长度信息会显示在Google Map API所提供的信息框中.若在HTML中定义一个函数来计算两点之间的距离,这显然不符合要求,因为事实证明,用JavaScript进行高精度计算会导致浏览器异常甚至崩溃,为了保证程序的稳定性,在窗体类中编写一个DDZTFS(point1,point2)方法,DDZTFS采用白塞尔法大地主题反算进行距离求解,椭球参数则是采用WGS84椭球,实现由两点的经纬度求取距离,再在JavaScript脚本中调用该方法.以下代码是HTML脚本中调用DDZTFS求解折线的距离:

var distance=0;

var num=path.getLength();

if(num>1)

{

for(i=0;i<num-1;i++)

{

var d=window.external.DDZTFS(path.

getAt(i).lat(),path.getAt(i).lng(),path.getAt(i

+1).lat(),path.getAt(i+1).lng());//调用窗

体类方法求取折线的距离

distance+=d;

}}

1.2 谷歌卫星地图的下载

Google向用户提供的地图数据和卫星影像数据,最终给用户使用并在Web浏览器上显示的都是栅格图像.文中主要获取谷歌卫星地图数据,对于矢量地图数据本文不予详述.这些卫星影像数据以WGS84为空间参考,投影方式为等角正切圆柱投影,即常用的墨卡托投影[7].Google Maps提供了0到17共18个缩放等级,其中0级最为详细.这些影像数据采用图像切片技术,将各个缩放等级的全球数据分割成大小为256×256像元大小的图片,用户可以通过获取这些切片图来获取Google卫星影像图.图1所示为Google Maps的运行机制,从图中可以看出,客户端浏览器向Google Maps服务器发出HTTP请求,服务器返回地图切片数据并显示到用户的浏览器中.

图1 Google Maps运行机制

上面已提到,谷歌卫星地图按照不同的比例尺被分割为一定大小的地图切片,而这些地图切片是可以被客户端下载获取的[6].要获取指定区域的谷歌卫星地图的切片,就需要深入了解Google Maps的运行机制.Google Maps将全球的卫星影像按照不同的分辨率进行切割并保存,用户在浏览某一区域的卫星影像时,服务器只需调用对应分辨率的卫星影像图切片,这样可以减少内存占用以及提高客户端响应速度.用户可以通过HTTP请求向Google Maps服务器请求卫星影像数据,如:http://kh.google.com/kh?n=404&v=8&t=qsts,其中,参数“v”表示图源数据的版本,参数“t”表示卫星地图的图片编号,它由“q”、“r”、“s”和“t”四个字符组合而成,如图2所示为Google Map的地图编号规则.对于已知某一区域的经纬度范围将如何获取该区域指定缩放等级的所有的图片编号,可参考文献[8],文中不再详述.获得了这些地图切片的编号就可以很容易地将其下载到本机上,并提供给用户后续使用.

图2 Google Map的地图编号规则

1.3 AutoCAD中卫星图片的定位

卫星图片下载至本地后,用户可以将其插入到AutoCAD中以便下一步使用.我们知道,谷歌卫星地图其本身具有位置信息,但由于其空间参考是WGS84坐标系,投影方式采用横轴墨卡托投影,而我国一般采用北京54或西安80坐标系,投影方式则是高斯-克吕格投影,因此谷歌卫星影像的位置信息并不能在项目中直接使用,需要通过第三方软件(如ArcGIS、ERDAS等)对其进行空间配准,再将其定位至AutoCAD中.假设下载的谷歌卫星地图已经进行了空间配准,下面就如何在AutoCAD中对其准确定位进行探讨.

ArcGIS、ERDAS等软件一般采用附加同名定位文件的方式保存栅格图像的定位信息,所以可以通过栅格图像的定位文件将其定位到AutoCAD中,下面以一幅在ArcGIS上配准后的赣州市某地区谷歌卫星地图的定位文件为例(见表1)进行说明:

表1 栅格图像定位文件说明

设图像上某一点的像点坐标为(x,y),其对应的地理坐标为(X,Y),两者之间存在如下数学关系[9-10]:

由公式(1)可知,a、e分别代表像元在东方向和北方向的分辨率,即每个像元表示的实际距离;c、f表示图像的左上角像元中心所对应的地理东坐标和北坐标;b、d两个参数表示坐标转换后图像存在一定的旋转和缩放关系.要在AutoCAD中定位栅格图像,就要将其定位文件中的参数转换成AutoCAD能够识别的参数,将栅格图像插入AutoCAD时通过设置图像实体对象的PixelToModelTransform属性实现图像的定位定向[11],然而这个属性值是只读属性,我们无法对其进行写操作,这种方法也就行不通.经研究发现,图像实体对象的另外一个可读写属性Orientation可间接实现栅格图像的定位,该属性为CoordinateSystem3d类型,其构造函数为

publicCoordinateSystem3d(Point3dorigin,Vector3d xaxis,Vector3d yaxis);

Origin是一个三维点对象,决定了图像左下角的空间坐标;xaxis是一个三维矢量对象,其模为图像宽度方向的长度,其方向为图像宽度的方向;yaxis也是一个三维矢量对象,其模为图像高度方向的长度,其方向为图像高度的方向.将栅格图像定位文件中的参数转换成Orientation属性,这种方法实现起来比较复杂,此外,也可以通过文献[9]中提供的方法实现对栅格图像的定位.在AutoCAD中插入光栅图像的具体步骤为:

(1)创建图像定义对象(RasterImageDef类型对象).首先获取图像词典对象,若没有就新建一个对象,以写方式打开;然后创建一个图像定义对象,加载指定路径的栅格图像,并将其添加到图像词典对象中.

(2)创建图像实体对象(RasterImage类型对象).将图像定义对象的ObjectId属性值赋给图像实体对象的ImageDefId属性,使二者建立关联,并将图像实体对象附加到块表的“模型空间”记录中.

(3)对栅格图像定位定向,通过RasterImage类型的Orientation属性实现栅格地图的定位和定向.至此,完成了在AutoCAD中定位卫星图片的工作.

2 开发实现

AutoCAD采用开放的架构体系,为用户提供了一个可扩展的编程框架,允许用户使用API进行定制开发.AutoCAD为开发者提供了多种应用程序接口,其中.NET API因其开发简单以及开发效率高的优势而被开发者广泛使用,.NET API是AutoCAD在2006年新增的开发工具包,它把面向C++语言的ObjectARX开发包提供的类和函数封装为托管类,开发人员可在.NET框架下使用任何.NET支持的编程语言调用这些类实现自身的功能[12].NET API在拥有C++相匹配的强大功能的同时具有方便易用的特点,是AutoCAD较为理想的二次开发方式[13].

在Visual Studio 2010平台下采用C#语言进行AutoCAD二次开发,实现了可动态浏览谷歌卫星地图的插件.打开插件弹出图3所示的主界面,地图显示的区域为赣州市城区.该插件具有以下几项主要功能:

图3 主界面

(1)动态浏览谷歌卫星地图.通过搜索经纬度或地名,将地图漫游至目标区域,用户可以设置保存需经常查看的区域的位置信息,以便下次启动时自动定位至该区域.另外还可以对地图进行量距、标注、截图保存等一系列操作.

(2)下载指定区域的谷歌卫星影像.用户按住Shift键的同时用鼠标拖出一个矩形框来指定下载区域,弹出图4所示的对话框,可以设置待下载的谷歌卫星影像的级数、投影椭球、投影方式、保存类型等选项,该块卫星影像将会保存在指定的位置,并在同一文件夹下生成一个同名的定位文件.

图4 谷歌卫星影像下载

(3)插入卫星影像.将下载的卫星影像插入到AutoCAD中,根据卫星影像所在文件夹下的同名定位文件,对其进行定位,使该块卫星影像插入至正确的位置上.可利用已安装的Rster Desgin模块对插入的卫星影像进行编辑与处理.

3 应用实例

在GPS控制网施测之前,需要全面掌握控制区域的地形、交通等情况,为充分利用已有的资料,一般需要对该区域已有的地形图和控制点等资料进行收集.然而老地形图的成图时间可能比较久远,现势性不佳,比如图上的某些道路或地形可能已经发生变更,这样可能会给工作带来不便.因此,采用本文开发的谷歌卫星地图浏览插件来辅助完成GPS控制网的布设.首先,通过搜索将地图大致定位到工业园区的位置,观察控制区域的卫星影像,在地图上初步选定符合要求的位置作为GPS点;其次,将控制区域的卫星影像插入到AutoCAD中,绘制GPS控制点的示意分布图,并对控制网进行优化.图5为布设的GPS控制网示意图,共布设6个控制点,控制网的等级是E级,平均边长为2.5 km.此外,还依据卫星地图对水准测量时的行进路线和埋石造标时的行车路线合理安排,达到节省费用的目的.

图5 GPS控制网示意图

4 结束语

文中试图将谷歌卫星地图与AutoCAD软件相结合,充分发挥两者各自的优势,在AutoCAD上开发了一个实用的功能模块,使工程设计人员在工作时可以快速地对目标区域进行可视化地勘察和了解,并可以之完成一些辅助性的工作.实践表明文中所介绍的方法具有一定的应用价值.当然,文中所介绍的方法亦有其局限性,例如网络不存在时该方法不可用.未来笔者将对其进行改进,使其支持更多的网络地图,如天地图、Bing地图等,并能适应离线状态时的应用,笔者相信,除了本文所述的在GPS控制网布设中的应用之外,在AutoCAD中动态浏览网络卫星地图,将会在越来越多需要对目标区域进行可视化观察的领域被广泛运用.

[1]叶丰明,韩正梅.Google Earth在铁路勘测设计中的应用[J].铁道勘察,2009(6):43-46.

[2]郑平元,杨武年.基于AutoCAD的Google Earth图像信息提取及应用[J].地域研究与开发,2011,30(4):132-134.

[3]刘磊,仇菊香,吴国洋.基于Google地图服务的城市地理信息公共服务平台的设计与实现[J].测绘标准化,2011,27(1):10-13.

[4]李垠,左德麟,侯建明,等.基于Google Map的地震综合信息服务系统构建研究[J].大地测量与地球动力学,2011,31(6):118-121.

[5]杨帆,张彩丽.桌面应用程序嵌入Google Map及其交互方法研究[J].陕西科技大学学报,2010(5):80-84.

[6]李木梓,徐柱,黄泽纯,等.网络地图集成于GIS桌面系统的方法及试验[J].地球信息科学学报,2011,13(1):95-101.

[7]崔金红,王旭.Google地图算法研究及实现[J].计算机科学,2007,34(11):193-195.

[8]巫细波,胡伟平.Google Maps运行机制以及应用研究[J].华南师范大学学报:自然科学版,2009(2):106-110.

[9]龚有亮,翟翊,曹歆宏,等.AutoCAD中栅格图像定位研究[J].测绘通报,2011(5):13-15

[10]王强,束炯,张晓沪.一种遥感图像的坐标转换方法[J].测绘科学,2006,31(4):137-139.

[11]郭平波,徐昌荣.基于AutoCAD2000栅格地形图编辑系统的开发[J].南方冶金学院学报,2001,22(3):151-154.

[12]秦洪现,崔惠岚,孙剑,等.Autodesk系列产品培训教程[M].北京:化学工业出版社,2007.

[13]董玉德,赵韩.CAD二次开发理论与技术[M].合肥:合肥工业大学出版社,2009.

Method and application of browsing Google satellite map dynamically on AutoCAD

XU Chang-rong,ZHOU Chun-bo,ZHANG Guang-di

(School of Architectural and Surveying&Mapping Engineering,Jiangxi University of Science and Technology,Ganzhou 341000,China)

Google Satellite Map is a rare kind of satellite imagery data,for it is free and of high resolution.It helps to increase efficiency of designing and planning in AutoCAD if it is possible to browse Google satellite map dynamiclly.The key tecnologies of the method of browsing Google satellite map dynamiclly in AutoCAD is analyzed,and an AutoCAD plugin that can be used to browse Google satellite map dynamiclly has been developed in the Visual Studio 2010 by using C#language.This plugin permits users to scan Google satellite map of any area and insert them into AutoCAD to be applied further more.This plugin is applied to the GPS control network layout of an actual industrial park and a good effect is obtained.

AutoCAD;Google satellite map;secondary development;plugin;scanning dynamiclly

TP75

A

2012-04-27

江西理工大学研究生创新专项资金项目资助(YC11-11)

徐昌荣(1964-),男,教授,主要从事测量数据处理、地理信息系统开发以及软件开发等方面的研究,E-mail:xmap2002@qq.com.

2095-3046(2012)03-0038-05

猜你喜欢

窗体栅格应用程序
基于邻域栅格筛选的点云边缘点提取方法*
删除Win10中自带的应用程序
试谈Access 2007数据库在林业档案管理中的应用
谷歌禁止加密货币应用程序
不同剖面形状的栅格壁对栅格翼气动特性的影响
基于CVT排布的非周期栅格密度加权阵设计
巧设WPS窗体控件让表格填写更规范
动态栅格划分的光线追踪场景绘制
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序