/// <param name="tileX"> /// the X number of the tile. </param> /// <param name="tileY"> /// the Y number of the tile. </param> /// <param name="zoomLevel"> /// the zoom level of the tile. </param> /// <exception cref="IllegalArgumentException"> /// if any of the parameters is invalid. </exception> public Tile(int tileX, int tileY, sbyte zoomLevel, int tileSize) { if (tileX < 0) { throw new System.ArgumentException("tileX must not be negative: " + tileX); } else if (tileY < 0) { throw new System.ArgumentException("tileY must not be negative: " + tileY); } else if (zoomLevel < 0) { throw new System.ArgumentException("zoomLevel must not be negative: " + zoomLevel); } long maxTileNumber = GetMaxTileNumber(zoomLevel); if (tileX > maxTileNumber) { throw new System.ArgumentException("invalid tileX number on zoom level " + zoomLevel + ": " + tileX); } else if (tileY > maxTileNumber) { throw new System.ArgumentException("invalid tileY number on zoom level " + zoomLevel + ": " + tileY); } this.TileSize = tileSize; this.TileX = tileX; this.TileY = tileY; this.ZoomLevel = zoomLevel; this.MapSize = MercatorProjection.GetMapSize(zoomLevel, tileSize); }
private static double calculatePriority(Tile tile, MapPosition mapPosition, int tileSize) { double tileLatitude = MercatorProjection.TileYToLatitude(tile.TileY, tile.ZoomLevel); double tileLongitude = MercatorProjection.TileXToLongitude(tile.TileX, tile.ZoomLevel); int halfTileSize = tileSize / 2; long mapSize = MercatorProjection.GetMapSize(mapPosition.ZoomLevel, tileSize); double tilePixelX = MercatorProjection.LongitudeToPixelX(tileLongitude, mapSize) + halfTileSize; double tilePixelY = MercatorProjection.LatitudeToPixelY(tileLatitude, mapSize) + halfTileSize; LatLong latLong = mapPosition.LatLong; double mapPixelX = MercatorProjection.LongitudeToPixelX(latLong.Longitude, mapSize); double mapPixelY = MercatorProjection.LatitudeToPixelY(latLong.Latitude, mapSize); double diffPixel = Math.Sqrt(Math.Pow(tilePixelX - mapPixelX, 2) + Math.Pow(tilePixelY - mapPixelY, 2)); int diffZoom = Math.Abs(tile.ZoomLevel - mapPosition.ZoomLevel); return(diffPixel + PENALTY_PER_ZOOM_LEVEL * tileSize * diffZoom); }