Série « Développement d'application cartographique de bureau »Épisode5.
Cette fois,dans le 4e épisodenous ajoutons une fonction pour afficher les attributs individuels des données référencées sur la carte dans l'application cartographique créée. Le code source de l'exemple présenté dans cet article est disponible sur Esriジャパン GitHub .
Affichage des attributs individuels
Nous implémentons une fonction qui affiche les informations d'attributs dufeaturesélectionné sur la carte, permettant ainsi de vérifier quelles valeurs possède ce feature. Cette fois, regardons les informations d'attributs des polygones des zones scolaires primaires et secondaires ou des points des écoles primaires et secondaires tapés sur la carte.
1. Ouvrez MainWindows.xaml et implémentez l'événement GeoViewTapped (ajoutez GeoViewTapped="MainMapView_GeoViewTapped").
MainWindows.xaml
<esri:MapView x:Name="MainMapView" Map="{Binding Map, Source={StaticResource MapViewModel}}" GeoViewTapped="MainMapView_GeoViewTapped"/>
2. Ouvrez MainWindows.xaml.cs et ajoutez les références aux espaces de noms suivants.
MainWindows.xaml.cs
using Esri.ArcGISRuntime.Data;
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.UI.Controls;
using Esri.ArcGISRuntime.UI;
3. Créez le traitement à exécuter lors de l'événement GeoViewTapped. Pour obtenir le feature au point tapé, utilisez la méthode GeoView.IdentifyLayerAsync()en passant la couche à identifier et le point écran du tap inclus dans le retour de l'événement tap. Cette méthode permet d'obtenir les features situés au point tapé dans la couche.
Pour créer l'interface utilisateur d'affichage des attributs, utilisez le UI , le Callout . Le callout permet d'afficher facilement une bulle à n'importe quel endroit sur la carte.Passez à GeoView.ShowCalloutAt() la position d'affichage (point tapé) et le contenu (un CalloutDefinition) pour afficher le callout.
MainWindows.xaml.cs
// Gestionnaire d'événement de tap sur la vue carte
public async void MainMapView_GeoViewTapped(object sender, GeoViewInputEventArgs e)
{
// Masquer tout callout déjà affiché
MainMapView.DismissCallout();
// Obtenir les coordonnées écran du point tapé
Point tapScreenPoint = e.Position;
// Obtenir les coordonnées carte du point tapé
MapPoint tapMapPoint = e.Location!;
// Tolérance en pixels autour du point tapé pour l'identification (carré centré)
int pixelTolerance = 1;
// Indique si seuls les popups doivent être retournés (ici false)
var returnPopupsOnly = false;
// Identifier les couches contenant le point tapé et obtenir les résultats
IReadOnlyList<IdentifyLayerResult> identifyLayerResults = await MainMapView.IdentifyLayersAsync(tapScreenPoint, pixelTolerance, returnPopupsOnly);
var currentMapViewModel = (MapViewModel)this.FindResource("MapViewModel");
// Créer le contenu à afficher dans le callout à partir des résultats d'identification
CalloutDefinition? calloutDefinition = currentMapViewModel.Identify(identifyLayerResults);
// Afficher le callout sur la carte au point tapé si défini
if (calloutDefinition != null)
{
MainMapView.ShowCalloutAt(tapMapPoint, calloutDefinition);
}
}
Conseil :Le 2e argument passé à IdentifyLayerAsync est la zone à identifier. Il s'agit d'un carré centré sur le point tapé avec la largeur et hauteur en pixels définies. Plus cette valeur est grande, plus la zone identifiée est large ; plus elle est petite, plus elle est restreinte.
{
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弾ではデバイスの現在地をマップ上に表示する方法を紹介します。
関連リンク