実験 2 地図データのアクセスとレンダリング
1. 実験の目的
- さまざまなデータ型に対応するワークスペースとその使用法に精通している。
- ベクター ファイル、ラスター ファイル、個人データベース、フォルダー データベースの読み込みをマスターします。
- ArcGIS エンジンのレイヤーのレンダリング タイプとインターフェイスをマスターします。
- 点、線、面データの簡単なレンダリングをマスターします。
2. 実験器具および装置
コンピューター、ビジュアル スタジオ ソフトウェア、ArcGIS エンジン開発キット
3. 実験内容と手順
- ベクター データの読み込み
ShapeFile ファイルは現在主流の空間データ ファイル保存方法であり、さまざまな GIS ソフトウェアによるデータ形式変換に一般的に使用される中間形式でもあります。ShapeFile データをロードするには、ワークスペースを使用する方法と、IMapControl インターフェイスの AddShapeFile メソッドを使用する方法の 2 つがあります。
ワークスペースを通じて 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 のデータソースの 1 つで、主に衛星画像、航空画像、スキャンした地図、写真などが含まれます。一般的なラスター データ形式には、*.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. パーソナル データベースとファイル データベースのロード
パーソナル ジオデータベース データ プログラムのロードの概念は次のとおりです。
(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 データセットをフォルダーの形式で保存します。空間データと非空間データの保存、クエリ、管理が可能です。サポートされるジオデータベースの最大サイズは 1 TB です。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. 点、線、面の3種類のベクトルデータのレンダリング
```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;
}
}
4. 実験結果
1. ポイントレイヤーのレンダリング
2. デムレンダリング
3. 独自の価値の演出
4. ファイルを開きます
5. 実験経験と経験
1. ベクター ファイル、ラスター ファイル、個人地理データベース、およびファイル地理データベースについてより深く理解します。
2. 異なるデータは異なるレンダリング方法でレンダリングされます。