Serie „Desktop-Kartenanwendungsentwicklung“Teil5.
Diesmal fügen wir der im Teil 4 erstellten Kartenanwendung eine Funktion hinzu, die die individuellen Attributwerte der in der Karte referenzierten Daten anzeigt.Teil 4 Die Beispielcodes für die in diesem Artikel vorgestellte Funktion sind auf Esri Japan GitHub veröffentlicht.
Anzeige individueller Attribute
Wir implementieren eine Funktion, die die Attributinformationen des auf der Karte ausgewählten Features anzeigt, damit Sie sehen können, welche Werte das Feature besitzt. Schauen wir uns diesmal die Attributinformationen der Polygone der Grund- und Mittelschulbezirke oder der Punkte der Grund- und Mittelschulen an, auf die auf der Karte getippt wurde.
1. Öffnen Sie MainWindows.xaml und implementieren Sie das GeoViewTapped-Ereignis (fügen Sie GeoViewTapped="MainMapView_GeoViewTapped" hinzu).
MainWindows.xaml
<esri:MapView x:Name="MainMapView" Map="{Binding Map, Source={StaticResource MapViewModel}}" GeoViewTapped="MainMapView_GeoViewTapped"/>
2. Öffnen Sie MainWindows.xaml.cs und fügen Sie die folgenden Namespaces hinzu.
>>MainWindows.xaml.cs
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.UI.Controls;
using Esri.ArcGISRuntime.UI;
3. Erstellen Sie die Logik, die im GeoViewTapped-Ereignis ausgeführt wird. Um das Feature an der getippten Stelle zu erhalten, verwenden Sie
GeoView.IdentifyLayerAsync(). Diese Methode wird mit dem zu identifizierenden Layer und dem Bildschirmpunkt des Tippereignisses aufgerufen, um das Feature am getippten Punkt aus dem Layer abzurufen.
Für die Erstellung der Anzeige-UI verwenden wir ein Callout (Callout). Mit Callouts können Sie einfach Sprechblasen an beliebigen Stellen auf der Karte anzeigen.GeoView.ShowCalloutAt()übergeben Sie die Position (getippter Punkt) und den Inhalt (CalloutDefinition), um den Callout anzuzeigen.MainWindows.xaml.cs // Ereignishandler für das Tippen auf die Kartenansichtpublic async void MainMapView_GeoViewTapped(object sender, GeoViewInputEventArgs e){ // Verstecke bereits angezeigten Callout MainMapView.DismissCallout();
// Bildschirmkoordinaten des Tipp-Punkts abrufen
Point tapScreenPoint = e.Position;
// Kartenkoordinaten des Tipp-Punkts abrufen
MapPoint tapMapPoint = e.Location!;
// Identifizierungsbereich (Bildschirmkoordinatenbreite und -höhe mit Mittelpunkt am Tipp-Punkt) festlegen
int pixelTolerance = 1;
// Ob nur Popups zurückgegeben werden sollen oder nicht
var returnPopupsOnly = false;
// Identifiziere Layer am Tipp-Punkt und erhalte Ergebnisse
IReadOnlyList<IdentifyLayerResult> identifyLayerResults = await MainMapView.IdentifyLayersAsync(tapScreenPoint, pixelTolerance, returnPopupsOnly);
var currentMapViewModel = (MapViewModel)this.FindResource("MapViewModel");
// Erstelle den Inhalt für den Callout zur Anzeige
CalloutDefinition? calloutDefinition = currentMapViewModel.Identify(identifyLayerResults);
// Zeige den Callout auf der Karte an, falls vorhanden
if (calloutDefinition != null)
{
MainMapView.ShowCalloutAt(tapMapPoint, calloutDefinition);
}
}
Tipps: Der zweite Parameter des IdentifyLayerAsync-Methodenaufrufs gibt den Bereich an, der identifiziert werden soll. Ein Quadrat mit der angegebenen Breite und Höhe in Bildschirmkoordinaten wird um den Tipp-Punkt als Zentrum gebildet. Ein größerer Wert identifiziert einen größeren Bereich um den Tipp-Punkt herum, ein kleinerer Wert einen kleineren Bereich.
private Feature? _selectedFeature;
private FeatureLayer? _selectedLayer;
///中略///
public CalloutDefinition Identify(IReadOnlyList<IdentifyLayerResult> identifyLayerResults)
{
CalloutDefinition? calloutDefinition = null;
try
{
// 既に選択されている(ハイライト表示されている)フィーチャの選択を解除する
if (_selectedFeature != null) {
_selectedLayer!.UnselectFeature(_selectedFeature);
}
if (identifyLayerResults.Count == 0 || identifyLayerResults[0].GeoElements.Count == 0) {
throw new Exception("フィーチャが見つかりません");
}
// IdentifyLayersAsync() で取得したフィーチャを選択する(ハイライト表示する)
_selectedFeature = (Feature)identifyLayerResults[0].GeoElements[0];
_selectedLayer = (FeatureLayer)identifyLayerResults[0].LayerContent;
_selectedLayer.SelectFeature(_selectedFeature);
// レイヤーの属性情報のフィールド名とエイリアスを取得する
// Key にフィールド名、Value にフィールドのエイリアスを格納したディクショナリを作成する
var fields = new Dictionary<string, string>();
for (int i = 0; i < _selectedLayer.FeatureTable!.Fields.Count; i++) {
Field? field = _selectedLayer.FeatureTable.Fields[i];
fields.Add(field.Name, field.Alias);
}
// コールアウトのコンテンツ(タイトル)を設定する
string layerName = _selectedLayer.Name;
// 該当フィーチャの全ての属性情報を結合した文字列を作成する
var attributes = new System.Text.StringBuilder();
if (_selectedFeature.Attributes.Count > 0)
{
foreach (var attribute in _selectedFeature.Attributes) {
// 該当フィールドのエイリアスを取得する(attribute.Key はフィールド名)
string fieldName = fields[attribute.Key];
// 該当フィールドのフィールド値を取得する
object fieldValue = attribute.Value!;
attributes.AppendLine(fieldName + ": " + fieldValue);
}
attributes.AppendLine();
}
// コールアウトのコンテンツを定義する CalloutDefinition を作成する
calloutDefinition = new CalloutDefinition(layerName, attributes.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "エラー");
}
return calloutDefinition!;
}
Tips: 選択したフィーチャをハイライトしたいときには FeatureLayer.SelectFeature()を使用します。このメソッドに渡されたフィーチャがハイライト表示されます。
5. アプリを実行して任意の地点をクリックしてみましょう。クリック地点上にフィーチャがある場合、コールアウトが表示され属性情報を確認できます。
第5弾「個別属性表示」ではマップに追加されているデータの属性情報を表示する方法を紹介しました。次回、第6弾ではデバイスの現在地をマップ上に表示する方法を紹介します。
関連リンク