软件是由数据和程序组成,既然做反演系统,那么如何高效且合理的读取数据是一个至关重要的问题。在AE+C#中读取地图数据的代码十分简单,因此此篇分享还加上了将地图文件输出的代码。
还是老规矩,先把相关的引用放上来
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesRaster;
打开文件的内容仅包括矢量和栅格地图文件,mxd文档不知道是什么问题并不能读取,如有实现者,望不吝赐教。其代码如下:
//打开选择文件对话框用于选取图形文件
string fullFilePath; //存储打开文件的全路径
//设置OpenFileDialog的属性,使其能打开多种类型文件
OpenFileDialog openFile = new OpenFileDialog();
openFile.Multiselect = true;
openFile.Filter = "shape文件(*.shp)|*.shp";//设置打开文件对话框的文件过滤器属性
openFile.Filter += "|栅格数据(*.jpg,*.bmp,*.tiff)|*.jpg;*.bmp;*.tiff;*.tif;*.img";
openFile.Title = "打开文件";
if (openFile.ShowDialog() == DialogResult.OK)//打开文件对话框,并判断是否成功打开,若是,执行以下代码块
{
fullFilePath = openFile.FileName;
//获得文件路径
int index = fullFilePath.LastIndexOf("\\");
string filePath = fullFilePath.Substring(0, index);
//获得文件名称
string fileName = fullFilePath.Substring(index + 1);
//加载shape文件
if (openFile.FilterIndex == 1)
{
//打开工作空间工厂
IWorkspaceFactory workspcFac = new ShapefileWorkspaceFactory();
IFeatureWorkspace featureWorkspc;
IFeatureLayer featureLay = new FeatureLayerClass();
//打开路径
featureWorkspc = workspcFac.OpenFromFile(filePath, 0) as IFeatureWorkspace;
//打开类要素
featureLay.FeatureClass = featureWorkspc.OpenFeatureClass(fileName);
featureLay.Name = fileName;//加载到axMapControl中图层的名字,fileName是带有文件后缀字符串,若看着实在不爽,用subString()方法裁剪一下,用法参考上文
//添加图层
axMapControl1.AddLayer(featureLay);
axMapControl1.Refresh();
}
//加载栅格图像(代码与加载shp文件代码类似,不做详细注释)
else if (openFile.FilterIndex == 2)
{
IWorkspaceFactory workspcFac = new RasterWorkspaceFactory();
IRasterWorkspace rasterWorkspc;
IRasterDataset rasterDatset = new RasterDatasetClass();
IRasterLayer rasterLay = new RasterLayerClass();
rasterWorkspc = workspcFac.OpenFromFile(filePath, 0) as IRasterWorkspace;
rasterDatset = rasterWorkspc.OpenRasterDataset(fileName);
rasterLay.CreateFromDataset(rasterDatset);
axMapControl1.ClearLayers();
rasterLay.Name = fileName;
axMapControl1.AddLayer(rasterLay);
axMapControl1.Refresh();
}
}
输出文件的主体是axPageLayoutControl中的图层,输出格式可分为两个部分,即PDF和图片格式,其效果实现,需要在主体窗口上重新打开一个窗口,这就涉及到一个参数传递的问题,但是代码仍然不难,其代码如下:
//这是打开相应输出窗体的代码
private void 图形输出ToolStripMenuItem_Click(object sender, EventArgs e)
{
//打开输出文件窗口
ExportMapForm exportPh = new ExportMapForm(axPageLayoutControl1);//将axPageLayoutCobtrol1作为对象进行传入至ExportMapForm的构造函数中
exportPh.Show();
exportPh.Enabled = true;//设置该窗口可见和可操作
}
以下代码较长,慎入:
AxPageLayoutControl m_Map;//新建axPageLayoutControl变量,用于接收传进来的参数
public ExportMapForm(AxPageLayoutControl m_Map)
{
InitializeComponent();
this.m_Map = m_Map;//通过参数传递将主界面的axPageLayoutControl传递给m_Map
this.Text = "图层输出";
}
private void btnPrint_Click(object sender, EventArgs e)//点击打印Button响应
{
//创建保存文件对话框的实例
SaveFileDialog SaveFile = new SaveFileDialog();
//根据掩码文本框对对话框初始化
switch (comboBox1.SelectedIndex)
{
case 0:
SaveFile.Filter = "bmp文件(*.bmp)|*.bmp";
SaveFile.Title = "保存bmb文件";
break;
case 1:
SaveFile.Filter = "emf文件(*.emf)|*.emf";
SaveFile.Title = "保存emp文件";
break;
case 2:
SaveFile.Filter = "gif文件(*.gif)|*.gif";
SaveFile.Title = "保存gif文件";
break;
case 3:
SaveFile.Filter = "jpg文件(*.jpeg)|*.jpeg";
SaveFile.Title = "保存jpg文件";
break;
case 4:
SaveFile.Filter = "PNG文件(*.png)|*.png";
SaveFile.Title = "保存png文件";
break;
case 5:
SaveFile.Filter = "TIFF文件(*.TIFF)|*.TIFF";
SaveFile.Title = "保存tiff文件";
break;
case 6:
SaveFile.Filter = "PDF文件(*.PDF)|*.pdf";
SaveFile.Title = "保存pdf文件";
break;
}
if (SaveFile.ShowDialog() == DialogResult.OK)
{
//打开保存文件对话框 并选择路径和文件名
SaveFile.AddExtension = true;//设置为自动补充文件扩展名
IExport pExport;
switch (comboBox1.SelectedIndex)//根据掩码文本框的索引值穿件不同的pExport实例并调用Export方法
{
case 0:
pExport = new ExportBMPClass();
Export(pExport, SaveFile.FileName);
break;
case 1:
pExport = new ExportEMFClass();
Export(pExport, SaveFile.FileName);
break;
case 2:
pExport = new ExportGIFClass();
Export(pExport, SaveFile.FileName);
break;
case 3:
pExport = new ExportJPEGClass();
Export(pExport, SaveFile.FileName);
break;
case 4:
pExport = new ExportPNGClass();
Export(pExport, SaveFile.FileName);
break;
case 5:
pExport = new ExportTIFFClass();
Export(pExport, SaveFile.FileName);
break;
case 6:
pExport = new ExportPDFClass();
Export(pExport, SaveFile.FileName);
break;
}
}
}
//输出文件
public void Export(IExport pExport,string path)
{
IActiveView pActiveView;
IEnvelope pPixelBoundsEnv;
int iOutputResolution;
int iScreenResolution;
int hdc;
pActiveView = m_Map.ActiveView;
pExport.ExportFileName =path ;
iScreenResolution = 96;
iOutputResolution = 300;
pExport.Resolution = iOutputResolution;
tagRECT pExportFrame;
pExportFrame = pActiveView.ExportFrame;
tagRECT exportRECT;
exportRECT.left = 0;
exportRECT.top = 0;
exportRECT.right = pActiveView.ExportFrame.right * (iOutputResolution / iScreenResolution);
exportRECT.bottom = pActiveView.ExportFrame.bottom * (iOutputResolution / iScreenResolution);
pPixelBoundsEnv = new EnvelopeClass();
pPixelBoundsEnv.PutCoords(exportRECT.left, exportRECT.top, exportRECT.right, exportRECT.bottom);
pExport.PixelBounds = pPixelBoundsEnv;
hdc = pExport.StartExporting();
pActiveView.Output(hdc, (int)pExport.Resolution, ref exportRECT, null, null);
pExport.FinishExporting();
pExport.Cleanup();
MessageBox.Show("输出文件完成");
}