目次
1.1 ArcGIS-ExtendingArcObjects を使用してフォーム アプリケーションを作成する
1.2 C#-Windows フォーム アプリケーションを使用してフォーム アプリケーションを作成する
01 プロジェクトの作成
1.1 ArcGIS-ExtendingArcObjects を使用してフォーム アプリケーションを作成する
テンプレートに ArcGIS-ExtendingArcObjects オプションがない可能性があります。これは VS のバージョンに関連している可能性があります。通常、この状況は、レジストリを変更し、12 以降の VS バージョンを使用することによって発生する可能性があります。
しかし実際には、このモジュールはまず、最も基本的な C# フォーム アプリケーション (.NET Framework) にいくつかの単純な ArcGIS モジュールを追加します。これはさらに便利です。その後、クラスメイトの世話をするために、私はゼロからオナニーを始めました。もちろん、時間の節約になります。上記のテンプレートと同じ機能はありませんが、ほぼ同じです。
(実験はこのテンプレートに基づいているため、このテンプレートを使用するか自分で行うかに関係なく、以降の実験は同じです。ただし、ここでの最初の作成プロジェクトはテンプレートを使用し、もう 1 つは基本的なフォーム アプリケーションを作成し、テンプレートと同じ機能を自分で追加します。)
実行後のソフトウェア インターフェイスを見てみましょう。
さて、最初から始めて私のスキルがどのくらいであるかを見てみましょう。結局、勉強したのは2、3日だけでした。
1.2 C#-Windows フォーム アプリケーションを使用してフォーム アプリケーションを作成する
1.2.1 基本プロジェクトの作成
1.2.2 インターフェースの構築
ここのインターフェースは表示のみを目的としていますが、コードは組み込まれていません。つまり、インタラクティブなイベントが記述されています。クリックすると何が起こるかとか、そういうことです。
戻ってインターフェースがどのようなものかを見てみましょう。
さて、メニューバーの構築を始めましょう
キーボードを打つだけなので難しいことはありませんが、区切り線は以下のように設定します。
さて、ToolBar、TOC、Map の 3 つのコントロールの構築を始めましょう。
レイアウトの調整を始めましょう。
ただし、他の人のツールバー (ToolBar) にはいくつかのツールがあるようですが、私たちのツールバーにはいくつかのツールがないため、やはりいくつかのツールを追加する必要があります (これは非常に簡単です)。
必要なツールをすべて追加します。ここでは、次のツールだけを追加します。
他のコントロールには何も追加する必要はありませんが、ここで大きな問題があります。つまり、3 つの主要な ArcGIS コントロール (TOC、ToolBar、Map) を追加しましたが、まだいくつかのコントロールを関連付けていません。では、なぜ関連付けたり束縛したりする必要があるのでしょうか? 私たちのコードはある意味で最初から書かれているため、各コントロールは互いに独立しています。たとえば、ToolBar コントロールのツールは MapControl コントロールで (または多かれ少なかれ) 使用する必要があることを普通の人は知っています。 TOC コントロールに表示されるレイヤー情報は、MapControl コントロールに表示されるファイルである必要があります。たとえば、ToolBar コントロールのツールを使用してデータをロードする場合、ロードされたデータは MapControl に表示されるべきですか? したがって、これは別のことです。繋がり。したがって、さまざまなコントロール間に相関関係があるため、それらが実際に関連していることを知らせるためにそれらをバインドする必要があります。そうしないと、次のように表示することしかできません。
バインドしている場合は、次のようになります (一部のツールは、ファイルをロードしていない、または特定の操作を実行していないため灰色になっています)。
さて、バインド方法の説明を始めましょう。
まだ不完全なソフトウェアを実行する前に、現在のアプリケーションの ArcGIS バージョンを特定する必要があります。これにより、正しい ArcGIS Runtime バージョンがアプリケーションにバインドされます。これは、ArcGIS Engine または ArcGIS Desktop を使用して開発された .NET アプリケーションでしばしば必要となる手順です。通常、このバインディングにより、アプリケーションの実行時に正しいバージョンの ArcGIS コンポーネントが検索されて使用されます。これは、複数のバージョンの ArcGIS ランタイムとの競合を避けるために特に重要です。
つまり、このアプリケーションを最初から作成し、ArcGIS コンポーネントを使用する場合、通常は次のコード行が必要になります。
そうしないと、実行時に次のエラーが報告されます。
未処理の System.InvalidOperationException:
ArcGIS のバージョンが指定されていません。ArcGIS コンポーネントを作成する前に、RuntimeManager.Bind を呼び出す必要があります。
ArGIS のバージョンが不明瞭な問題を解決するコードを追加するにはどうすればよいですか?
このコード行:
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); // 解决版本不清晰问题
これで、以下を実行できるようになります。
以下はインターフェースとツールを使用する準備ができています。(一つ忘れていました。ライセンス コントロール (LicenseControl コントロール) を入れる必要があります。そうしないと機能しません)
メニューバーの機能については様子を見て、時間も限られているので、今後の実験で使うことがあれば追加していきたいと思います。
02 ビューメニューを作成する
以前のファイル メニューも廃止され、ズームイン、ズームアウト、パン、全画像表示の 4 つの機能を含むビュー メニューを作成する実験です。
まず、インターフェースを構築しましょう。
次に、<Zoom> 関数をダブルクリックして、単なるスキン レイヤーではなく、関数の特定のイベント書き込みを入力します。
なお、各コントロールの名前を変更しているため、コードを直接貼り付けることはできません(わかりやすくするために、名前の意味を知るためでもあるので、コード内で各コントロールを使用する場合は、クラス名をコントロールは他のものとは異なります。たとえば、あなたの Map コントロールは axMapcontrol1、私のものは MainMapcontrol)、名前 => Control-Properties-Name を変更します。
ズーム関数のコードは次のとおりです。
private void 放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 该函数用于将鼠标状态切换为放大工具
ControlsMapZoomInToolClass zoom_in = new ControlsMapZoomInToolClass(); // 实例化一个工具
zoom_in.OnCreate(MainMapControl.Object); // 告诉放大工具,它应该服务于谁,==> Map
MainMapControl.CurrentTool = zoom_in; // 将Map控件的当前使用工具切换为放大
}
ただし、エラーが発生する可能性があるため、直接貼り付けることはできません。私の関数名があなたの関数名と一致していない可能性があるため、作成する関数を入力するには、ズームインした自分のデザイナーの場所をダブルクリックする必要があります。一貫性がありますが、問題がある可能性があります。
他の機能も同様なので、一つ一つ説明しません(コメントにも詳しく書いてあります) 4つの機能と4つの機能があり、それぞれの機能は ArcGIS のインターフェイスと呼ばれます。これらのコントロール関連クラスがあるため、関連するライブラリを導入していることを確認してください。
using ESRI.ArcGIS.Controls; // 使用其中的工具类(例如平移工具Pan等)
この部分の完全なコードは次のとおりです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls; // 使用其中的工具类(例如平移工具Pan等)
namespace Ex2Twinborn
{
public partial class MainForm : Form
{
public MainForm()
{
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop); // 解决版本不清晰问题
InitializeComponent();
}
private void 放大ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 该函数用于将鼠标状态切换为放大工具
ControlsMapZoomInToolClass zoom_in = new ControlsMapZoomInToolClass(); // 实例化一个工具
zoom_in.OnCreate(MainMapControl.Object); // 告诉放大工具,它应该服务于谁,==> Map
MainMapControl.CurrentTool = zoom_in; // 将Map控件的当前使用工具切换为放大
}
private void 缩小ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 当前函数用于将鼠标状态切换为缩小工具
ControlsMapZoomOutToolClass zoom_out = new ControlsMapZoomOutToolClass();
zoom_out.OnCreate(MainMapControl.Object); // 将缩小工具的服务对象进行绑定
MainMapControl.CurrentTool = zoom_out; // 将Map控件的当前使用工具切换为缩小
}
private void 平移ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 该函数用于将当前鼠标状态切换为平移工具
ControlsMapPanToolClass pan = new ControlsMapPanToolClass(); // 如果不能正常运行, 请将引用下关于ESRI的所有引用的属性-嵌入互操作类型更改为false.
pan.OnCreate(MainMapControl.Object); // 告诉pan工具,你是在Map控件上进行工作的
MainMapControl.CurrentTool = pan; // 将Map控件当前的使用工具更改为平移工具
}
private void 全图ToolStripMenuItem_Click(object sender, EventArgs e)
{
// 该函数用于将当前Map进行全图显示-方法1
MainMapControl.Extent = MainMapControl.FullExtent;
MainMapControl.Refresh();
方法2
//ControlsMapFullExtentCommandClass full_extent = new ControlsMapFullExtentCommandClass();
//full_extent.OnCreate(MainMapControl.Object);
//full_extent.OnClick();
}
}
}
実際、実験のこの部分は実際には少し冗長だと思います。実際には、自分たちで作成したメニュー バーのビュー セクションにある 4 つのツールと、ArcGIS Toolbar コントロールのズーム、ズーム、パン機能の間に違いはありません。 (実験をいちいちやらずに、こういうところでつまらないことをやっているというよりは、総合的な小さなプロジェクトです。ズボンを脱いでオナラするようなものです) とりあえず言えるのは、とりあえずやったほうがいいです。何もしないよりはマシですが、これがケースです。
03 イーグルアイ図の実装
まだいくつかの困難があり、実験には欠陥があるため、いくつかの小さな問題を修正する時間とエネルギーがありません。
Eagle Eye Chart (実際には MapControl <複数にすることができます>) の実装は 2 つの部分に分かれていると思います。最初の部分は、メイン ビューにデータを追加するときに、同じデータを Eagle ビューにも追加することです。 Eye Chart. データとは、実際には 2 つの MapControl コントロールのデータの一貫性を保つことを意味します。(ただし、この実験では、mxd マップ ドキュメントが追加された場合にのみ同期効果が完了しました。これについては後で説明します); 2 つ目は、メイン ビューを移動したり、メイン ビューをズームインおよびズームアウトしたりすると、Eagle Eye マップがメイン ビューのグローバル位置を表示します (相対位置は小さな赤いボックスで示されます)。
3.1 OnMapReplaced イベントのトリガー
したがって、これを 2 つのイベントに分割します。1 つ目は、データが追加または変更されたとき (ここでのデータは実際には単なる MXD ドキュメントです)、イベントがトリガーされ、メイン ビューのデータを Eagle Eye チャートに同期します。 。それ自体は非常に単純ですが、いつトリガーするかが難しく、MXD ドキュメントが変更される (何かを置き換えたり追加したりする) と、Eagle Eye チャートのデータ表示が変更されると直接実験されます。PassOnMap が置き換えられました。
要約すると、OnMapReplaced イベントはいつトリガーされるのでしょうか?
MXD ドキュメントの読み込み
AxMapControl
:このメソッドを使用してLoadMxFile
新しい MXD (Map Exchange Document、ArcMap マップ ドキュメント形式) を読み込むと、現在のMap
オブジェクトが新しい MXD のオブジェクトに置き換えられるためMap
、このイベントがトリガーされます。Map プロパティを設定する: 直接設定したプロパティが新しいオブジェクトの場合
AxMapControl
、Map
このMap
イベントもトリガーされます。データ フレームの追加/削除: ArcMap に複数のデータ フレームがあり、ArcObjects コードまたは ArcMap インターフェイスを使用してデータ フレームを追加または削除する場合も、イベントが
OnMapReplaced
トリガーされる可能性があります。新しいマップ: ArcMap で新しいマップを作成すると、これによって
OnMapReplaced
イベントもトリガーされます。等
さて、今から操作を始めましょう。
メイン ビューのデータが変更されると、イベントがトリガーされるため、次のようになります。
コードは以下のように表示されます。
// 当主视图(MainMapControl)的内容被替换了(实际上此处仅仅是针对mxd文档被替换,对于一般数据的加载实际上不会触发此函数), 那么执行该部分函数
// 该函数用于将主视图上的所有图层同步加载到鹰眼图中
for (int ix = 0; ix < MainMapControl.LayerCount; ix++)
{
ILayer layer = MainMapControl.get_Layer(ix);
EyeMapControl.AddLayer(layer);
}
EyeMapControl.Extent = EyeMapControl.FullExtent; // 全图显示
EyeMapControl.Refresh();
EyeMapControl.AutoMouseWheel = false; // 不允许有滚动条
アイデアは非常に単純で、メイン ビューのレイヤーの総数 MainMapControl.LayerCount を見つけ、各レイヤーをループして MainMapControl.get_layer (インデックス <0 から始まる>) を見つけ、見つかったレイヤーを Eagle に追加します。 Eye view. Loop 終了後、画像全体が表示されてから更新され、スクロール バーは使用できません。
対応する参照を追加することに注意してください。
using ESRI.ArcGIS.Carto; // 使用ILayer类
3.2 OnExtentUpdated イベントのトリガー
以前にも述べたように、2 つの部分があり、メイン ビューのデータを同期する必要があるという前の部分は、Eagle Eye ダイアグラム上で解決されましたが、パン、ズームイン、ズームインなどの操作を実行すると、メイン ビュー、その方法 現在のメイン ビューの範囲は、現在のブラウジングの相対位置を示す小さな赤いボックスとして Eagle Eye ダイアグラムに表示されます。
ここでは、パン、ズームイン、その他のいずれの操作を行っても、それは基本的に現在のビューの表示範囲の変更であることを実際にすでに理解しているため、現在のメイン ビューの範囲が変更されたことを検出するだけで済み、小さな赤いアイコンが表示されます。ボックスはすぐに再描画されます。新しい新しい場所を表示します。したがって、これには OnExtentUpdated イベントを渡す必要があります。
具体的な操作は以下の通りです。
コード:
// 当主视图的Extent范围发生变化, 那么触发此事件
// 该函数用于更新鹰眼图中的矩形框(矩形框范围为主视图的Extent)
IRectangleElement pRectangleElement = new RectangleElement() as IRectangleElement; // 新建一个矩形框并更换类型
IElement pEle = pRectangleElement as IElement; // 再次更换类型
IEnvelope pEnv = e.newEnvelope as IEnvelope; // 获取主视图的范围边框并更换类型为包络线==> IEnvelope
pEle.Geometry = pEnv; // 设置刚刚创建的矩形边框的几何形状为刚刚主视图的范围的边框.
IRgbColor pColor = new RgbColor(); // 实例化一个颜色对象
pColor.Red = 200; // 红色分量为200, 255表示完全红色
pColor.Transparency = 255; // 颜色的透明度, 255表示完全不透明
ILineSymbol pLineSymbol = new SimpleLineSymbol(); // 实例化一个线对象
pLineSymbol.Width = 2; // 线的宽度为2
pLineSymbol.Color = pColor; // 线的颜色为刚刚设置的不饱和但完全不透明的红色
IFillSymbol pFillSymbol = new SimpleFillSymbol(); // 创建一个填充符号
pColor.Transparency = 0; // 刚刚的颜色透明度修改为0也就是完全透明度
pFillSymbol.Color = pColor; // 填充色设置为刚刚的颜色, 实际上就是透明度的没有任何填充
pFillSymbol.Outline = pLineSymbol; // 但是填充符号的外边框(它是线)设置为刚刚的线对象
IFillShapeElement pFillShapeElement = pRectangleElement as IFillShapeElement;
pFillShapeElement.Symbol = pFillSymbol;
IGraphicsContainer pGC = EyeMapControl.Map as IGraphicsContainer; // 创建一个
pGC.DeleteAllElements(); // 清除之前所有的图形\注记等等避免与后面新的图形发生冲突或者重叠.
pGC.AddElement(pEle, 0); // 添加矩形框在最底层
IActiveView pActiveView = EyeMapControl.Map as IActiveView;
pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
// 刷新的图层是图形层(不包括加载的数据等)、刷新的对象(null表示图形层的所有对象)、刷新的空间范围(null表示整个鹰眼图范围)
04 短いデモンストレーションを行う