ArcGIS Engine开发中数据库的加载

1、加载个人地理数据库数据

个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB。个人地理数据库支持单用户编辑,不支持版本管理。在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中。加载个人地理数据库的用到的接口为:IFeatureDataset、IEnumDataset。

1.IFeatureDataset接口:继承自IDataset接口,在其基础上增加一个 创建要素类的功能CreateFeatureClass。

2.IEnumDataset接口:用于访问个人地理数据库中的所有数据集成员,有Reset和Next两个方法。Reset方法重置数据集序列,使指针位于第一个数据集之前;Next方法获取枚举序列的 下一个数据集。

实现的思路:

1)床架AccessWorkspaceFactory类的实例。

2)用IWorkspaceFactory接口的OpenFromFile方法打开.mdb数据集的工作空间,对工作空间里面的数据进行加载。

代码1:对加载数据库的方法进行函数封装

 #region
//封装加载空间数据库方法:AddAllDataset函数,以便对其他空间数据库加载时直接调用。
private void AddAllDataset(IWorkspace pWorkspace, AxMapControl mapControl)
{
IEnumDataset pEnumDataset = pWorkspace.get_Datasets(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTAny);
pEnumDataset.Reset();
//将Enum数据集集中的数据一个一个地读到dataset 中
IDataset pDataset = pEnumDataset.Next();
//判断数据集是否有数据
while (pDataset != null)
{
if (pDataset is IFeatureDataset)//要素数据集
{
IFeatureWorkspace pFeatureWorkspac = (IFeatureWorkspace)pWorkspace;
IFeatureDataset pFeatureDataset = pFeatureWorkspac.OpenFeatureDataset(pDataset.Name);
IEnumDataset pEnumDataset1 = pFeatureDataset.Subsets;
pEnumDataset1.Reset();
IGroupLayer pGroupLayer = new GroupLayerClass();
pGroupLayer.Name = pFeatureDataset.Name;
IDataset pDataset1 = pEnumDataset1.Next();
while (pDataset1 != null)
{
if (pDataset1 is IFeatureClass)//要素类
{
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspac.OpenFeatureClass(pDataset1.Name);
if (pFeatureLayer.FeatureClass != null)
{
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
pGroupLayer.Add(pFeatureLayer);
mapControl.Map.AddLayer(pFeatureLayer);
}
}
pDataset1 = pEnumDataset1.Next();
}
}
else if (pDataset is IFeatureClass)//要素类
{
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureWorkspace.OpenFeatureClass(pDataset.Name);
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
mapControl.Map.AddLayer(pFeatureLayer);
}
else if (pDataset is IRasterDataset)//栅格数据
{
IRasterWorkspaceEx pRasterWorkspace = (IRasterWorkspaceEx)pWorkspace;
IRasterDataset pRasterDataset = pRasterWorkspace.OpenRasterDataset(pDataset.Name);
//影像金字塔的判断和创建
IRasterPyramid3 pRasterPyramid;
pRasterPyramid = pRasterDataset as IRasterPyramid3;
if (pRasterPyramid != null)
{
if (!(pRasterPyramid.Present))
{
pRasterPyramid.Create();//创建金字塔
}
}
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);
ILayer pLayer = pRasterLayer as ILayer;//进行继承
mapControl.AddLayer(pLayer, );
}
pDataset = pEnumDataset.Next();
}
mapControl.ActiveView.Refresh();
//同步鹰眼
// SynchronizeEagleEye();
}
#endregion

代码2:调用个人地理数据库

  ////加载个人地理数据库
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog .Title ="打开PersonGeoDatabase文件";
pOpenFileDialog.Filter = "Personal GeoDatabase(*.mdb)|*.mdb";
pOpenFileDialog.ShowDialog();
string pFullPath = pOpenFileDialog.FileName;
if (pFullPath == "") return;
AccessWorkspaceFactory pAccessWorkspaceFactory = new AccessWorkspaceFactoryClass();
//获取工作空间
IWorkspace pWorkspace = pAccessWorkspaceFactory.OpenFromFile(pFullPath ,);
ClearAllData();
AddAllDataset(pWorkspace,mainMapControl );

2.加载文件地理数据库

文件地理数据库(File GeoDatabase)是以文件夹形式存储各种类型的GIS数据集,可以存储查询和管理空间数据和非空间数据,支持地理数据库的大小为1TB,在不使用数据库管理系统的情况下能够扩展并存储大量的数据,是继个人地理数据库之后esr推出的新的数据管理系统。文件地理数据库支持单用户编辑,不支版本管理。

实现的思路:

1)由于文件地理数据库是以文件夹的形式存在的,因此可以使用FolderBrowserDialog选择文件夹进行加载。首先创建FileGDBWorkspaceFactoryClass类的实例。

2)使用IWorkspaceFactory接口的OpenFromFile方法打开文件地理数据库的工作空间,对工作空间中的文件夹进行加载。

////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if(dlg.ShowDialog ()!=DialogResult .OK ) return ;
string pFullth=dlg.SelectedPath ;
if(pFullth =="") return ;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory=new FileGDBWorkspaceFactoryClass();
ClearAllData ();
//获取工作空间
IWorkspace pWorkspac=pFileGDBWorkspaceFactory .OpenFromFile (pFullth ,);
AddAllDataset (pWorkspac,mainMapControl);

3.加载ARCSDE空间数据库数据

ArSDE(Spatial Database Engine空间数据库引擎)是在现有的关型数据库上进行的空间扩展,它使空间数据能保存在关系数据库中(如oracle,sqlserver中)ArcSDE空间数据库的一个重要的特点就是支持多用户并发操作,并且可以通过版本来表现空间数据编辑的状态。当完成数据编辑后,可将多人的编辑状态进行版版本合并,若多个用户对同一个要素进行了编辑,且编辑的状态不一样,将会出现“版本冲突”,提示用户采用哪一版本的数据。版本最后确定取决于用户对于数据管理的权限。

1、ArcSDE的组成

由ArcSDE服务管理进程、专用服务器进程、ArcSDE客户端三部分组成。

ArcSDE服务器管理进程负责维护ArcSDE和监听来自客户端的链接请求。ARCSDE启动就是ArcSDE服务器管理进程,利用管理员账户管理ArcSDE与RDBMS的连接,处理客户端的连接请求。

专用服务器进程由ArcSDE服务器管理进程创建,用于每一个特定的客户端应用程序与数据库的连接。

ArcSDE客户端通过ArcSDE服务器管理进程和专用服务器进程建立和RDBMS的连接,实现对数据库的操作。

、ArcSDE数据库的连接方式

ArcSDE提供了应用服务器连接和直接连接两种连接方式。当服务器性能较好时可采用应用服务器连接,否则采用直接连接,为了减轻服务器的压力,建议采用直接连接的方式进行连接。

应用服务器连接和直接连接的主要区别是属性参数的设置不同:

1)应用服务器连接参数的设置

服务器(Server):SDE服务器的主机名称。

数据库实例(Instance):安装SDE时选择的端口,默认为5151或esri_sde。

数据库(DataBase).根据不同的DBMS决定是否填写。Oracle系列不用填,而SQlServer需要填写。

用户名(Usename):需要填写

密码(Password):需要填写。

2)直接连接的参数设置

服务器(Server):不用填写

数据库实例(Instance):SDE数据类型,例如:如果是Oracle 11g,则为SDE:Oracle:11g:Orcl。其中orcl为数据库的服务名。

数据库(Database):根据不同的DBMS决定是否填写。

用户名(Username):需要填写

密码(password):需要填写

3)两种连接方式的异同

直接连接就是通过ArcSDE访问数据库,并在本地完成对数据库的各种操作(如空间分析、编辑等):而应用服务器连接就是通过ARCSDE访问数据表后,在服务器端完成对数据的各种操作,再把操作结果返回客户端。因此,即便服务器上SDE服务没有启动,采用直接连接的方式也可以直接访问和操作SED数据库,而应用服务器连接只有在SDE服务器启动后才能访问和操作SDE数据库。

SDE 数据库的加载主要用到IPropertySet接口。属性几何(PropertySet)对象是一个专门用于设置属性的对象,它是一种【名称】——【值】对应的集合,类似于哈希表或字典。

4)实例程序的思路:

① 创建SdeWorkspaceFactoryClas类的实例。

②通过SDE连接的连接属性打开SDE数据库的工作空间,对工作空间里面的数据进行加载。

 private void btnFileDatabase_ItemClick(object sender, ItemClickEventArgs e)
{
////加载文件地理数据库数据
FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
if (dlg.ShowDialog() != DialogResult.OK) return;
string pFullth = dlg.SelectedPath;
if (pFullth == "") return;
//使用esri.arcgis.DataSourseGDB
FileGDBWorkspaceFactory pFileGDBWorkspaceFactory = new FileGDBWorkspaceFactoryClass();
ClearAllData();
//获取工作空间
IWorkspace pWorkspac = pFileGDBWorkspaceFactory.OpenFromFile(pFullth, );
AddAllDataset(pWorkspac, mainMapControl);
}
/// <summary>
/// 服务器连接,以Oracle数据库为例
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByServer_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("192.168.70.110", "esri_sde", "sde", "sde", "", "SDE.DEFAULT");//调用定义的函数 }
/// <summary>
/// 定义函数arcSDEWorkspaceOpen(),用于连接数据库
/// </summary>
/// <returns></returns> private IWorkspace arcSDEWorkspaceOpen(string server, string instance, string user, string password, string database, string version)
{
IWorkspace pWorkSpace = null;
//创建和实例化数据集
IPropertySet pPropertySet = new PropertySetClass();
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("SERVER", server);
pPropertySet.SetProperty("INSTANCE", instance);
pPropertySet.SetProperty("USER", user);
pPropertySet.SetProperty("PASSWORD", password);
pPropertySet.SetProperty("DATABASE", database);
pPropertySet.SetProperty("VERSION", version);
IWorkspaceFactory2 pWorkspaceFactory = new SdeWorkspaceFactoryClass(); try
{
pWorkSpace = pWorkspaceFactory.Open(pPropertySet, );
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return pWorkSpace;
}
/// <summary>
/// 直接连接数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnaddSDEByDriect_ItemClick(object sender, ItemClickEventArgs e)
{
IWorkspace pWorkspace;
pWorkspace = arcSDEWorkspaceOpen("", "sde:oracle11g:orcl", "sde", "sde", "", "SDE.DEFAULT");
//如果工作空间不为空,则进行加载
if (pWorkspace != null)
{
AddAllDataset(pWorkspace, mainMapControl);
} }

四、加载文本文件数据

野外测量的数据是GIS数据的一个主要来源,如GPS、全站仪等仪器测量的数据等,这类数据通常为含有X/Y坐标的Excel文件或者文本文件。

实现的思路:

1)根据Excel或者.txt文件等获取点的坐标信息。

2)根据点的坐标创建ShapeFile图层。

3)加载该shapefile图层。

具体代码:

         /// <summary>
/// 进行函数的声明,调用AxControl控件
/// </summary>
/// 定义函数,并返回值
private AxMapControl buddyMap;
public AxMapControl BuddyMap
{
get { return buddyMap; }
set { buddyMap = value; }
} /// <summary>
/// 创建一个点结构,进行点信息的存储
/// </summary>
struct CPoint
{
public string Name;
public double X;
public double Y;
}
/// <summary>
/// 定义全局变量的数组pColumns用来存储点数据
/// </summary>
List<string> pColumns = new List<string>(); public FormAddtxtData()
{
InitializeComponent();
} private void FormAddtxtData_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 打开文本格式文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOpen_Click(object sender, EventArgs e)
{
OpenFileDialog pOpenFileDialog = new OpenFileDialog();
pOpenFileDialog.Title = "打开测量数据文件";
pOpenFileDialog.Filter = "测量坐标文件(*.txt)|*.txt";
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
txtSource.Text = pOpenFileDialog.FileName;//获取显示文件名
}
}
/// <summary>
/// 将文本格式保存成shape格式,调用刺痛保存文本的函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
SaveFileDialog pSaveFileDialog = new SaveFileDialog();
pSaveFileDialog.Filter = "Shape 文件(*.shp)|*.shp";
if (File.Exists(txtSource.Text))
{
pSaveFileDialog.FileName = System.IO.Path.GetFileNameWithoutExtension(txtSource.Text);//返回不具有返回值的指定路径的文件名
}
if (pSaveFileDialog.ShowDialog() == DialogResult.OK)
{
txtSave.Text = pSaveFileDialog.FileName;
} }
/// <summary>
/// 创建并实例化一个CPoint类型的数组,将所有的点信息进行 存储
/// </summary>
/// <param name="surveyDataFullName"></param>
/// <returns></returns>
private List<CPoint> GetPoints(string surveyDataFullName)
{
try
{
List<CPoint> pList = new List<CPoint>();
char[] charArray = new char[] { ',', ' ', '\t' }; //常用的分隔符为逗号、空格、制位符
//文本信息读取
FileStream fs = new FileStream(surveyDataFullName, FileMode.Open);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string strLine = sr.ReadLine();
if (strLine != null)
{
string[] strArray = strLine.Split(charArray);
if (strArray.Length > )
{
for (int i = ; i < strArray.Length; i++)
{
pColumns.Add(strArray[i]);
}
} while ((strLine= sr.ReadLine())!=null)
{
//点信息的读取
strArray = strLine.Split(charArray);
CPoint pCPoint = new CPoint();
pCPoint.Name = strArray[].Trim();
pCPoint.X = Convert.ToDouble(strArray[]);
pCPoint.Y = Convert.ToDouble(strArray[]); pList.Add(pCPoint);
}
}
else
{
return null;
}
sr.Close();
return pList;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
/// <summary>
/// 封装函数,根据点坐标进行创建shapefile图层
/// </summary>
/// <param name="cPointList"></param>
/// <param name="filePath"></param>
/// <returns></returns>
private IFeatureLayer CreateShpFromPoints(List<CPoint> cPointList, string filePath)
{
int index = filePath.LastIndexOf('\\');
string folder = filePath.Substring(, index);
string shapeName = filePath.Substring(index + );
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, ); IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit;
pFieldsEdit = (IFieldsEdit)pFields; IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef;
pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
//定义坐标系
ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
ISpatialReference pSpatialReference = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954);
pGDefEdit.SpatialReference_2 = pSpatialReference; pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField); IFeatureClass pFeatureClass;
pFeatureClass = pFWS.CreateFeatureClass(shapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IPoint pPoint = new PointClass();
for (int j = ; j < cPointList.Count; j++)
{
pPoint.X = cPointList[j].X;
pPoint.Y = cPointList[j].Y; IFeature pFeature = pFeatureClass.CreateFeature();
pFeature.Shape = pPoint;
pFeature.Store();
} IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.Name = shapeName;
pFeatureLayer.FeatureClass = pFeatureClass;
return pFeatureLayer;
}
/// <summary>
/// 定义一个函数进行验证数据和存储位置是否有效
/// </summary>
/// <returns></returns>
private bool ValidateTxtbox()
{
if (txtSource.Text == "" || !File.Exists(txtSource.Text))
{
MessageBox.Show("测量数据无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
if (txtSave.Text == "" || System.IO.Path.GetExtension(txtSave.Text).ToLower() != ".shp")
{
MessageBox.Show("保存路径无效,请重新选择!", "提示", MessageBoxButtons.OK);
return false;
}
return true;
}
/// <summary>
/// 调用函数,将生成的shape文件加载到mapControl中
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnCreat_Click(object sender, EventArgs e)
{
if (ValidateTxtbox())
{
List<CPoint> pCPointList = GetPoints(txtSource.Text);
if (pCPointList == null)
{
MessageBox.Show("所选择的文件为空,请重新选择!");
}
else
{
//实例化要素图层,进行添加
IFeatureLayer pFeatureLayer = CreateShpFromPoints(pCPointList, txtSave.Text);//传入实参数据
buddyMap.Map.AddLayer(pFeatureLayer);
this.Close();
}
} } private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
}

总结: 由上述ArcGIS Engine加载几种常用的数据源的方法,可以看出ArcGIS Engine加载空间数据一般具有以下的五个步骤:

1)创建数据对应的工作空间工厂(WorkspaceFactory)。

2)使用WorkspaceFactory创建要加载数据的工作空间Workspace。

3)使用Workspace打开并得到图层的数据集。

4)强Dataset赋值给新建图层的数据源。

5)添加图层到MapControl中进行显示。

ArcGIS Engine开发之地图基本操作(4)的更多相关文章

  1. ArcGIS Engine开发之地图基本操作(3)

    地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种: ...

  2. ArcGIS Engine开发之地图基本操作(2)

    地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多 ...

  3. ArcGIS Engine开发之地图基本操作(1)

    ArcGIS提供的各类数据形式以及相应接口 1. 空间数据 在GIS软件中,空间数据有多种不同的形式存在.按照不同的划分标准可以分为矢量数据和栅格数据.GIS格式数据和非GIS格式数据(CAD格式). ...

  4. ArcGIS Engine开发之地图浏览

    地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线 ...

  5. ArcGIS Engine开发之地图导出

    关于地图导出的方法有很多,但是核心技术就那么一点.下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例) 1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成 ...

  6. ArcGIS Engine开发前基础知识(2)

    ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutContro ...

  7. C#,ArcGIS Engine开发入门教程

    C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674  目录(?)[+] 五实现 一 加载A ...

  8. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 —MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  9. ArcGIS Engine开发鹰眼图的功能(基础篇)

    鹰眼是用于调节全视域范围内主地图显示范围情况的副地图.它体现了地图整体与详细局部的关系. 用户可以通过鼠标单击或者画框等动作实现鹰眼与主地图的交互情况. 鹰眼功能的原理是通过主地图窗口的地图控件和鹰眼 ...

随机推荐

  1. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  2. Chrome代码下载及编译

    2-3年前在做客户端开发时,看过CHROME的一部分代码,主要是BASE库相关的.其项目之大,编译时间之长给我留下了深刻的印象. 3年后的最近,想着再读一下其他部分的代码,所以就对其纠结的下载和编译过 ...

  3. 那些年黑了你的微软BUG

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 前言 炎炎夏日,朗朗乾坤,30℃ 的北京,你还在 Coding 吗? 整个 7 月都在忙项目,还加了 ...

  4. express全局安装后无法通过require使用

    今天入门了一下express,首先安装依赖. npm install express -g; npm install body-parser -g; npm install cookie-parser ...

  5. MySQL触发器-条件触发器语法

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...

  6. 基本数据结构(1)——算法导论(11)

    1. 引言     从这篇博客开始,来介绍一些基本的数据结构知识.本篇及下一篇会介绍几种基本的数据结构:栈.队列.链表和有根树.此外还会介绍由数组构造对象和指针的方法.     这一篇主要介绍栈和队列 ...

  7. windows 环境下nginx + tomcat群 + redis 实现session共享

    nginx作为负载均衡根据定义将不同的用户请求分发到不同的服务器,同时也解决了因单点部署服务器故障导致的整个应用不能访问的问题 在加入nginx之后,如果多个服务器中的一个或多个(不是全部)发生故障, ...

  8. 计算机程序的思维逻辑 (40) - 剖析HashMap

    前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用? ...

  9. 使用MATLAB对图像处理的几种方法(下)

     试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...

  10. 【分布式】Zookeeper数据与存储

    一.前言 前面分析了Zookeeper对请求的处理,本篇博文接着分析Zookeeper中如何对底层数据进行存储,数据存储被分为内存数据存储于磁盘数据存储. 二.数据与存储 2.1 内存数据 Zooke ...