ArcGIS Silverlight API 中如何缩放到点

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到中心的方法:


以上图为例,AMap的中点,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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值