QuadKey:点映射到错误的磁贴? [英] QuadKey: Point mapping to wrong tile?
问题描述
嘿伙计们!在我目前的项目中,我正在与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屋!