UWP:按比例绘制地图图标及不同缩放级别下POI距离像素换算问题
UWP地图POI距离转像素计算及内置功能说明
一、距离转像素计算逻辑
- 第一步:获取当前地图的米/像素换算系数
你可以直接通过UWP MapControl的GetOffsetFromLocation方法换算,也可以用通用瓦片地图公式计算:
得到的// vehicleLatitude为车辆当前所在纬度,currentZoomLevel为地图当前缩放级别 double metersPerPixel = 156543.03392 * Math.Cos(vehicleLatitude * Math.PI / 180) / Math.Pow(2, currentZoomLevel);metersPerPixel就是当前视图下,1个像素对应的实际地理距离(单位:米)。 - 第二步:换算POI对应像素坐标
已知POI相对车辆的实际距离偏移(东向偏移xDistance、北向偏移yDistance),对应WriteableBitmap上的像素坐标计算方式为:
如果你用的是1000*1000的POI二维数组、每个单元对应0.5米(覆盖500米范围),遍历数组时坐标转换逻辑为:// 车辆固定在WriteableBitmap中心 int centerXPixel = writeableBitmap.PixelWidth / 2; int centerYPixel = writeableBitmap.PixelHeight / 2; // 屏幕Y轴向下,地理北向向上,所以Y方向偏移要取反 int poiXPixel = centerXPixel + (int)Math.Round(xDistance / metersPerPixel); int poiYPixel = centerYPixel - (int)Math.Round(yDistance / metersPerPixel);// arrayX、arrayY为POI在二维数组中的坐标,数组中心为[500,500] double xDistance = (arrayX - 500) * 0.5; double yDistance = (500 - arrayY) * 0.5; // 后续按上述公式转像素坐标即可
二、UWP内置比例绘制相关功能
- 原生MapControl已经自带坐标映射能力:你不需要手动操作WriteableBitmap渲染,直接用
MapItemsControl绑定POI集合,控件会自动根据当前缩放级别调整POI的屏幕位置,完全不需要手动计算像素偏移。 - 如果需要自定义渲染图层,可使用Win2D的
CanvasControl叠加在MapControl上层,在Draw事件中调用MapControl.GetOffsetFromLocation直接获取POI对应的屏幕坐标绘制,性能远高于手动操作WriteableBitmap。 - 如果你坚持用WriteableBitmap渲染,可搭配
ScaleTransform直接对位图做比例缩放,只要将缩放比例设置为基准比例 / Math.Pow(2, currentZoomLevel - baseZoomLevel)即可匹配当前地图的缩放比例。

内容的提问来源于stack exchange,提问作者johnd
相关产品推荐
相关产品推荐

