AE开发20210513之打开personalgeodatabase、栅格数据加载、accees数据(personalgeodatabase)加载、cad数据加载

复习与巩固

.gdb基于文件系统。无论是哪一种数据,理解关系
数据集的关系,有一个对象,dataset,featureDataset
featureclass和featurelayer关系。

前者是数据集,后者是一个图层,任何一个layer要想表达数据,必须要有一个引用的class,一个class可以被多个图层引用。

链接的数据源是class,但显示的是layer,一个图层必须要有一个数据集,但是一个数据集可以被多个图层引用。

featureclass是空间表而不是纯表,personalgeodatabase是一个空的数据库,可以把同样坐标范围的数据集,可以放在同一个数据集,featuredataset的创建。

层级关系:
workspace对应地理数据库
地理数据库下对应要素数据集的集合
剩下的都是单一的featureclass,在数据库当中就是featureclass,可以用数据集进行管理,或者在一个数据库中单独存在,形成多个featureclass

访问一个数据库,这个数据库无法new,是一个普通类。
创建它的需要工作空间工厂,但这个也是个普通类,但是他有子类,可以进行工作空间打开。还有一个arcinfo的,一个cad的,(PPT)
在这里插入图片描述
访问不规则三角网,就需要访问TinWorkSpaceFactory。

文本文件也可以是一个数据库。
工作空间工厂对象,创建好后,由他进行工作空间的打开,即创建。

打开一个personalgeodatabase

https://blog.csdn.net/lz576825608/article/details/7891753
https://blog.csdn.net/shuer_2017/article/details/78759487

在这里插入图片描述

栅格数据加载

在这里插入图片描述

 private void openRasterToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "jpg file|*.jpg|bmp file|*.bmp|tiff file|*.tif";//前面是一个提示,弹出的描述,后面是过滤
            dlg.Multiselect = false;
            dlg.Title = "Open image file";
            //调用对话框
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                //栅格数据加载,就要创建栅格图层
                //作业:查找raterlayer
                //featurelayer.fatureclass=自己的featureclass
                //这个不同
                string pathfile = dlg.FileName;
                int index = pathfile.LastIndexOf('\\');//找到最后一个斜杠的位置
                string path = pathfile.Substring(0, index);//从0开始去取,一直取到最后一个
                string name = pathfile.Substring(index + 1);

                //axMapControl1.AddShapeFile(path, name);//注意文件格式

                //安装文件夹下,arcgis,有一个F:\ArcGIS 10.4\DeveloperKit10.4\Diagrams

                IWorkspaceFactory pWorkspaceFect = new RasterWorkspaceFactory();//创建一个可以进行哪一类数据访问的工作空间工厂的创建,如栅格数据工作空间工厂的创建
                //引用类库,发生冲突,可以删除一些重复的库
                IWorkspace pworkspace = pWorkspaceFect.OpenFromFile(path, 0);//用工作空间工厂对象,的OpenFrom方法,打开指定文件夹,相当于把工作空间创建了
                //暴露出的第一个接口,是一个通用的接口,矢量数据访问,用的是IFeatureWorkspace,那么是否有raster的呢
                //打开栅格数据集,:rasterWorkSpace
                //怎么访问这个接口呢,答:结构查询
                IRasterWorkspace pRaterWrk = pworkspace as IRasterWorkspace;
                //工作控件对象有很多功能,要访问其他接口,需要用暴露出来的接口去访问其他接口,用于其他能力的获取
                //pRaterWrk.OpenRasterDataset(name);
                //查RasterDataset,pRaterWrk.OpenRasterDataset(name);返回的是IRasterDataset
                IRasterDataset pRasterDataset= pRaterWrk.OpenRasterDataset(name);
                //查rasterlayer相关接口和属性方法
                //先暴露Ilayer接口,通用接口,对所有层都有作用
                ILayer player = new RasterLayer();
                //有无对栅格层进行访问操作的接口呢,用结构查询去查
                IRasterLayer pRasterLayer = player as IRasterLayer;
                pRasterLayer.CreateFromDataset(pRasterDataset);
                //此时就把栅格层,就把找到的栅格数据加载出来了,剩下的就是加载到地图里面了
                axMapControl1.AddLayer(player);//player prasterlayer都是指向同一个对象,但是这个地方需要一个ILayer接口
                axMapControl1.Refresh();//刷新

            }
        }

1.第一步,利用OpenFileDialog打开文件对话框

https://blog.csdn.net/u012507170/article/details/90007675

 OpenFileDialog dlg = new OpenFileDialog();

2.制作文件过滤器
Filter: 获取或设置当前文件名筛选器字符串,例如,“文本文件(.txt)|.txt|所有文件(.)||.”
FilterIndex 在对话框中选择的文件筛选器的索引,如果选第一项就设为1
RestoreDirectory 控制对话框在关闭之前是否恢复当前目录
FileName:第一个在对话框中显示的文件或最后一个选取的文件
Title 将显示在对话框标题栏中的字符
AddExtension 是否自动添加默认扩展名
CheckPathExists 在对话框返回之前,检查指定路径是否存在
DefaultExt 默认扩展名
DereferenceLinks 在从对话框返回前是否取消引用快捷方式
ShowHelp 启用"帮助"按钮
ValiDateNames 控制对话框检查文件名中是否不含有无效的字符或序列

https://blog.csdn.net/weixin_29061425/article/details/112938000?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162091486316780357286590%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162091486316780357286590&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-112938000.pc_search_result_hbase_insert&utm_term=dlg.Multiselect+%3D+false%3B
https://blog.csdn.net/dengluzhyong/article/details/51523263

 dlg.Filter = "jpg file|*.jpg|bmp file|*.bmp|tiff file|*.tif";//前面是一个提示,弹出的描述,后面是过滤
 dlg.Multiselect = false;
 dlg.Title = "Open image file";

3.弹出【文件打开】对话框,如果用户操作时点击【OK】的话,就执行此条件分支内的代码。

if (dlg.ShowDialog() == DialogResult.OK)
            {
			}

4.获取数据的名称和路径

https://blog.csdn.net/holyrong/article/details/1752672
https://www.jb51.net/article/70888.htm

string pathfile = dlg.FileName;
int index = pathfile.LastIndexOf('\\');//找到最后一个斜杠的位置
string path = pathfile.Substring(0, index);//从0开始去取,一直取到最后一个
string name = pathfile.Substring(index + 1);

C#中String类的几个方法(IndexOf、LastIndexOf、Substring):

https://www.cnblogs.com/netserver/archive/2009/01/04/1368414.html

思考参数的意义。
转义符和字符串的截取。在这里插入图片描述

注意打开的文件格式,如果选错格式,可能会出现“文件名无效”的情况。

//axMapControl1.AddShapeFile(path, name);//注意文件格式

6.查看“对象模型图”方法扩展:
安装文件夹下,arcgis,有一个文件夹内部有。如:
F:\ArcGIS 10.4\DeveloperKit10.4\Diagrams

7.创建工作空间工厂,然后利用工作空间的OpenFromFile方法打开文件夹,即创建成功“工作空间”。

IWorkspaceFactory pWorkspaceFect = new RasterWorkspaceFactory();//创建一个可以进行哪一类数据访问的工作空间工厂的创建,如栅格数据工作空间工厂的创建
                //引用类库,发生冲突,可以删除一些重复的库
                //接口是对不同类别的进行访问,访问形式是不一样的,工作空间工厂的访问和摸索是不一样的
                IWorkspace pworkspace = pWorkspaceFect.OpenFromFile(path, 0);//用工作空间工厂对象,的OpenFrom方法,打开指定文件夹,相当于把工作空间创建了
                                                                             //基于工作空间工厂对象,这个接口里面具有的一个方法,一个OpenFromFIle方法,内存中创建出来WorkSpace对象
                                                                             //回到对象模型图里面去创建,创建谁呢?调用OpenFormFIle方法,打开了目录,相当于创建了对象
                                                                             //有了WorkSpace对象,就可以生成的,创建这个对象的接口,最基础的接口是Workspace,有了这些接口可以实现不一样的能力
                                                                             //这些接口都指向这个workspace对象,调用一些方法

//暴露出的第一个接口,是一个通用的接口,矢量数据访问,用的是IFeatureWorkspace,那么是否有raster的呢
                //打开栅格数据集,:rasterWorkSpace
                //怎么访问这个接口呢,答:结构查询

8.创建图层,显示数据。

IRasterWorkspace pRaterWrk = pworkspace as IRasterWorkspace;
                //工作控件对象有很多功能,要访问其他接口,需要用暴露出来的接口去访问其他接口,用于其他能力的获取
                //pRaterWrk.OpenRasterDataset(name);
                //查RasterDataset,pRaterWrk.OpenRasterDataset(name);返回的是IRasterDataset
                IRasterDataset pRasterDataset = pRaterWrk.OpenRasterDataset(name);
                //查rasterlayer相关接口和属性方法
                //先暴露Ilayer接口,通用接口,对所有层都有作用
                ILayer player = new RasterLayer();
                //有无对栅格层进行访问操作的接口呢,用结构查询去查
                IRasterLayer pRasterLayer = player as IRasterLayer;
                pRasterLayer.CreateFromDataset(pRasterDataset);
                //此时就把栅格层,就把找到的栅格数据加载出来了,剩下的就是加载到地图里面了
                axMapControl1.AddLayer(player);//player prasterlayer都是指向同一个对象,但是这个地方需要一个ILayer接口
                axMapControl1.Refresh();//刷新

9.别忘记最后需要刷新。

提示:

参加比赛,菜单项要自己再去设计

查RasterLayer

https://zhidao.baidu.com/question/329745026038646725.html

在GIS里 数据 主要分为两大类:栅格数据和矢量数据。
它们的区别主要体现在存储方式上。而在二次开发上一般并不用总是考虑数据的具体格式,而是要考虑数据的类型。
像 .tif .jpg .bmp等都属于栅格(Raster)数据,而.shp .dwg等则是矢量(Feature)数据。所以,要打开 tif格式的影像 应选择 IRasterLayer接口。

在这里插入图片描述
在这里插入图片描述

查IRasterDataset

https://blog.csdn.net/kone0611/article/details/48518901

查rasterlayer相关接口和属性方法

1、根据文件名添加栅格数据
根据文件名添加栅格数据主要是使用IRasterLayer接口,通过IRasterLayer接口的CreateFromFilePath方法从已知Raster数据的文件路径来创建一个IRasterLayer,然后将该对象添加到Map中即可。
如下代码:

private void 添加栅格数据_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFile = new OpenFileDialog();
string fileName;

openFile.Title = "添加栅格数据";
openFile.Filter = "IMG图像(*.img)|*.img|TIFF图像(*.tif)|*.tif|所有文件(*.*)|*.*";
openFile.ShowDialog();
fileName = openFile.FileName;

IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromFilePath(fileName);
axMapControl1.AddLayer(rasterLayer, 0);
}
catch
{
MessageBox.Show("添加栅格数据错误!");
}
}

2、从数据集中添加

**ArcGIS中最常用的文件型有GRID、TIFF、ERDAS IMAGE等,这几种栅格数据的工作空间也是所在的文件夹。打开栅格数据时需要使用栅格工作空间工厂(RasterWorkspaceFactory),然后再使用IRasterWorkspace接口的打开栅格数据集方法即可打开一个栅格数据集。**在打开栅格数据集时,如果数据格式为是ESRI GRID,那么OpenRasterDataset()方法的参数为栅格要素集的名称,如果数据格式为TIFF格式,那么该方法的参数为完整的文件名,即要加上.tif扩展名,例如OpenRasterDataset(“hillshade.tif”)。下面代码为打开GRID格式的栅格数据:

private void 从数据集中添加Raster_Click(object sender, EventArgs e)
{
IWorkspaceFactory rasterWorkspaceFactory = new RasterWorkspaceFactoryClass();
IRasterWorkspace rasterWorkspace = (IRasterWorkspace)rasterWorkspaceFactory.OpenFromFile(@"E:/雅砻江/Data", 0);
IRasterDataset rasterDataset = rasterWorkspace.OpenRasterDataset("newdem");

IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromDataset(rasterDataset);
axMapControl1.AddLayer(rasterLayer, 0);
}

3、获取Raster范围
本例中主要用到IRasterProps接口的Extent属性,如下图所示:

由于接口IRasterProps与接口IRaster都可以通过Raster类实现,Raster类所包含的接口如下如所示:
IRaster又可以通过IRasterLayer接口的Raster属性来获取Raster对象,所以只需先通过IRasterLayer接口指定Raster图层。如下代码:

private void 获取Raster范围_Click(object sender, EventArgs e)
{
ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据
IRasterLayer rasterLayer = (IRasterLayer)pLayer;
IRaster pRaster = rasterLayer.Raster;
IRasterProps pRasterProps = (IRasterProps)pRaster;
MessageBox.Show("Raster数据的范围为:/nXmax=" + pRasterProps.Extent.XMax.ToString()
+ "/nXmin=" + pRasterProps.Extent.XMin.ToString()
+ "/nYmax=" + pRasterProps.Extent.YMax.ToString()
+ "/nYmin=" + pRasterProps.Extent.YMin.ToString());
}

4、读取Raster像素值

读取Raster像素值主要通过IRaster接口的Read方法在Raster上读取指定位置的像素块(PixelBlock),然后通过像素块的GetVal方法获取指定Band中位置的像素值。
首先我们来看一下IPixelBlock接口的GetVal方法,其语法如下:

public object GetVal( int plane, int X, int Y);

第一个参数为指定的Band序号,如果该Raster数据只有一个Band,则该处值为0;
第二个参数和第三个参数分别用来指定获取像素块中哪一个位置的像素值,如果都为0,则表示获取像素块左上角处的像素值。

IPixelBlock.GetVal(0,0,0)

IRaster接口具有下列方法和属性:

其中,CreateCursor方法是用来创建一个游标,CreatePixelBlock方法是根据指定像素块大小来创建一个像素块,Read方法则用于读取Raster中指定位置的像素块。

IRaster接口的Read方法具有两个参数,如下:

public void Read (IPnt tlc, IPixelBlock block);

第一个参数用于指定获取像素块的位置,第二个参数为像素块。

值得注意的是,此处使用的指定获取像素块位置,其值的范围为0到Raster的行数和列数,而不是地图范围

举例说明,如一个Raster数据是由60006000个像素块组成,它所表示的地图范围为E95°~E100°、N30°~N35°,即每个像素块的大小为0.00008333°0.00008333°,通过IRasterProps接口的MeanCellSize方法可以获取每个像素单元的大小。使用IRaster接口的Read方法时,指定获取像素块的位置是从0~6000,而不是E95°~E100°或N30°~N35°,所以,如果要获取指定位置的像素值大小,还需要将地图坐标转换成Raster数据中像素块的相对坐标。
如下代码:

private void 读取Raster像素值_Click(object sender, EventArgs e)
{
ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据
IRasterLayer rasterLayer = (IRasterLayer)pLayer;
IRaster pRaster = rasterLayer.Raster;
IRasterProps pRasterProps = (IRasterProps)pRaster;

IPnt pnt = new PntClass();
pnt.SetCoords(10, 5);

IPnt pntSize = new PntClass();
pntSize.SetCoords(1, 1);

IPixelBlock pixelBlock = pRaster.CreatePixelBlock(pntSize);

pRaster.Read(pnt, pixelBlock);
object obj = pixelBlock.GetVal(0, 0, 0);
MessageBox.Show(Convert.ToUInt32(obj).ToString());
}

其中,获取的像素块位置为(10, 5)。若要通过地图坐标转换成Raster相对坐标,首先需要确定Raster的插入点位置,在此以Raster的左上角为插入点,该点对应的地图坐标应为(IRasterProps.Extent.XMin,IRasterProps.Extent.YMax),其在Raster相对坐标为(0,0)。对于任一地图坐标(mapX,mapY),像素块大小为IRasterProps.MeanCellSize().X和IRasterProps.MeanCellSize().Y。

由于地图坐标的Y方向与Raster相对坐标的方向相反,所以该地图坐标(mapX,mapY)对应于Raster中的相对坐标为:(mapX -IRasterProps.Extent.XMin)/IRasterProps.MeanCellSize().X和(IRasterProps.Extent.YMax - mapY)/IRasterProps.MeanCellSize().Y。

如下代码,在Map控件的点击时间中添加获取Raster像素值的功能:

private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据
IRasterLayer rasterLayer = (IRasterLayer)pLayer;
IRaster pRaster = rasterLayer.Raster;
IRasterProps pRasterProps = (IRasterProps)pRaster;

double mapPntX, mapPntY;
mapPntX = pRasterProps.Extent.XMin;
mapPntY = pRasterProps.Extent.YMax;
double cellSizeX, cellSizeY;
cellSizeX = pRasterProps.MeanCellSize().X;
cellSizeY = pRasterProps.MeanCellSize().Y;

IPnt pnt = new PntClass();
pnt.SetCoords((e.mapX - mapPntX) / cellSizeX, (mapPntY - e.mapY) / cellSizeY);

IPnt pntSize = new PntClass();
pntSize.SetCoords(1, 1);

IPixelBlock pixelBlock = pRaster.CreatePixelBlock(pntSize);

pRaster.Read(pnt, pixelBlock);
object obj = pixelBlock.GetVal(0, 0, 0);
MessageBox.Show(Convert.ToUInt32(obj).ToString());
}

1、根据文件名添加栅格数据

根据文件名添加栅格数据主要是使用IRasterLayer接口,通过IRasterLayer接口的CreateFromFilePath方法从已知Raster数据的文件路径来创建一个IRasterLayer,然后将该对象添加到Map中即可。

如下代码:

private void 添加栅格数据_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog openFile = new OpenFileDialog();
string fileName;

openFile.Title = "添加栅格数据";
openFile.Filter = "IMG图像(*.img)|*.img|TIFF图像(*.tif)|*.tif|所有文件(*.*)|*.*";
openFile.ShowDialog();
fileName = openFile.FileName;

IRasterLayer rasterLayer = new RasterLayerClass();
rasterLayer.CreateFromFilePath(fileName);
axMapControl1.AddLayer(rasterLayer, 0);
}
catch
{
MessageBox.Show("添加栅格数据错误!");
}
}

2、从数据集中添加
ArcGIS中最常用的文件型有GRID、TIFF、ERDAS IMAGE等,这几种栅格数据的工作空间也是所在的文件夹。打开栅格数据时需要使用栅格工作空间工厂(RasterWorkspaceFactory),然后再使用IRasterWorkspace接口的打开栅格数据集方法即可打开一个栅格数据集。在打开栅格数据集时,如果数据格式为是ESRI GRID,那么OpenRasterDataset()方法的参数为栅格要素集的名称,如果数据格式为TIFF格式,那么该方法的参数为完整的文件名,即要加上.tif扩展名,例如

OpenRasterDataset("hillshade.tif")

3、获取Raster范围

由于接口IRasterProps与接口IRaster都可以通过Raster类实现,Raster类所包含的接口如下如所示。

IRaster又可以通过IRasterLayer接口的Raster属性来获取Raster对象,所以只需先通过IRasterLayer接口指定Raster图层。

如下代码:

private void 获取Raster范围_Click(object sender, EventArgs e)
{
ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据
IRasterLayer rasterLayer = (IRasterLayer)pLayer;
IRaster pRaster = rasterLayer.Raster;
IRasterProps pRasterProps = (IRasterProps)pRaster;
MessageBox.Show("Raster数据的范围为:/nXmax=" + pRasterProps.Extent.XMax.ToString()
+ "/nXmin=" + pRasterProps.Extent.XMin.ToString()
+ "/nYmax=" + pRasterProps.Extent.YMax.ToString()
+ "/nYmin=" + pRasterProps.Extent.YMin.ToString());
}

,CreatePixelBlock方法是根据指定像素块大小来创建一个像素块,Read方法则用于读取Raster中指定位置的像素块。**

IRaster接口的Read方法具有两个参数,如下:

public void Read (IPnt tlc, IPixelBlock block);

第一个参数用于指定获取像素块的位置,第二个参数为像素块。

5、导出指定范围的Raster
导出指定范围的**Raster主要通过IRasterLayerExport接口或者IExtractionOp接口来实现。**下面先以IRasterLayerExport接口为例来介绍:

Export方法就是将Raster导出的函数,Extent为导出的Raster的范围,RasterLayer为要导出的Raster图层,SpatialReference为导出Raster的空间参考。

首先来看一下Export方法,如下所示:

public IRasterDataset Export (IWorkspace pWorkspace, string newname, string Format);

第一个参数pWorkspace为导出Raster所在的工作空间(即导出文件所在路径);

第二个参数newname为导出Raster的文件名,该参数中必须包括导出数据类型的扩展名,如导出格式为img的Raster,它的名称为RasterOut,则参数newname应该为“RasterOut. img”;

第三个参数为导出Raster的数据格式,如下:
格式
使用的名称(Format)
Imagine

“IMAGINE Image"TIFF"TIFF"GRID"GRID"JPEG"JPG"JP2000"JP2"BMP"BMP"PNG"PNG"GIF"GIF"PCI Raster"PIX"X11 Pixmap"XPM"PCRaster"MAP"Memory Raster"MEM"HDF4"HDF4"BIL"BIL"BIP"BIP"BSQ"BSQ"Idrisi Raster Format"RST"Geodatabase Raster"GDB”

如下代码:

private void 导出指定范围的Raster_Click(object sender, EventArgs e)
{
ILayer pLayer = axMapControl1.get_Layer(0);//假定第一个图层为Raster数据
IRasterLayer rasterLayer = (IRasterLayer)pLayer;
 
IRaster pRaster = rasterLayer.Raster;
IRasterProps pRasterProps = (IRasterProps)pRaster;
 
IRasterLayerExport rLayerExport = new RasterLayerExportClass();
rLayerExport.RasterLayer = rasterLayer;
rLayerExport.Extent = pRasterProps.Extent;//设置提取栅格数据的范围即为Raster数据的范围
 
rLayerExport.SpatialReference = pRasterProps.SpatialReference;// 设置当前栅格数据的投影信息
IWorkspaceFactory pWF = new RasterWorkspaceFactoryClass();
 
SaveFileDialog saveDG = new SaveFileDialog();
saveDG.Title = "导出Raster数据";
saveDG.Filter = "Imagine(*.img)|*.img|"
+ "TIFF(*.tif)|*.tif|"
+ "GRID(*.*)|*.*|"
+ "JPEG(*.jpg)|*.jpg|"
+ "BMP(*.bmp)|*.bmp|"
+ "PNG(*.png)|*.png|"
+ "GIF(*.gif)|*.gif|"
+ "Geodatabase Raster(*.gdb)|*.gdb";
saveDG.ShowDialog();
 
string filePath = "", fileName = "", outputFormat="";
filePath = saveDG.FileName;
fileName = Microsoft.VisualBasic.Strings.Right(filePath, filePath.Length - filePath.LastIndexOf(@"/") - 1);
filePath = Microsoft.VisualBasic.Strings.Left(filePath, filePath.LastIndexOf(@"/"));
 
IWorkspace pRasterWorkspace = pWF.OpenFromFile(filePath, 0);
switch (saveDG.FilterIndex)
{
case 1:
outputFormat = "IMAGINE Image";
break;
case 2:
outputFormat = "TIFF";
break;
case 3:
outputFormat = "GRID";
break;
case 4:
outputFormat = "JPG";
break;
case 5:
outputFormat = "BMP";
break;
case 6:
outputFormat = "PNG";
break;
case 7:
outputFormat = "GIF";
break;
case 8:
outputFormat = "GDB";
break;
}
IRasterDataset outGeoDataset = rLayerExport.Export(pRasterWorkspace, fileName, outputFormat);
}

上面设置导出Raster的范围为Raster数据的范围,用IRasterLayerExport接口导出Raster数据时要求导出的范围(即Extent)为矩形。

使用IExtractionOp接口可以导出圆形、多边形、矩形等范围的Raster数据

accees数据加载(personalgeodatabase)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

 private void openPersonageodatabaseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "access database file|*.mdb";//前面是一个提示,弹出的描述,后面是过滤
            //后缀不要加空格,以免格式错误
            dlg.Multiselect = false;
            dlg.Title = "Open access file";
            //调用对话框
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string filename = dlg.FileName;
                if (filename != "")
                {
                    //帮助文档中去查找一下,找到所需的类库,添加引用,删除类库,可以删后面的那个
                    IWorkspaceFactory pWorkFct = new AccessWorkspaceFactory();
                    IWorkspace pWorksapce = pWorkFct.OpenFromFile(filename, 0);
                    //工作空间工厂,access数据库就打开了,但是数据库当中有

                    //相当于枚举,但这就是数据集的集合:
                    IEnumDataset pEnumdataset = pWorksapce.get_Datasets(esriDatasetType.esriDTAny);//加载所有数据
                    pEnumdataset.Reset();
                    //pEnumdataset.Next();
                    //一个个向下找,直到返回空值,说明到最后了
                    IDataset pDataset = pEnumdataset.Next();
                    //返回数据集,判断是否非空
                    while (pDataset != null)
                    {
                        //判断这个类别是什么
                        if (pDataset.Type == esriDatasetType.esriDTFeatureClass)//如果选择的是featureclass,就可以直接加载到地图上
                        {
                            IFeatureClass pFeatureClass = pDataset as IFeatureClass;
                            //创建一个栅格层,然后栅格层指向这个数据,进行显示
                            IFeatureLayer pFeatureLayer = new FeatureLayer();
                            pFeatureLayer.FeatureClass = pFeatureClass;
                            axMapControl1.AddLayer(pFeatureLayer);
                        }
                        //如果是别的类别呢?
                        else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)//有无 子数据集
                        {
                            //我返回的是一个dataset,有一个属性,就是subsets
                            //返回的也是一个IDataset,其实next返回的是我们对象模型图中看到的Dataset和workspace是组成关系,我有多个,每次返回dataset对象,这个位置返回的是接口,=
                            //以便暴露出IDataset接口,根据接口类别,判定对应哪一种类型的数据,进行判断,访问子数据集
                            IEnumDataset IsEnumDataset = pDataset.Subsets;//指向子数据集
                            //这个Enum也有很多子数据集
                            IsEnumDataset.Reset();
                            IDataset IsDataset = IsEnumDataset.Next();//指向第一个
                            IGroupLayer pGroupLayer = new GroupLayer();

                            while (IsDataset != null)
                            {
                                if (IsDataset.Type == esriDatasetType.esriDTFeatureClass)
                                {
                                    IFeatureClass pFeatureClass = IsDataset as IFeatureClass;
                                    //创建一个栅格层,然后栅格层指向这个数据,进行显示
                                    IFeatureLayer pFeatureLayer = new FeatureLayer();
                                    pFeatureLayer.FeatureClass = pFeatureClass;
                                    pGroupLayer.Add(pFeatureLayer as ILayer);//若接口类别,不一致,可以做一个接口查询,做强制转换
                                    axMapControl1.AddLayer(pFeatureLayer);
                                }
                                IsDataset = IsEnumDataset.Next();
                            }
                            axMapControl1.AddLayer(pGroupLayer as ILayer);//做强制转换
                        }

                        pDataset = pEnumdataset.Next();//这个一定要有,避免死循环,每次返回当前指针指向的数据集

                    }
                    axMapControl1.Refresh();//刷新
                    //datasets属性,数据集是不是都放在这里面,数据集返回的是一个什么呢?IEnumDataset这样一个接口,代表一个数据集的集合
                }
            }
            //快捷键:ctrl+K+E   调整格式
        }

1.选择文件

            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "access database file|*.mdb";//前面是一个提示,弹出的描述,后面是过滤
            //后缀不要加空格,以免格式错误
            dlg.Multiselect = false;
            dlg.Title = "Open access file";

2.判断文件是否为空
3.创建工作空间工厂,并利用其OpenFrom方法创建工作空间
4.我们想加载数据库中所有数据,于是

 IEnumDataset pEnumdataset = pWorksapce.get_Datasets(esriDatasetType.esriDTAny);//加载所有数据
                    pEnumdataset.Reset();
                    //pEnumdataset.Next();
                    //一个个向下找,直到返回空值,说明到最后了
                    IDataset pDataset = pEnumdataset.Next();
。
。
。

第一个Next是指向第一个数据,判断是否是我们想要的类型

5.设置循环判断是否为空,即是否没数据了
while(pDataset!=null)
{}
6.featureclass类的选择。

if (pDataset.Type == esriDatasetType.esriDTFeatureClass)//如果选择的是featureclass,就可以直接加载到地图上
                        {
                            IFeatureClass pFeatureClass = pDataset as IFeatureClass;
                            //创建一个栅格层,然后栅格层指向这个数据,进行显示
                            IFeatureLayer pFeatureLayer = new FeatureLayer();
                            pFeatureLayer.FeatureClass = pFeatureClass;
                            axMapControl1.AddLayer(pFeatureLayer);
                        }

7.esriDTFeatureDataset子数据集的选择。
补充:
featuredatasat管理的数据,放在一个Group里面一个组里面一个Group类
esriDTFeatureDataset,把其中的所有数据,建成一个组,加入进去。

else if (pDataset.Type == esriDatasetType.esriDTFeatureDataset)//有无 子数据集
                        {
                            //我返回的是一个dataset,有一个属性,就是subsets
                            //返回的也是一个IDataset,其实next返回的是我们对象模型图中看到的Dataset和workspace是组成关系,我有多个,每次返回dataset对象,这个位置返回的是接口,=
                            //以便暴露出IDataset接口,根据接口类别,判定对应哪一种类型的数据,进行判断,访问子数据集
                            IEnumDataset IsEnumDataset = pDataset.Subsets;//指向子数据集
                            //这个Enum也有很多子数据集
                            IsEnumDataset.Reset();
                            IDataset IsDataset = IsEnumDataset.Next();//指向第一个
                            IGroupLayer pGroupLayer = new GroupLayer();

                            while (IsDataset != null)
                            {
                                if (IsDataset.Type == esriDatasetType.esriDTFeatureClass)
                                {
                                    IFeatureClass pFeatureClass = IsDataset as IFeatureClass;
                                    //创建一个栅格层,然后栅格层指向这个数据,进行显示
                                    IFeatureLayer pFeatureLayer = new FeatureLayer();
                                    pFeatureLayer.FeatureClass = pFeatureClass;
                                    pGroupLayer.Add(pFeatureLayer as ILayer);//若接口类别,不一致,可以做一个接口查询,做强制转换
                                    axMapControl1.AddLayer(pFeatureLayer);
                                }
                                IsDataset = IsEnumDataset.Next();
                            }
                            axMapControl1.AddLayer(pGroupLayer as ILayer);//做强制转换
                        }
                        
                        pDataset = pEnumdataset.Next();//这个一定要有,避免死循环,每次返回当前指针指向的数据集
                       
                    }
                    axMapControl1.Refresh();//刷新
                    //datasets属性,数据集是不是都放在这里面,数据集返回的是一个什么呢?IEnumDataset这样一个接口,代表一个数据集的集合


                }    

IEnumDataset控件

https://www.cnblogs.com/Realh/archive/2011/04/20/2022306.html
https://blog.csdn.net/u014533346/article/details/46679553

比如IEnumDataset这个类型,对其进行迭代,需要这样:

IDataset ds = enumDataset.Next();
while( ds != null )
{
// 执行代码
ds = enumDataset.Next();
}

因为IEnumDataset是COM当中的类型,没有实现IEnumerator,也就不能够用foreach遍历,更不能享受Linq带来的便利用法。
下面开始对IEnumDataset做了封装,使之实现IEnumerator接口。

首先创建一个新的类,实现IEnumerator, IEnumerable:
publicclassDatasetEnumerator : IEnumerator, IEnumerable
{
IEnumDataset e;
IDataset value = null;

public DatasetEnumerator(IEnumDataset e)
{
this.e = e;
}
······
实现IEnumerable以及他的父接口IEnumerable:

publicIDataset Current {
get { return value; }
}
object System.Collections.IEnumerator.Current {
get { return value; }
}
publicbool MoveNext() {
return (value = e.Next()) != null;
}
publicvoid Reset() {}
实现IEnumerator以及父接口IDisposable, IEnumerator:
publicIEnumerator GetEnumerator() {
returnthis;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
returnthis;
}
publicvoid Dispose() { }
大功告成,我们再做一个扩展方法,实现从IEnumDataset创建DatasetEnumerator:
staticpublicclassExtensionMethods
{
staticpublicDatasetEnumerator GetEnumerator(thisIEnumDataset e)
{
returnnewDatasetEnumerator(e);
}
}
可以使用了:

foreach( var ds in enumDataset.GetEnumerator())
{
// 执行代码
}

cad数据加载

常见问题

1.注意打开的文件格式,如果选错格式,可能会出现“文件名无效”的情况。

//axMapControl1.AddShapeFile(path, name);//注意文件格式

2.地图属性控件不显示属性。
解决办法:对TOCC控件属性进行设置,建立与MapControl控件的联系。
3.注意是否类库重复,极可能有不同名,但类库实际上是一个类库的现象出现。若有,则删除一个,一般情况
下是删除小写e开头的那一个

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值