import org.mapsforge.core.model.Tile; //导入方法依赖的package包/类
/**
* Calculates the priority for the given tile based on the current position and zoom level of the supplied MapView.
* The smaller the distance from the tile center to the MapView center, the higher its priority. If the zoom level
* of a tile differs from the zoom level of the MapView, its priority decreases.
*
* @param tile
* the tile whose priority should be calculated.
* @param mapView
* the MapView whose current position and zoom level define the priority of the tile.
* @return the current priority of the tile. A smaller number means a higher priority.
*/
static double getPriority(Tile tile, MapView mapView) {
byte tileZoomLevel = tile.zoomLevel;
// calculate the center coordinates of the tile
long tileCenterPixelX = tile.getPixelX() + (Tile.TILE_SIZE >> 1);
long tileCenterPixelY = tile.getPixelY() + (Tile.TILE_SIZE >> 1);
double tileCenterLongitude = MercatorProjection.pixelXToLongitude(tileCenterPixelX, tileZoomLevel);
double tileCenterLatitude = MercatorProjection.pixelYToLatitude(tileCenterPixelY, tileZoomLevel);
// calculate the Euclidian distance from the MapView center to the tile center
MapPosition mapPosition = mapView.getMapViewPosition().getMapPosition();
GeoPoint geoPoint = mapPosition.geoPoint;
double longitudeDiff = geoPoint.longitude - tileCenterLongitude;
double latitudeDiff = geoPoint.latitude - tileCenterLatitude;
double euclidianDistance = Math.sqrt(longitudeDiff * longitudeDiff + latitudeDiff * latitudeDiff);
if (mapPosition.zoomLevel == tileZoomLevel) {
return euclidianDistance;
}
int zoomLevelDiff = Math.abs(mapPosition.zoomLevel - tileZoomLevel);
double scaleFactor = Math.pow(2, zoomLevelDiff);
double scaledEuclidianDistance;
if (mapPosition.zoomLevel < tileZoomLevel) {
scaledEuclidianDistance = euclidianDistance * scaleFactor;
} else {
scaledEuclidianDistance = euclidianDistance / scaleFactor;
}
double zoomLevelPenalty = zoomLevelDiff * ZOOM_LEVEL_PENALTY;
return scaledEuclidianDistance * zoomLevelPenalty;
}