MapControl地图大小(像素)

时间:2016-07-25 16:06:12

标签: c# win-universal-app uwp bing-maps uwp-maps

This article介绍了如何根据实际缩放级别获取总地图大小(以像素为单位)。

公式应为:

  

map width = map height = 256 * 2 ^ level pixels

不幸的是,这似乎不适用于通用应用的MapControl。首先,ZoomLevel属性的类型为double而不是整数(根据文章中的示例需要)。但是,使用整数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

表面外屏(刻度1.0):3274px

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

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

谢谢!

马斯

1 个答案:

答案 0 :(得分:1)

您引用的文章是多年前编写的,是所有Bing Maps控件中地图切片系统的基础。但是,这适用于平铺系统,而不一定是显示的地图。 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控件也允许双倍缩放级别,这在进行像素计算时工作正常。