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); }