使用自定义Bing Maps WPF图块从原始图像绘制已知像素(x,y)

时间:2015-02-01 19:32:35

标签: wpf google-maps bing-maps maptiler

我正在尝试使用Bing Maps WPF控件从虚构的游戏世界地图的图像渲染自定义地图图块,但我还需要在原始世界图像上绘制地图上的X,Y值(有点像世界上的GPS)。

图像是5720x5720,我已经在(在不同的应用程序中)工作,手动裁剪,缩放和重绘图像的各个部分,并绘制PictureBox中的pixelX和pixelY坐标。我想使用地图控件来实现相同的功能。

我使用这个Photoshop插件从原始自定义图像中剪切图块(像google mapes的maptiler一样工作) https://github.com/bramus/photoshop-google-maps-tile-cutter/

问题是我知道要从原始图像绘制的X,Y值,但我不太确定如何计算Lat / Long以在自定义图块系统中绘制点。

<m:Map Name="Map">
        <m:Map.Mode>
            <!-- set empty map mode, i.e. remove default map layer -->
            <m:MercatorMode/>
        </m:Map.Mode>
        <local:MyTileLayer UriFormat="file:///C:/map_tiles/{z}_{x}_{y}.jpg"/>
</m:Map>

地图显示效果很好,使用自定义地图图块一切正常。我发现这个链接提供了一个用于在TileSystem中将PixelXY转换为LatLong的类,但它们都是用于逼真的世界点。

https://msdn.microsoft.com/en-us/library/bb259689.aspx

我的自定义地图图块实际上是用于游戏的虚构地图,所以我不相信在我的情况下需要投影和地球曲率计算。

如果我只知道原始未处理图像中的X,Y像素坐标,我该如何准确地在Bing Maps WPF控件中绘制点?

2 个答案:

答案 0 :(得分:0)

鉴于您的5720x5720px地图图像涵盖标准Bing地图(或Google地图或OpenStreetMap)坐标范围经度= -180..180 纬度= -85.0511..85.0511 < / strong>,根据墨卡托投影,以下方法将从图像像素坐标转换为纬度/经度:

public static void PixelXYToLatLon(
    double pixelX, double pixelY, out double latitude, out double longitude)
{
    var imageSize = 5720d;
    var maxLatitude = 85.05112878; // = Math.Atan(Math.Sinh(Math.PI)) / Math.PI * 180d;
    var y = (0.5 - pixelY / imageSize) * (2d * maxLatitude);
    latitude = Math.Atan(Math.Sinh(y * Math.PI / 180d)) / Math.PI * 180d;
    longitude = (pixelX / imageSize - 0.5) * 360d;
}

imageSize变量当然也可以是方法参数。

答案 1 :(得分:0)

如果您使用MapTiler(http://www.maptiler.com)创建切片,您有两种方法可以实现您想要的效果:

A)使用Lat / Lon坐标将您的游戏地图映射到人造世界

在这种情况下,您将世界坐标映射到像素坐标。瓷砖必须以正确的方式准备,与真实世界地图相同。

要使用MapTiler创建切片,您应该按照以下步骤操作:

  1. 选择&#34;墨卡托瓷砖&#34;在第一步
  2. 放入图片文件
  3. 选择&#34; Web mercator(EPSG:3857)&#34;在&#34;协调系统的下拉菜单中#34;对话框 - 它是整个世界的方形图像,你不想让它变形。
  4. 选择&#34;边界框(西南东北)&#34;在对话框&#34;地理位置&#34;并在输入中复制并粘贴世界坐标:&#34; -20037508.342789244 -20037508.342789244 20037508.342789244 20037508.342789244&#34;
  5. 渲染图块
  6. 使用此方法,您可以在Bing Maps WPF控件中加载切片,并使用Lat / Lon坐标定位标记或其他数据。 点[0,0]将成为图像的中心,您可以适当地计算其他纬度/经度坐标。 在页面上查看此页面和源代码: http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ 如果需要,页面中嵌入的globalmaptiles.py代码可以使用不同语言,包括C#(。cs)。它已被我们的代码中的其他人移植。

    B)保持光栅坐标

    一种不同的方法 - 您可以在输入文件的原始栅格坐标中创建地图图块。没有Lat / Lon,坐标系以像素为单位,您也可以在像素坐标中绘制标记和多边形。 MapTiler为您提供Leaflet和OpenLayers中的示例JavaScript查看器。其他观看者你必须修补自己使用像素坐标。要生成图块,只需选择&#34;光栅图块&#34; - 如本教程中所述:http://youtu.be/9iYKmRsGoxg?list=PLGHe6Moaz52PiQd1mO-S9QrCjqSn1v-ay 我希望使用Photoshop插件制作的瓷砖与使用MapTiler制作的光栅坐标类似。