De serie "Desktop Kaartapplicatie Ontwikkeling"Deel5 van de serie.
Deze keer voegen we een functie toe aan de kaartapplicatie die we in deel 4 hebben gemaakt, waarmee de individuele attribuutwaarden van de gegevens die op de kaart worden weergegeven, getoond kunnen worden. De voorbeeldcode voor de functies die in dit artikel worden geïntroduceerd, is beschikbaar op Esri Japan GitHub .
Weergave van individuele attributen
We implementeren een functie om de attribuutinformatie te tonen van het feature dat op de kaart is geselecteerd, zodat je kunt zien welke waarden het feature heeft. Laten we deze keer eens kijken naar de attribuutinformatie van polygonen van basisschool- en middelbare schoolgebieden of punten van basisscholen en middelbare scholen die op de kaart zijn aangetikt.
1. Open MainWindows.xaml, en implementeer het GeoViewTapped-event (voeg GeoViewTapped="MainMapView_GeoViewTapped" toe).
MainWindows.xaml
<esri:MapView x:Name="MainMapView" Map="{Binding Map, Source={StaticResource MapViewModel}}" GeoViewTapped="MainMapView_GeoViewTapped"/>
2. Open MainWindows.xaml.cs, en voeg de volgende namespace-referenties toe.
MainWindows.xaml.cs
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.UI.Controls;
using Esri.ArcGISRuntime.UI;
3. Maak de verwerking die wordt uitgevoerd in het GeoViewTapped-event. Om het feature op de aangetikte locatie te verkrijgen, gebruiken we GeoView.IdentifyLayerAsync() . Deze methode voert u uit door de te identificeren laag en het schermpunt van de tiklocatie, dat wordt meegegeven in het eventargument, door te geven. Zo kunt u het feature verkrijgen dat zich op het tikpunt in de laag bevindt.
Voor het maken van de UI , gebruiken we een Callout. Met Callout kunt u eenvoudig een ballonnetje weergeven op elke gewenste locatie op de kaart.GeoView.ShowCalloutAt(), geeft u de positie (tiklocatie) en inhoud (een CalloutDefinition) door om het callout weer te geven.
MainWindows.xaml.cs
// Eventhandler voor tikken op map view
public async void MainMapView_GeoViewTapped(object sender, GeoViewInputEventArgs e)
{
// Verberg reeds getoonde callouts
MainMapView.DismissCallout();
// Verkrijg schermcoördinaten van tiklocatie
Point tapScreenPoint = e.Position;
// Verkrijg kaartcoördinaten van tiklocatie
MapPoint tapMapPoint = e.Location!;
// Tolerantie in pixels voor identificatiegebied (vierkant rond tiklocatie) hoogte en breedte
int pixelTolerance = 1;
// Of alleen popups moeten worden geretourneerd bij identificatieobjecten? Nee hier.
var returnPopupsOnly = false;
// Identificeer lagen die het tikpunt bevatten en verkrijg resultaten
IReadOnlyList<IdentifyLayerResult> identifyLayerResults = await MainMapView.IdentifyLayersAsync(tapScreenPoint, pixelTolerance, returnPopupsOnly);
var currentMapViewModel = (MapViewModel)this.FindResource("MapViewModel");
// Maak inhoud voor callout display aan
CalloutDefinition? calloutDefinition = currentMapViewModel.Identify(identifyLayerResults);
// Toon callout op kaart bij tikpunt als er inhoud is gemaakt.
if (calloutDefinition != null)
{
MainMapView.ShowCalloutAt(tapMapPoint, calloutDefinition);
}
}
Tips: '2e argument' dat aan IdentifyLayerAsync wordt doorgegeven is het gebied dat geïdentificeerd moet worden. Het is een vierkant met als middelpunt het tikpunt en met hoogte en breedte gelijk aan deze pixelwaarde. Hoe groter deze waarde, hoe groter het gebied dat wordt geïdentificeerd vanaf het tikpunt; hoe kleiner, hoe kleiner het gebied.
{
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弾ではデバイスの現在地をマップ上に表示する方法を紹介します。
関連リンク