private void Snap(Esri.ArcGISRuntime.Geometry.MapPoint mapPoint, double mapResolution)
{
if (mapPoint == null) return;
//サンプル ポリゴンのジオメトリを取得
var layer = (GraphicsLayer)mapView.Map.Layers["sampleDataLayer"];
var geometry = layer.Graphics[0].Geometry;
//スナップ許容値(距離)= 現在のマップの 1 ピクセルあたりの距離 * スナップ許容値(ピクセル数)
var tolerance = mapResolution * this.snapToleranceByPixel;
//スナップ対象のジオメトリの空間参照をマップの空間参照に一致
if (mapPoint.SpatialReference.Wkid != geometry.SpatialReference.Wkid)
{
geometry = GeometryEngine.Project(geometry, mapPoint.SpatialReference);
}
//スナップ処理を実行
SnapResult snapResult = null;
switch(this.snapMode)
{
case "geometry":
snapResult = ExecuteSnap(mapPoint, geometry, SnapType.Vertex | SnapType.Segment, tolerance);
break;
case "vertex":
snapResult = ExecuteSnap(mapPoint, geometry, SnapType.Vertex, tolerance);
break;
case "segment":
snapResult = ExecuteSnap(mapPoint, geometry, SnapType.Segment, tolerance);
break;
}
//スナップ結果が存在しない場合はスナップ エフェクトを非表示
if(snapResult == null)
{
this.snapOverlay.IsVisible = false;
this.snapOverlay.Graphics[0].Geometry = null;
return;
}
//スナップ エフェクトを表示
this.snapOverlay.IsVisible = true;
this.snapOverlay.Graphics[0].Geometry = snapResult.Result.Point;
//スナップ エフェクトのシンボル色を頂点(赤)と線分(白)で変更
if (snapResult.Type == SnapType.Vertex)
{
(this.snapOverlay.Graphics[0].Symbol as SimpleMarkerSymbol).Color = Colors.Red;
}
else
{
(this.snapOverlay.Graphics[0].Symbol as SimpleMarkerSymbol).Color = Colors.White;
}
}