ArcGIS Pro SDK for .NET を使用した機能開発 ~マップとの対話的な操作その2~

Document created by makoto_maruyamaesrij-esridist Employee on Nov 21, 2019Last modified by makoto_maruyamaesrij-esridist Employee on Nov 21, 2019
Version 3Show Document
  • View in full screen mode

はじめに

このシリーズでは「ArcGIS Pro SDK for .NET を使用した機能開発」のシリーズ記事として、ArcGIS Proを拡張するためのアドイン開発時によく使う便利なクラスやメソッド、また、それらを用いた実践的な開発をご紹介します。本シリーズで実装するソースはすべて Github に格納してありますので、ぜひArcGIS Pro SDK for .NET(以下 Pro SDK)を使用する開発の参考にしてください。

 

本記事で実装する機能の概要

前回記事ではマップ ツールで選択したフィーチャの属性をドッキング ウインドウに配置した DataGrid に表示させる機能を実装しました。本記事では DataGrid をクリックした際に選択フィーチャを強調する処理や、DataGrid をダブルクリックした際に選択フィーチャにズームする処理を追加し、機能を拡張します。

 

完成イメージ

 

本記事で実装する機能の実装手順

  1. DataGrid に表示された属性をクリックした際に選択フィーチャを強調
  2. DataGrid に表示された属性をダブルクリックした際にフィーチャにズーム

※本記事では前回の記事で実装した、ドッキング ウインドウの「対話的操作」タブ内の一部機能の拡張を行います(当該タブ内のその他の機能は前回の記事にてご紹介しています)。他タブの機能も今後の連載でご紹介します。

 

本記事で使用するファイル

 

MainDockPane.xaml

ドッキング ウインドウの画面を構成するファイル。作成手順に関しては「Pro SDK を使用した ArcGIS Pro の拡張④:アドインの開発」をご参照ください。

 

MainDockPaneViewModel.cs

ドッキング ウインドウの処理を記述するファイル。ViewModel の役割をしています。ドッキング ウインドウ(MainDockPane.xaml)作成時に自動的に作成されます。Pro SDK で扱う ViewModel については、「Pro SDK を使用した ArcGIS Pro の拡張③:アドインプロジェクトの構成」をご覧ください。

 

実装手順

1.DataGrid 表示された属性クリックした際に選択フィーチャを強調
この手順では、DataGrid に表示された属性をクリックしたときに、選択されたフィーチャを強調するように機能を拡張します。

 

手順

1.1 MainDockPane.xaml の設定

DataGrid の「SelectedItem」を「MainDockPaneViewModel.cs」 の 「SelectedFeature」プロパティとバインドします。

<DataGrid SelectedItem="{Binding Path=SelectedFeature}">
</DataGrid>

 

1.2 MainDockPaneViewModel.cs でフィーチャ選択時の処理を追加

MainDockPaneViewModel.cs でフィーチャ選択時 (手順1.1で設定したSelectedFeature) の処理を追加します。DataGrid に表示された属性を選択すると選択フィーチャを強調する「FlashFeatures」メソッドが実行されるように処理を追加します。

private DataRowView _selectedFeature = null;
// フィーチャの選択
public DataRowView SelectedFeature
{
    Get
    {
        return _selectedFeature;
    }
    set
    {
        SetProperty(ref _selectedFeature, value, () => SelectedFeature);
        if (_selectedFeature == null || SelectedFeatureLayer == null)
            return;
     // フィーチャの強調
         FlashFeatures(Convert.ToInt64(_selectedFeature.Row["ObjectId"]));
     }
}

 

1.3 選択フィーチャを強調

DataGrid をクリックして選択されたフィーチャに対して、後述の手順 1.4 で作成する強調するためのグラフィック、「CreateGraphic」メソッドを実行しています。

private void FlashFeatures(long oid)
{
    var mapView = MapView.Active;
    if (mapView == null)
        return;

    QueryFilter queryFilter = new QueryFilter
    {
        WhereClause = "ObjectId =" + oid,
    };

    QueuedTask.Run(() =>
    {
        var annotationLayer = _selectedFeatureLayer as AnnotationLayer;
        //アノテーションの場合
        if (annotationLayer != null)
        {
            CreateGraphic(annotationLayer.GetFeatureClass(), queryFilter);
        }
        //アノテーションでない場合
        else
        {
            var featureLayer = _selectedFeatureLayer as FeatureLayer;
            CreateGraphic(featureLayer.GetFeatureClass(), queryFilter);
        }
    });
}

 

1.4 選択フィーチャを強調するためのグラフィックを作成

フィーチャを強調するためのグラフィックを作成します。グラフィックを作成するには、ジオメトリ(ポイント、ライン、ポリゴン)やシンボルの設定が必要となります。作成したグラフィックをマップ ビューに追加することで表示が可能です。

グラフィックはジオメトリのタイプに応じてそれぞれ「CIMPointGraphic」、「CIMLineGraphic」、「CIMPolygonGraphic」クラスを使って作成しています。ジオメトリがポリゴンの場合はアノテーションかそうでないかで処理が分岐しており、アノテーションの場合はアウトラインを強調する処理を行います。

最後に、AddOverlay メソッドを用いて作成したグラフィックをマップ ビューに追加します。

private void CreateGraphic(FeatureClass featureClass, QueryFilter queryFilter)
{
var mapView = MapView.Active;

    using (RowCursor rowCursor = featureClass.Search(queryFilter, true))
    {
        rowCursor.MoveNext();
        //レコードを取得
        using (Row row = rowCursor.Current)
        {
            Feature feature = row as Feature;
            Geometry shape = feature.GetShape();

            RemoveFromMapOverlay(); // 既存のグラフィックを削除
            switch (shape.GeometryType)
            {
                // ポイントの場合
                case GeometryType.Point:
                    // ポイント作成
                    var point = shape as MapPoint;
                    MapPoint mapPoint = MapPointBuilder.CreateMapPoint(point.X, point.Y, shape.SpatialReference);

                    // グラフィック作成
                    var pointGraphic = new CIMPointGraphic();
                    pointGraphic.Location = mapPoint;

                    // シンボル作成
                    CIMPointSymbol pointSymbol = SymbolFactory.Instance.ConstructPointSymbol(ColorFactory.Instance.RedRGB, 5);
                    pointGraphic.Symbol = pointSymbol.MakeSymbolReference();

                    // グラフィックをマップビューに追加
                    _overlayObject = mapView.AddOverlay(pointGraphic);

                    break;

                    // ポリゴンの場合
                    case GeometryType.Polygon:

                        // アノテーションの場合
                        if (feature.GetType().Name == "AnnotationFeature")
                        {
                            // グラフィック作成
                            var annoGraphic = new CIMPolygonGraphic();
                            annoGraphic.Polygon = shape as Polygon;

                            // シンボル作成
                            CIMStroke outline = SymbolFactory.Instance.ConstructStroke(ColorFactory.Instance.RedRGB, 2, SimpleLineStyle.Solid);
                            CIMPolygonSymbol polygonSymbol = SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.BlueRGB, SimpleFillStyle.Null, outline);
                            annoGraphic.Symbol = polygonSymbol.MakeSymbolReference();

                            // グラフィックをマップビューに追加
                            _overlayObject = mapView.AddOverlay(annoGraphic);
                        }
                        else
                        {
                            // グラフィック作成
                            var polygonGraphic = new CIMPolygonGraphic();
                            polygonGraphic.Polygon = shape as Polygon;

                            // シンボル作成
                            CIMPolygonSymbol polygonSymbol = SymbolFactory.Instance.ConstructPolygonSymbol(ColorFactory.Instance.RedRGB);
                            polygonGraphic.Symbol = polygonSymbol.MakeSymbolReference();

                            // グラフィックをマップビューに追加
                            _overlayObject = mapView.AddOverlay(polygonGraphic);
                        }

                        break;

                    // ラインの場合
                    case GeometryType.Polyline:

                        // グラフィック作成
                        var lineGraphic = new CIMLineGraphic();
                        lineGraphic.Line = shape as Polyline;

                        // シンボル作成
                        CIMLineSymbol lineSymbol = SymbolFactory.Instance.ConstructLineSymbol(ColorFactory.Instance.RedRGB, 5);
                        lineGraphic.Symbol = lineSymbol.MakeSymbolReference();

                        // グラフィックをマップビューに追加
                        _overlayObject = mapView.AddOverlay(lineGraphic);

                        break;

                    default:
                        break;
            }
        }
    }
}

 

これで DataGrid に表示された属性を選択したときにフィーチャを強調する処理は完了です。
強調した結果は以下の画像のようになります。

 

2.DataGrid をダブルクリックした際にフィーチャにズーム
この手順では、DataGrid に表示された属性をダブルクリックしたときに、選択フィーチャにズームする処理を実装し、機能を拡張します。

 

 

手順

2.1 MainDockPane.xaml の設定

DataGrid の InputBindings の「Command」属性を「MainDockPaneViewModel.cs」 の 「DataGridDoubleClick」プロパティとバインドします。

<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
              Command="{Binding Path=DataGridDoubleClick}">

</DataGrid.InputBindings>

 

2.2 MainDockPaneViewModel.cs でダブルクリック時の処理を追加

MainDockPaneViewModel.cs で DataGrid の属性をダブルクリックすると、「ExecuteDataGridDoubleClick()」メソッドが実行されるように実装します。メソッド内では、ZoomTo メソッドを使用してフィーチャにズームを行います。

private ICommand _dataGridDoubleClick;
//ダブルクリックしたときに ExecuteDataGridDoubleClick() メソッド実行
public ICommand DataGridDoubleClick => _dataGridDoubleClick;
private void ExecuteDataGridDoubleClick()
{
    QueuedTask.Run(() =>
    {
        var oid = _selectedFeature.Row["ObjectId"];
        //選択フィーチャにズーム
        MapView.Active.ZoomTo(_selectedFeatureLayer, Convert.ToInt64(oid), TimeSpan.Zero, false);

    });
}

 

これで DataGrid に表示されたフィーチャの属性をダブルクリックすると選択フィーチャにズームする処理は完了です。

 

まとめ

本記事では第 1 弾の記事で実装した機能に加え、DataGrid をクリックした際にグラフィックを使って選択フィーチャを強調する処理や、DataGrid をダブルクリックした際に選択フィーチャにズームする処理を実装、解説しました。このように Pro SDK を使うことによって ArcGIS Pro にはない機能を作成することができますので、ぜひご活用ください。

 

次回

次回はレンダリングタブ内に機能を実装する方法をご紹介する予定です。

 

関連リンク

ArcGIS Pro SDK for .NET を使用した ArcGIS Pro の拡張 シリーズ

ArcGIS Pro SDK for .NET

ArcGIS Pro SDK for .NET コンセプト(GitHub

ArcGIS Pro SDK for .NET サンプル集(GitHub

ArcGIS Pro SDK 2.4 for .NET API リファレンス

ArcGIS Pro SDK for .NET ハンズオン

Attachments

    Outcomes