QuadKey:点映射到错误的磁贴? [英] QuadKey: Point mapping to wrong tile?

查看:72
本文介绍了QuadKey:点映射到错误的磁贴?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿伙计们!在我目前的项目中,我正在与QuadKeys进行广泛合作,现在我面临以下问题。请看下面的插图代码示例。我有一个点并将其映射到"精确"的图块上。 16.然而,得到的
图块似乎是关闭的,甚至不包含该点,而另一个图块更适合。你能帮我解决一下我的错误吗?


我正在使用https://msdn.microsoft.com/en-us/library/bb259689.aspx?f中的参考代码= 255& MSPPError = -2147217396

使用System; 
使用Microsoft.MapPoint;

命名空间QuadKeys
{
class程序
{
static void Main(string [] args)
{
int lvl = 16;
int pixelX,pixelY;
int tileX,tileY;
double lat,lon;

//指向QuadKey:(37.522942111,-122.266098111) - > 0230102300203310
TileSystem.LatLongToPixelXY(37.522942111,-122.266098111,lvl,out pixelX,out pixelY);
TileSystem.PixelXYToTileXY(pixelX,pixelY,out tileX,out tileY);
string quad = TileSystem.TileXYToQuadKey(tileX,tileY,lvl);
Console.WriteLine(quad);

// QuadKey返回点(平铺中心):0230102300203310 - > (37.5271536172338,-122.266845703125)
TileSystem.QuadKeyToTileXY(quad,out tileX,out tileY,out lvl);
TileSystem.TileXYToPixelXY(tileX,tileY,out pixelX,out pixelY);
TileSystem.PixelXYToLatLong(pixelX,pixelY,lvl,out lat,out lon);
Console.WriteLine(lat +"," + lon);

//现在让我们拿出瓷砖的QuadKey,它正好低于我们刚刚得到的那个,这是0230102300203312
// QuadKey(下面一个瓷砖)指向:0230102300203312 - > (37.5271536172338,-122.261352539062)
//在地图上可视化所有三个点以查看问题。这个图块非常接近原始点,但是,相反,上面的一个
//被计算,尽管它是垂直关闭的。
TileSystem.QuadKeyToTileXY(" 0230102300203312",out tileX,out tileY,out lvl);
TileSystem.TileXYToPixelXY(tileX,tileY,out pixelX,out pixelY);
TileSystem.PixelXYToLatLong(pixelX,pixelY,lvl,out lat,out lon);
Console.WriteLine(lat +"," + lon);
}
}
}

编辑:我的假设是否可能 PixelXYToLatLon ()推出瓷砖的中心点是错误的,而是返回西北角?





解决方案

嗨Ferdinand,


以下是您正在讨论的两个示例程序:

 ///< summary> 
///将像素XY坐标转换为包含
///指定像素的图块的图块XY坐标。
///< / summary>
///< param name =" pixelX">像素X坐标。< / param>
///< param name =" pixelY">像素Y坐标。< / param>
///< param name =" tileX">接收拼贴X坐标的输出参数。< / param>
///< param name =" tileY">接收拼贴Y坐标的输出参数。< / param>
public static void PixelXYToTileXY(int pixelX,int pixelY,out int tileX,out int tileY)
{
tileX = pixelX / 256;
tileY = pixelY / 256;
}

///< summary>
///将平铺XY坐标转换为指定平铺的左上角像素
///的像素XY坐标。
///< / summary>
///< param name =" tileX"> Tile X坐标。< / param>
///< param name =" tileY"> Tile Y坐标。< / param>
///< param name =" pixelX">接收像素X坐标的输出参数。< / param>
///< param name =" pixelY">接收像素Y坐标的输出参数。< / param>
public static void TileXYToPixelXY(int tileX,int tileY,out int pixelX,out int pixelY)
{
pixelX = tileX * 256;
pixelY = tileY * 256;
}

Pixel版本将为您提供的图块上的特定像素返回lat长度,而图块版本将按照您的建议返回角落。 ( https://msdn.microsoft.com/en-us/library/ bb259689.aspx


此致,


IoTGirl



Hey guys! In my current project, I am extensively working with QuadKeys and now I'm facing the following problem. Please take a look at the illustrating code example below. I have a point and map it to a tile on "precision" 16. However, the resulting tile seems to be off and does not even contain the point, while another tile would be a better fit. Can you please help me figure out my mistake?

I'm using the reference code from https://msdn.microsoft.com/en-us/library/bb259689.aspx?f=255&MSPPError=-2147217396

using System;
using Microsoft.MapPoint;

namespace QuadKeys
{
    class Program
    {
        static void Main(string[] args)
        {
            int lvl = 16;
            int pixelX, pixelY;
            int tileX, tileY;
            double lat, lon;

            // Point to QuadKey: (37.522942111, -122.266098111) -> 0230102300203310
            TileSystem.LatLongToPixelXY(37.522942111, -122.266098111, lvl, out pixelX, out pixelY);
            TileSystem.PixelXYToTileXY(pixelX, pixelY, out tileX, out tileY);
            string quad = TileSystem.TileXYToQuadKey(tileX, tileY, lvl);
            Console.WriteLine(quad);

            // QuadKey back to point (tile center): 0230102300203310 -> (37.5271536172338, -122.266845703125)
            TileSystem.QuadKeyToTileXY(quad, out tileX, out tileY, out lvl);
            TileSystem.TileXYToPixelXY(tileX, tileY, out pixelX, out pixelY);
            TileSystem.PixelXYToLatLong(pixelX, pixelY, lvl, out lat, out lon);
            Console.WriteLine(lat + ", " + lon);

            // Now let's take the QuadKey of the tile which is exactly below the one we just got as a result, which is 0230102300203312
            // QuadKey (one tile below) to point: 0230102300203312 -> (37.5271536172338, -122.261352539062)
            // Visualize all three points on a map to see the problem. This tile is very close to the original point, but instead, the above one 
            // is computed, although it's vertically off.
            TileSystem.QuadKeyToTileXY("0230102300203312", out tileX, out tileY, out lvl);
            TileSystem.TileXYToPixelXY(tileX, tileY, out pixelX, out pixelY);
            TileSystem.PixelXYToLatLong(pixelX, pixelY, lvl, out lat, out lon);
            Console.WriteLine(lat + ", " + lon);
        }
    }
}

EDIT: Is it possible that my assumption, that PixelXYToLatLon() puts out the center point of a tile is wrong, but instead, it returns the north-west corner?


解决方案

Hi Ferdinand,

Here are the two sample routines you are discussing:

        /// <summary>
        /// Converts pixel XY coordinates into tile XY coordinates of the tile containing
        /// the specified pixel.
        /// </summary>
        /// <param name="pixelX">Pixel X coordinate.</param>
        /// <param name="pixelY">Pixel Y coordinate.</param>
        /// <param name="tileX">Output parameter receiving the tile X coordinate.</param>
        /// <param name="tileY">Output parameter receiving the tile Y coordinate.</param>
        public static void PixelXYToTileXY(int pixelX, int pixelY, out int tileX, out int tileY)
        {
            tileX = pixelX / 256;
            tileY = pixelY / 256;
        }

        /// <summary>
        /// Converts tile XY coordinates into pixel XY coordinates of the upper-left pixel
        /// of the specified tile.
        /// </summary>
        /// <param name="tileX">Tile X coordinate.</param>
        /// <param name="tileY">Tile Y coordinate.</param>
        /// <param name="pixelX">Output parameter receiving the pixel X coordinate.</param>
        /// <param name="pixelY">Output parameter receiving the pixel Y coordinate.</param>
        public static void TileXYToPixelXY(int tileX, int tileY, out int pixelX, out int pixelY)
        {
            pixelX = tileX * 256;
            pixelY = tileY * 256;
        }

The Pixel version will return a lat long for the specific pixel on the tile you give it while the tile version will return the corner as you suggest. (https://msdn.microsoft.com/en-us/library/bb259689.aspx)

Sincerely,

IoTGirl


这篇关于QuadKey:点映射到错误的磁贴?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆