AE开发中经常遇到需要将Map、Scene、Globe中的当前场景导出为图片,下面是我总结的导出方法,其中二维的可以导出到内存或硬盘上,还可以导出图片的空间数据文件,三维中只可以导出到硬盘上,附上源码(VB.Net),用法在Summary中写的很详细了,^_^
''' <summary>
''' 二维导出当前场景为图片对象(内存中)
''' </summary>
''' <param name="pActiveView">当前的Activeview</param>
''' <returns>Image对象</returns>
''' <remarks></remarks>
Public Shared Function ExportToBMP(ByVal pActiveView As IActiveView) As System.Drawing.Image
Dim pResolution As Double = pActiveView.ScreenDisplay.DisplayTransformation.Resolution
Dim pExport As IExport = New ExportBMP
pExport.Resolution = pResolution
Dim deviceRECT As tagRECT = pActiveView.ScreenDisplay.DisplayTransformation.DeviceFrame
Dim pDriverBounds As IEnvelope = New Envelope
pDriverBounds.PutCoords(deviceRECT.left, deviceRECT.bottom, deviceRECT.right, deviceRECT.top)
pExport.PixelBounds = pDriverBounds
Dim pCancel As ITrackCancel = New CancelTracker
pActiveView.Output(pExport.StartExporting, pResolution, deviceRECT, pActiveView.Extent, pCancel)
pExport.FinishExporting()
Dim pExportBmp As IExportBMP = pExport
Dim pImage As System.Drawing.Image = System.Drawing.Image.FromHbitmap(pExportBmp.Bitmap)
pExport.Cleanup()
Return pImage
End Function
''' <summary>
''' 二维导出当前场景为图片文件(硬盘上)
''' </summary>
''' <param name="pFilePath">图片全路径</param>
''' <param name="pExportPic">图片格式的对象(形如IExportBMP)</param>
''' <param name="pActiveView">当前的视图</param>
''' <param name="pCheckWorldfile">是否导出图片的空间数据文件(Worldfile)</param>
''' <param name="pResolution">图片分别率,默认值为96</param>
''' <remarks></remarks>
Private Sub ExporttoPIC(ByVal pFilePath As String, ByVal pExportPic As IExport, ByVal pActiveView As IActiveView, Optional ByVal pCheckWorldfile As Boolean = False, Optional ByVal pResolution As Double = 0)
If pResolution = 0 Then pResolution = pActiveView.ScreenDisplay.DisplayTransformation.Resolution
Dim pExport As IExport = pExportPic
pExport.ExportFileName = pFilePath
pExport.Resolution = pResolution
Dim deviceRECT As tagRECT = pActiveView.ScreenDisplay.DisplayTransformation.DeviceFrame
Dim pDriverBounds As IEnvelope = New Envelope
pDriverBounds.PutCoords(deviceRECT.left, deviceRECT.bottom, deviceRECT.right, deviceRECT.top)
pExport.PixelBounds = pDriverBounds
Dim pCancel As ITrackCancel = New CancelTracker
pActiveView.Output(pExport.StartExporting, pResolution, deviceRECT, pActiveView.Extent, pCancel)
''导出数据空间文件的语句必须放在StartExporting和FinishExporting之间,否则无效
If TypeOf pExport Is IExportImage Then
If pCheckWorldfile Then
Dim pWorldFile As IWorldFileSettings = pExport
pWorldFile.OutputWorldFile = True
pWorldFile.MapExtent = pActiveView.Extent
Dim pWorldFile2 As IWorldFileSettings2 = pExport
pWorldFile2.MapRotation = pActiveView.ScreenDisplay.DisplayTransformation.Rotation
End If
End If
pExport.FinishExporting()
pExport.Cleanup()
End Sub
''' <summary>
''' 三维导出当前场景为图片文件(硬盘上)
''' </summary>
''' <param name="pFilePath">图片全路径</param>
''' <param name="ExportType">自定义的一个枚举,表示是Scene还是Globe</param>
''' <param name="ImageType">导出图片的类型BMP或JPEG</param>
''' <remarks></remarks>
Private Sub ExporttoPIC(ByVal pFilePath As String, ByVal ExportType As wsExportControlType, ByVal ImageType As esri3DOutputImageType)
Select Case ExportType
Case wsExportControlType.wsExportScene
m_SceneHookhelper.ActiveViewer.GetScreenShot(ImageType, pFilePath)
Case wsExportControlType.wsExportGlobe
m_GlobeHookhelper.ActiveViewer.GetScreenShot(ImageType, pFilePath)
End Select
End Sub
附上空间数据格式的说明:
第一种格式:
1、X-Scale(一个像元的大小)
2、旋转项
3、旋转项
4、负的Y-Scale(一个像元的大小)
5、转换项,即左上角X坐标
6、转换项,即左上角Y坐标
第二种格式:
1、地图单元中的一个象素在X方向上的X分辨率尺度
2、平移量
3、旋转量
4、地图单元中的一个象素在Y方向上的Y分辨率尺度的负值
5、象素1,1(左上方)的X地坐标
6、象素1,1(左上方)的Y地坐标
第三种格式(EN):
1、pixel X size
2、rotation about the Y axis (usually 0.0)
3、rotation about the X axis (usually 0.0)
4、negative pixel Y size
5、X coordinate of upper left pixel center
6、Y coordinate of upper left pixel center
第四种格式:
1、行方向每一个删格点多少米
2、X方向旋转角度
3、Y方向旋转角度
4、列方向每一个删格点多少米
5、左上点x坐标
6、左上点y坐标
第一种和第三种基本上一样的,第一种说的有点简单了!
一个jgw文件的例子:
0.05410594 A
0.0000 D
0.0000 B
-0.05410594 E
25.023009 C
102.766439 F
A=X-Scale(一个像元的大小)
E=负的Y-Scale(一个像元的大小)
B,D=旋转项
C,F=转换项,即左上角X坐标与Y坐标
通常用四点来进行影像校正,假设影像没有扭转,即旋转项为0
说明:这个例子所用的坐标系统是WGS84
对于A、B、C和F的计算在网络上有许多说法。有点混乱!
这里简单的说明一下,我采用的计算方法:
1、确定影像的两个角的坐标:
需要确定影像地图文件的左下角坐标和右上角坐标
这里我没有带如具体的数据,以变量来说明问题了
左下角坐标:(x1,y1)
右上角坐标:(x2,y2)
影像地图的像元行数:col
影像地图的像元列数:row
2、确定影像文件的左上角的坐标:
左上角坐标:(x1,y2)
3、确定旋转项:
旋转项一般取0.000000
4、计算x方向与y方向的像元大小:
x方向的像元大小:(x2-x1)/col
y方向的像元大小:(y2-y1)/row*(-1)
5、最后jgw文件的数据就为:
(x2-x1)/col
0.000000
0.000000
(y2-y1)/row*(-1)
x1
y2
注意:本例是基于WGS84坐标系统的!
posted on 2008-05-28 14:06
王者之魂 阅读(569)
评论(0) 编辑 收藏