实验二 地图数据访问与渲染
一、实验目的
- 熟悉不同数据类型对应的工作空间及其使用;
- 掌握矢量文件、栅格文件、个人数据库以及文件夹数据库的加载;
- 掌握ArcGIS engine 中图层的渲染类型及所用接口;
- 掌握对点、线、面数据的简单渲染。
二、实验仪器与设备
计算机、visual studio 软件、ArcGIS engine 开发包
三、实验内容与步骤
- 矢量数据的加载
ShapeFile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式。加载ShapeFile数据的方式有两种:通过工作空间加载;通过IMapControl接口的AddShapeFile方法加载。
通过工作空间加载ShapeFile文件的实现思路。
(1)创建ShapefileWorkspaceFactory实例pWorkspaceFactory,使用IWorkspaceFactory接口的OpenFromFile方法打开pFeatureWorkspace中存储的基于ShapeFile的工作区;
(2)创建FeatureLayer的实例pFeatureLayer,并定义数据集;
(3)使用IMap接口的AddLayer方法加载pFeatureLayer。
核心代码如下:
Form1.cs:
/// <summary>
/// 打开shape文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonItem3_Click(object sender, EventArgs e)
{
gis3._1.myengineproject readfile = new gis3._1.myengineproject();
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "shape flie|*shp";
if (opendlg.ShowDialog() == DialogResult.OK)
{
IFeatureLayer pfraturelayer = readfile.readshapefilefromfile(opendlg.FileName);
axMapControl1.AddLayer(pfraturelayer as ILayer);
axMapControl1.Refresh();
}
}
MyEngineProject.cs:
/// <summary>
/// shape文件
/// </summary>
/// <param name="fullfilename"></param>
/// <returns></returns>
public IFeatureLayer readshapefilefromfile(string fullfilename)
{
string pathname = System.IO.Path.GetDirectoryName(fullfilename);
string filename = System.IO.Path.GetFileName(fullfilename);
try
{
IWorkspaceFactory pwsf = new ShapefileWorkspaceFactory();
IFeatureWorkspace pws = pwsf.OpenFromFile(pathname, 0) as IFeatureWorkspace;
IFeatureClass pfeatureclass = pws.OpenFeatureClass(filename);
IFeatureLayer pfeaturelayer = new FeatureLayer();
pfeaturelayer.FeatureClass = pfeatureclass;
pfeaturelayer.Name = pfeatureclass.AliasName;
return pfeaturelayer;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return null;
}
}
2.栅格数据的加载
栅格数据是GIS的数据源之一,主要有卫星影像、航空影像、扫描的地图、照片等。常见的栅格数据格式有*.img、.tif和.jpg等,这几种栅格数据的工作空间是其所在的文件夹。添加栅格数据主要用到IRasterPyramid3、IRasterLayer等接口。
加载栅格数据的实现思路
(1)用IWorkspaceFactory接口的OpenFromFile方法获得栅格文件的工作区;
(2)用IRasterWorkspace接口的OpenRasterDataset方法获得栅格文件的数据集,实例化栅格文件对象,并对栅格数据集是否具有金字塔进行判断(这里栅格文件如果不具有金字塔则创建金字塔,可以提高大数据量图像的显示效率);
(3)创建RasterLayer类的实例pRasterLayer,并定义其数据集;
(4)使用MapControl控件的AddLayer方法将pRasterLayer添加.。
核心代码如下:
Form1.cs:
/// <summary>
/// 打开栅格文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonItem4_Click(object sender, EventArgs e)
{
gis3._1.myengineproject readfile = new gis3._1.myengineproject();
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "raster flie|*img|tiff file|*tif";
if (opendlg.ShowDialog() == DialogResult.OK)
{
IRasterLayer prasterlayer = readfile.readrasterlayerfromfile(opendlg.FileName);
axMapControl1.AddLayer(prasterlayer as ILayer);
axMapControl1.Refresh();
}
}
MyEngineProject.cs:
/// <summary>
/// 栅格文件
/// </summary>
/// <param name="fullfilename"></param>
/// <returns></returns>
public IRasterLayer readrasterlayerfromfile(string fullfilename)
{
string pathname = System.IO.Path.GetDirectoryName(fullfilename);
string filename = System.IO.Path.GetFileName(fullfilename);
try
{
IWorkspaceFactory pwsf = new RasterWorkspaceFactory();
IRasterWorkspace pws = pwsf.OpenFromFile(pathname, 0) as IRasterWorkspace;
IRasterDataset prasterds = pws.OpenRasterDataset(filename);
IRasterPyramid3 prasterpryd = prasterds as IRasterPyramid3;
if (prasterpryd != null)
{
if (prasterpryd.Present == false)
{
prasterpryd.Create();
}
}
IRasterLayer prasterlayer = new RasterLayer();
prasterlayer.CreateFromDataset(prasterds);
return prasterlayer;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return null;
}
}
3.个人数据库及文件数据库的加载
加载Personal Geodatabase数据程序实现思路如下:
(1)创建AccessWorkspaceFactory类的实例;
(2)用IWorkspaceFactory接口的OpenFromFile方法打开*.mdb数据集的工作空间,对工作空间里面的数据进行加载。
核心代码如下:
Form1.cs:
/// <summary>
/// 打开个人地理数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonItem5_Click(object sender, EventArgs e)
{
OpenFileDialog opendlg = new OpenFileDialog();
opendlg.Filter = "personal geodatabase|*mdb";
if (opendlg.ShowDialog() == DialogResult.OK)
{
string fullfilename = opendlg.FileName;
gis3._1.myengineproject readfile = new gis3._1.myengineproject();
IMapControl3 m_map = axMapControl1.Object as IMapControl3;
readfile.readdatafrompersonaldatabase(fullfilename, m_map);
axMapControl1.Refresh();
}
}
MyEngineProject.cs:
/// <summary>
/// 个人地理数据库
/// </summary>
/// <param name="fullfilename"></param>
/// <param name="m_map"></param>
public void readdatafrompersonaldatabase(string fullfilename, IMapControl3 m_map)
{
try
{
string pathname = System.IO.Path.GetDirectoryName(fullfilename);
string filename = System.IO.Path.GetFileName(fullfilename);
IWorkspaceFactory pwf = new AccessWorkspaceFactory();
IWorkspace pws = pwf.OpenFromFile(fullfilename, 0);
addl1layers(pws, m_map);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return;
}
}
private void addl1layers(IWorkspace pws, IMapControl3 m_map)
{
IEnumDataset peds = pws.Datasets[esriDatasetType.esriDTAny];
peds.Reset();
IDataset pds = peds.Next();
while (pds != null)
{
if (pds is IFeatureClass)//矢量数据
{
IFeatureWorkspace pfeaturews = pws as IFeatureWorkspace;
IFeatureLayer pfeaturelayer = new FeatureLayer();
pfeaturelayer.FeatureClass = pfeaturews.OpenFeatureClass(pds.Name);
pfeaturelayer.Name = pfeaturelayer.FeatureClass.AliasName;
m_map.AddLayer(pfeaturelayer as ILayer);
}
else if (pds is IRasterDataset)//栅格数据
{
IRasterWorkspace prasterws = pws as IRasterWorkspace;
IRasterDataset prasterds = prasterws.OpenRasterDataset(pds.Name);
IRasterPyramid3 prasterpryd = prasterds as IRasterPyramid3;
if (prasterpryd != null)
{
if (prasterpryd.Present == false)
{
prasterpryd.Create();
}
}
IRasterLayer prasterlayer = new RasterLayer();
prasterlayer.CreateFromDataset(prasterds);
m_map.AddLayer(prasterlayer as ILayer);
}
else if (pds is IFeatureDataset)//矢量数据集
{
IFeatureWorkspace pfeaturews = pws as IFeatureWorkspace;
IFeatureDataset pfeatureds = pfeaturews.OpenFeatureDataset(pds.Name);
IEnumDataset peumds = pfeatureds.Subsets;
peumds.Reset();
IGroupLayer pgrouplayer = new GroupLayer();
pgrouplayer.Name = pds.Name;
IDataset pds2 = peumds.Next();
while (pds2 != null)
{
IFeatureClass pfeatureclass2 = pfeaturews.OpenFeatureClass(pds2.Name);
IFeatureLayer pfeaturelayer2 = new FeatureLayer();
pfeaturelayer2.FeatureClass = pfeatureclass2;
pfeaturelayer2.Name = pfeaturelayer2.FeatureClass.AliasName;
pgrouplayer.Add(pfeaturelayer2 as ILayer);
pds2 = peumds.Next();
}
m_map.AddLayer(pgrouplayer as ILayer);
}
pds = peds.Next();
}
}
文件地理数据库是以文件夹形式存储各种类型的GIS数据集,可以存储、查询和管理空间数据和非空间数据,支持的地理数据库的大小最大为1TB,在不使用DBMS的情况下能够扩展并存储大量数据,是继个人数据库之后Esri推出的新的数据管理系统。文件地理数据库支持单用户编辑,不支持版本管理。
实现思路如下:
由于文件地理数据库是以文件夹的形式存在的,可以使用FolderBrowserDialog选择文件夹进行加载。
首先创建FileGDBWorkspaceFactoryClass类的实例;
其次用IWorkspaceFactory接口的OpenFromFile方法打开文件地理数据库的工作空间,对工作空间里面的数据进行加载。
核心代码如下:
Form1.cs:
/// <summary>
/// 打开文件数据库
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonItem6_Click(object sender, EventArgs e)
{
FolderBrowserDialog foiderdlg = new FolderBrowserDialog();
if (foiderdlg.ShowDialog() == DialogResult.OK)
{
gis3._1.myengineproject readfile = new gis3._1.myengineproject();
IMapControl3 m_map = axMapControl1.Object as IMapControl3;
readfile.readdatafromfiledatabase(foiderdlg.SelectedPath, m_map);
axMapControl1.Refresh();
}
}
MyEngineProject.cs:
/// <summary>
/// 文件数据库
/// </summary>
/// <param name="selecpath"></param>
/// <param name="m_map"></param>
public void readdatafromfiledatabase(string selecpath, IMapControl3 m_map)
{
try
{
//string pathname = System.IO.Path.GetDirectoryName(selecpath);
//string filename = System.IO.Path.GetFileName(selecpath);
IWorkspaceFactory pwf = new FileGDBWorkspaceFactory();
IWorkspace pws = pwf.OpenFromFile(selecpath, 0);
addl1layers(pws, m_map);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return;
}
}
4.点线面三种类型矢量数据的渲染
```csharp
/// <summary>
/// 点图层渲染
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool randerlayerusesimplemark(ILayer player)
{
try
{
//第一步:把ilayer为IGeoFeatureLayer
IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;
//创建要使用的符号,并设置符号格式
ISimpleMarkerSymbol pmarksymbol = new SimpleMarkerSymbol();
pmarksymbol.Style = esriSimpleMarkerStyle.esriSMSCross;
pmarksymbol.Color = getrgb(255,0,0);
//第三步创建渲染器
ISimpleRenderer prender = new SimpleRenderer();
//第四步用创建的符号进行渲染
prender.Symbol = pmarksymbol as ISymbol;
//第五步,把渲染器赋值给igeolayer的render属性
pgeofeaturelayer.Renderer=prender as IFeatureRenderer;
return true;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return false;
}
}
/// <summary>
/// 线渲染(未调用)
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool randerlayerusesimpleline(ILayer player)
{
try
{
IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;
ISimpleLineSymbol plinesymbol = new SimpleLineSymbol();
plinesymbol.Style = esriSimpleLineStyle.esriSLSDashDot;
plinesymbol.Color = getrgb(255, 0, 0);
plinesymbol.Width = 1.5;
ISimpleRenderer prender = new SimpleRenderer();
prender.Symbol = plinesymbol as ISymbol;
pgeofeaturelayer.Renderer = prender as IFeatureRenderer;
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return false;
}
}
/// <summary>
/// 面渲染(未调用)
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool randerlayerusesimplestyle(ILayer player)
{
try
{
IGeoFeatureLayer pgeofeaturelayer = player as IGeoFeatureLayer;
ISimpleFillSymbol pfilesymbol = new SimpleFillSymbol();
pfilesymbol.Style = esriSimpleFillStyle.esriSFSSolid;
pfilesymbol.Color = getrgb(255, 0, 0);
pfilesymbol.Outline.Width = 1.5;
ISimpleRenderer prender = new SimpleRenderer();
prender.Symbol = pfilesymbol as ISymbol;
pgeofeaturelayer.Renderer = prender as IFeatureRenderer;
return true;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return false;
}
}
private IRgbColor getrgb(int r,int g ,int b)
{
IRgbColor prgbc=new RgbColor();
prgbc.Red = r;
prgbc.Blue = b;
prgbc.Green = g;
return prgbc;
}
5.DEM数据渲染
/// <summary>
/// dem数据渲染
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool renderdemlayer(ILayer player)
{
try
{
IRasterLayer prasterlayer=player as IRasterLayer;
IRasterStretchColorRampRenderer prscrr=new RasterStretchColorRampRenderer();
IRasterRenderer prasterrender=prscrr as IRasterRenderer;
prasterrender.Raster=prasterlayer.Raster;
prasterrender.Update();
IAlgorithmicColorRamp pacr=new AlgorithmicColorRamp();
pacr.FromColor=getrgb(0,0,255) as IColor;
pacr.ToColor=getrgb(255,0,0) as IColor;
pacr.Size=255;
bool iscreate=false;
pacr.CreateRamp(out iscreate);
if (iscreate)
{
prscrr.BandIndex = 0;
prscrr.ColorRamp = pacr;
prasterrender.Update();
prasterlayer.Renderer = prasterrender as IRasterRenderer;
}
else
{
return false;
}
return true;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return false;
}
}
/// <summary>
/// 唯一值渲染
/// </summary>
/// <param name="player"></param>
/// <returns></returns>
public bool renderuinquevalue(ILayer player)
{
try
{
//第一步:把ilayer为IGeoFeatureLayer
IGeoFeatureLayer geolayer=player as IGeoFeatureLayer;
//创建要使用的符号,并设置符号格式
ISimpleFillSymbol pfillsymbol1 = new SimpleFillSymbol();
pfillsymbol1.Color = getrgb(60 ,179, 113);
pfillsymbol1.Outline.Width = 1.5;
ISimpleFillSymbol pfillsymbol2 = new SimpleFillSymbol();
pfillsymbol2.Color = getrgb(0, 100, 0);
pfillsymbol2.Outline.Width = 1.5;
ISimpleFillSymbol pfillsymbol3 = new SimpleFillSymbol();
pfillsymbol3.Color = getrgb(0, 255, 0);
pfillsymbol3.Outline.Width = 1.5;
ISimpleFillSymbol pfillsymbol4 = new SimpleFillSymbol();
pfillsymbol4.Color = getrgb(255,255,0);
pfillsymbol4.Outline.Width = 1.5;
//第三步创建渲染器
IUniqueValueRenderer puvrenderer = new UniqueValueRendererClass();
puvrenderer.FieldCount=1;
puvrenderer.set_Field(0,"DDMM");
//第四步用创建的符号进行渲染
puvrenderer.AddValue("21","21",pfillsymbol1 as ISymbol);
puvrenderer.AddValue("22","22", pfillsymbol2 as ISymbol);
puvrenderer.AddValue("23","23", pfillsymbol3 as ISymbol);
puvrenderer.AddValue("24","24", pfillsymbol4 as ISymbol);
geolayer.Renderer = puvrenderer as IFeatureRenderer;
return true;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.ToString());
return false;
}
}
四、实验结果
1.点图层渲染
2.dem渲染
3.唯一值渲染
4.文件打开
五、实验心得与体会
1.对矢量文件、栅格文件、个人地理数据库、文件地理数据库有了更深的认识。
2.对不同的数据会用不同的渲染方法进行渲染。