Map控件的 zoomto方法可以将地图缩放到一个Geometry的 extent范围并且将该geometry置于当前视域中心,然而对于point 要素来说,这个方法是无效的,因为point的 extent范围为0。
然而在实际应用中,用户对于点的zoomto需求还是比较多的,有一个比较简单的方法就是以点为中心上下左右扩张一段距离构建一个envelope,然后zoomto到这个envelope。但是这个方法复用性不强,对于每个问题都需要重新定义合适的envelope。
于是考虑有没有通用性比较强的zoomto方法,map控件有一个ZoomToResolution(Double, MapPoint)方法,该方法以MapPoint为锚点,将Map缩放到指定的resolution.。
然而这个方法只是确保了缩放后Mappoint相对于屏幕的位置不变,并不会将MapPoint移动到屏幕中心。
(这个方法就是Map控件中响应double click的方法,以双击点为不动点,地图放大一倍 Map.ZoomToResolution(Map.Resolution/2, click_point) )
下面考虑应用ZoomToResolution方法自定义一个可以将点 Zoom 并且Pan到中心的方法:

以上图为例,A是Map的中点,B是我们的目标点,现在的问题就变成了如何在地图上找到一个点C,
使得我使用ZoomToResolution(zoomRatio r, MapPoint C)之后,B点会移动到A的位置。
不失一般性,我们假设地图放大的比例为r,即放大后的 Map.Resolution 比 放大前的Map.Resolution 等于r,
则C点必须满足 BC:AC = r ,即 DE : AE = r ,
设A点坐标为 (CenterX, CenterY), B点坐标(X, Y),C点坐标为(Xc, Yc),代入上面的等式,得:
(Xc-X)/r = Xc - CenterX ;
(Yc-Y)/r = Yc - CenterY ;
得出C点的坐标满足关系:
Xc = (X - CenterX*r)/(1 - r)
Yc = (Y - CenterY*r)/(1 - r)
根据以上理论,不难写一个满足这个需求的函数:
private void centerAndZoom(ESRI.ArcGIS.Client.Map map, ESRI.ArcGIS.Client.Geometry.MapPoint mapPoint, double resolution)
{
double ratio = 1.0;
if (map.Resolution != 0.0)
ratio = resolution / map.Resolution;
if (ratio == 1.0)
map.PanTo(mapPoint);
else
{
ESRI.ArcGIS.Client.Geometry.MapPoint mapCenter = map.Extent.GetCenter();
double X = (mapPoint.X - ratio * mapCenter.X) / (1 - ratio);
double Y = (mapPoint.Y - ratio * mapCenter.Y) / (1 - ratio);
map.ZoomToResolution(resolution, new ESRI.ArcGIS.Client.Geometry.MapPoint(X, Y));
}
}
这样,在实际使用中,如果我们想要zoom and center 到一个点 pt,可以使用以下语句完成:
centerAndZoom(map, pt, map.Resolution * 4);