基于VB.NET的AutoCAD实时加载正射影像方法研究

2018-11-01 03:15郭雷徐彦中焦明东
城市勘测 2018年5期
关键词:数据文件射影鼠标

郭雷,徐彦中,焦明东

(1.济南市勘察测绘研究院,山东 济南 250013; 2.山东省城市空间信息工程技术研究中心,山东 济南 250013)

1 引 言

数字正射影像(DOM)数据目前广泛应用在测绘地理信息行业各部门,同时具有地图几何精度和影像特征,可以通过ArcGIS等各种专业应用软件自动加载,进行各种分析应用。当前测绘行业广泛使用基于AutoCAD软件开发的地形图生产平台,其成果为标准格式的DWG数据。有时也需要利用正射影像数据作为地形图的底图数据,来进行各种设计和分析,但是AutoCAD软件本身却没有自动加载正射影像数据的功能。

为解决这一问题,本文拟使用VB.NET程序设计语言结合AutoCAD 2010软件进行二次开发,设计一款独立运行的应用程序,通过人机交互的方式,加载正射影像数据到AutoCAD的DWG图形中,并确保坐标正确。程序开发环境使用Microsoft Visual Studio 2008集成开发软件,具有功能强大、界面友好、编译好的应用程序可移植性强等优点,用其开发的独立程序可以很流畅地运行在Windows XP、Win 7等主流操作系统中,比较切合用户的使用体验。

2 程序设计思路

2.1 正射影像数据坐标文件分析

一般一幅标准分幅的数字正射影像成果,除了一个TIFF格式的影像文件,还应有一个记录影像定位坐标信息的文本文件。本文采用的数据为 1∶5 000比例尺标准分幅数字正射影像成果,经坐标转换获得2000国家大地坐标系的坐标信息文件,其坐标信息文件的主要内容如图1所示:

图1 正射影像坐标信息文件格式

不同于一般正射影像成果附带的TFW格式坐标信息文件,本文所使用的坐标信息文件已经明确指定了数字正射影像图的左下角X、Y坐标,右上角X、Y坐标,实际宽度和实际高度,各参数均以米为单位。需要注意的是X和Y为数学坐标(X为东方向,Y为北方向)。

程序设计中加载数字正射影像的函数AddRaster使用方法如下所示:

RetVal = object.AddRaster(ImageFileName,InsertionPoint,ScaleFactor,RotationAngle)

需要正确指定数字正射影像文件名(ImageFileName)、左下角插入点三维坐标(InsertionPoint)、缩放比例(ScaleFactor)、旋转角度(RotationAngle)等参数,然后才能使用此函数插入影像数据。程序设计的思路即转换为如何通过坐标信息文件获取加载影像数据所需要的各种参数。

因为AddRaster函数是利用影像的左下角插入点纵横坐标和缩放比例数值来确定影像的右上角纵横坐标,所以在保持宽高比不变的情况下,缩放比例数值即为数字正射影像数据在DWG图形中的横向实际宽度,也就是本文使用的坐标信息文件中的实际宽度参数。由于仅改变DWG地形图当前比例尺参数,并不会相应改变相关地物要素的实际坐标位置,所以通过这种方法利用坐标信息插入影像数据到地形图以后,总是能够正确插入到实际的地理坐标位置。也就是说这种方法与地形图的当前比例尺没有关系,可以适用于任意比例尺的地形图数据。

2.2 程序界面及功能设计

根据实际需要,设计程序运行界面如图2所示。

图2 程序运行界面

程序主要包括打开地形图文件,指定正射影像数据存放位置,影像插入位置调整,插入影像文件到地形图中等功能。

(1)打开地形图文件:自动启动AutoCAD软件,并打开需要加载正射影像数据的DWG格式地形图文件。前提条件是地形图数据和正射影像数据的平面坐标系统应一致,本例中为2000国家大地坐标系。

(2)指定正射影像数据存放位置:填写正射影像数据在计算机中的存储路径,作为AutoCAD加载正射影像的路径参数。

(3)影像插入位置调整:根据影像首次插入时的位置偏差,进行平移微调,确保下次插入同一影像时定位误差最小。

(4)插入影像文件到地形图:用于在AutoCAD图形界面获取当前鼠标点击位置的坐标信息,并与指定位置的正射影像数据进行后台匹配,实时快速加载影像到图形中叠加显示。

3 关键方法实现

3.1 打开地形图

独立运行的程序需要通过创建对象的方法启动当前计算机中已经安装的AutoCAD软件,根据当初程序设计时引用的AutoCAD类型库文件版本,决定将要启动的AutoCAD软件版本。随着计算机软硬件性能的提高,64位操作系统所占比重已经越来越大,相应地AutoCAD软件也有32位与64位两种,需要根据操作系统的版本选择安装对应的AutoCAD软件。经测试,无论是32位还是64位,AutoCAD 2010软件安装到计算机以后,所创建的类型库文件均为acax18enu.tlb和axdb18enu.tlb,它们一般位于c:program filescommon filesautodesk shared目录中。要通过Microsoft Visual Studio.NET完全访问AutoCAD Automation对象,需要创建acax18enu.tlb和axdb18enu.tlb的引用。

这些引用提供了以下主要交互操作部件:Autodesk.AutoCAD.Interop.dll和Autodesk.AutoCAD.Interop.Common.dll。Interop程序集位于全局程序集缓存中,它们会将Automation对象映射到.NET的对等对象。引用了类型库之后,就可以在Microsoft Visual Studio .NET中声明基于AutoCAD的变量,进而利用它们完成需要的功能和运算。

单击打开地形图按钮,首先启动AutoCAD软件,并打开指定的地形图dwg文件。打开文件的主要代码如下:

Dim cadApp1 As Autodesk.AutoCAD.Interop.AcadApplication

Dim docCAD1 As Autodesk.AutoCAD.Interop.AcadDocument

Dim filePath As String

Dim fileOpen = False

Dim setFilePath = False

……

cadApp1 = New Autodesk.AutoCAD.Interop.AcadApplication

docCAD1 = cadApp1.Documents.Open(OpenFileDialog1.FileName)

3.2 指定正射影像数据文件存放位置

通过文件浏览对话框控件(FolderBrowserDialog)或粘贴输入的方式指定正射影像数据文件的存放位置。需要首先添加此控件到MicroSoft Visual Studio 2008的窗体设计器,然后就可以在程序代码中引用此控件进行处理,获取指定路径信息作为AutoCAD中插入正射影像的路径参数。

3.3 影像插入位置调整

正射影像数据根据坐标信息文件加载到AutoCAD图形中以后,可能与已有正确坐标的地形图数据位置不是完全吻合,例如房角、道路等整体向同一方向偏移一个距离,导致定位存在偏差,不利于地物的判读。此时就需要根据实际情况进行插入点的微调,通过指定东移和北移参数进行调整,将这两个偏移分量数据分别加到正射影像插入定位点的相应坐标分量。在删除先前插入的正射影像数据后,使用新的偏移参数重新执行一次插入操作,就可确保插入位置正确。

为简化使用,规定输入正数代表东移和北移,输入负数代表西移和南移。当然也可以根据实际测量结果只输入其中一个分量数据,默认值0表示不作任何移动。这样的处理方法增加了程序使用的灵活性,可以手工提前纠正偏差太大的正射影像数据,不至于某些批次的数据因定位精度问题而无法使用。

3.4 插入影像文件到地形图中

(1)获取插入点坐标

本文所使用的方法是通过AutoCAD软件,在需要加载影像数据的地形图任一位置点击一下鼠标,获取鼠标点击位置的纵横坐标信息,然后根据此坐标信息去查找影像数据的对应坐标数据文件,从而获取符合条件的正射影像数据文件。获取鼠标点击位置的主要代码为:

Dim returnPnt As Object

'CAD坐标,X为东,Y为北

Dim currX,currY As Double

Me.Hide()

returnPnt = docCAD1.Utility.GetPoint()

'获取鼠标点选位置信息

currX = returnPnt(0)

currY = returnPnt(1)

(2)加载影像数据到地形图中

如果点击鼠标获取的坐标位置落在某幅正射影像数据的左下角和右上角坐标所确定的矩形之间,则代表已经找到合适的正射影像数据文件,将加载此正射影像到地形图中。如果已经遍历了指定文件夹下面的所有坐标数据文件,并没有找到一个符合要求的文件,则认为鼠标位置无对应的正射影像数据,将给出“地形图指定位置无匹配的正射影像文件”消息提示并退出查找,待用户重新指定影像数据存放位置后再执行插入操作。

影像数据加载完成以后,将存放在指定的影像数据图层中,可以通过图层开关控制是否显示,方便浏览使用。加载影像数据的主要代码为:

For Each foundFile As String In My.Computer.FileSystem.GetFiles(filePath,_

FileIO.SearchOption.SearchAllSubDirectories,"*.txt")

Dim fileReader As String

fileReader = My.Computer.FileSystem.ReadAllText(foundFile,_

System.Text.Encoding.Default)

'获取原始影像的四角坐标和缩放比例

If fileReader <> "" Then

array0 = Split(fileReader,Chr(13))

array1 = Split(array0(0)," ")

Xzuoxia = CDbl(array1(3)) - 39000000.0 + CDbl(TextBox2.Text)

array2 = Split(array0(1)," ")

Yzuoxia = CDbl(array2(3)) + CDbl(TextBox3.Text)

array3 = Split(array0(2)," ")

Xyoushang = CDbl(array3(3)) - 39000000.0

array4 = Split(array0(3)," ")

Yyoushang = CDbl(array4(3))

array5 = Split(array0(4)," ")

suofangBiLi = CDbl(array5(2))

End If

'查找用户鼠标点选的位置是否落在某幅影像图的范围内,找到后退出循环

If (Xzuoxia < currX And currX < Xyoushang) And (Yzuoxia < currY And currY < Yyoushang) Then

foundImage = True

insertRaster(0) = Xzuoxia

insertRaster(1) = Yzuoxia

insertRaster(2) = 0

rasterName = Microsoft.VisualBasic.Strings.Left(foundFile,foundFile.Length - 9) + ".tif"

'加载影像数据到当前地形图中

currRaster = docCAD1.ModelSpace.AddRaster(rasterName,insertRaster,suofangBiLi,rotationAngle)

currRaster.Layer = "正射影像-2017"

Exit For

End If

Next

If foundImage = False Then

MsgBox("地形图指定位置无匹配的正射影像文件!")

End If

4 程序使用效果

使用本程序加载正射影像数据到AutoCAD地形图的效果如图3所示,可见影像数据已经以实际坐标正确地叠加到了对应的地形图数据中。可以通过AutoCAD的叠放次序命令选择将正射影像数据放到最底层,便于显示和使用。

图3 程序运行效果

5 结 语

使用本文介绍的方法,可以通过在AutoCAD软件中指定当前地形图的任意位置坐标,实时准确地插入相应位置所在图幅的正射影像数据。可以通过重复执行插入功能,连续插入多幅相邻位置的正射影像数据并确保拼接正确,能够迅速获得大范围的影像加载结果。对于经常需要使用正射影像数据作为工作底图的情况,提高了影像数据加载的速度和效率。通过实际工作中的具体应用,取得了较好的效果。

猜你喜欢
数据文件射影鼠标
常曲率Berwald空间
Progress in Neural NLP: Modeling, Learning, and Reasoning
三参数射影平坦芬斯勒度量的构造
数据文件恢复专题问答
数据文件安全管控技术的研究与实现
SQL数据文件恢复工具
基于已有控制资料的正射影像自动更新
利用矩阵初等变换求二维射影变换
45岁的鼠标
超能力鼠标