1

本文介绍如何根据实际缩放级别获取以像素为单位的总地图大小。

公式应该是:

地图宽度 = 地图高度 = 256 * 2^level 像素

不幸的是,这似乎不适用于通用应用程序的MapControl 。首先,ZoomLevel 属性的类型是双精度而非整数(如本文示例中所需要的那样)。但是对于整数 ZoomLevel 即 4.0 (int --> 4),该公式也不起作用。

现在,我尝试借助 MapControl.GetOffsetFromLocation 方法获取以像素为单位的地图大小:

    private double GetMapSize()
    {
        Point pW, pE;

        myMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition()
            { Longitude = -90, Latitude = 0 }), out pW);
        myMap.GetOffsetFromLocation(new Geopoint(new BasicGeoposition()
            { Longitude = 90, Latitude = 0 }), out pE);

        return (pE.X - pW.X) * 2;
    }

这适用于某些像素的差异,但这个问题实际上并不重要。

我在 Surface Pro 3 上得到以下结果(ZoomLevel 为 4.0):

曲面屏幕(比例 1.5):3654px

Surface外屏(比例1.0):3274px

这些结果都不是文章中描述的 4096 像素。结果是正确的,我可以使用它。但对我来说,这只是一种解决方法,而且如果 ZoomLevel 高于大约 13,GetOffsetFromLocation 方法为 pE.X 和 pW.X (对于 -90 和 90)返回 -1。对于更接近实际中心的经度,它可以工作。似乎 GetOffsetFromLocation 的距离最大。因此,当具有更高的 ZoomLevel 时,我需要使用更接近的经度值。

这一切都不是一个明确的解决方案。所以我的问题是:是否有保存方法来获取 UWP MapControl 的精确地图大小(以像素为单位)?

谢谢!

马斯

4

1 回答 1

1

您引用的文章是多年前写的,是所有 Bing 地图控件中地图平铺系统的基础。但是,这适用于平铺系统,不一定适用于显示的地图。UWP 控件会修改其呈现方式以与屏幕的像素密度对齐,从而使其美观清晰。这就是您在使用 GetOffsetFromLocation 时看到预期地图像素大小之间存在差异的原因。我相信 UWP 控制用于计算的基本像素密度为 128。Surface Pro 3 的像素密度为 216.33。因此,通过一些数学运算并考虑到 1.5 缩放,我们看到 (128*1.5)/216.33*4096 = 3635 这与您使用您的方法计算的值更接近。考虑到这一点,我估计你的外部屏幕的像素密度是 4096/3274*128 = 160。

至于:

map width = map height = 256 * 2^zoom;

这也适用于双打。旧的 Bing Maps Silverlight 控件也允许双倍缩放级别,并且在进行像素计算时效果很好。

于 2016-07-25T17:32:02.073 回答