package com.hrupin.lazymarkers; import android.content.Context; import android.util.DisplayMetrics; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; public class Utils { private static final int BALLOON_OFFSET_IN_DP = 150; private static final double EQUATRE_LENGTH_IN_KM = 40075.7; private static final double EARTH_RADIUS_IN_KM = 6356.8; private static DisplayMetrics metrics = null; private static float density; public static GeoPoint getBalloonCenterCoords(GeoPoint markerGeoPoint, MapView mapView) { int zoom = mapView.getZoomLevel(); int balloonOffset = getOffsetInDegreesE6(zoom, dpToPxConverter(mapView.getContext(), BALLOON_OFFSET_IN_DP)); int balloonCenterLatitude = markerGeoPoint.getLatitudeE6() + balloonOffset; return new GeoPoint(balloonCenterLatitude, markerGeoPoint.getLongitudeE6()); } private static int getOffsetInDegreesE6(int zoom, int offsetInPx) { // 256 - equator length on map if zoom level = 0 double equatreLengthOnMapInPx = (double)256 * Math.pow(2, zoom); double earthRadiusOnMapInPx = (equatreLengthOnMapInPx * EARTH_RADIUS_IN_KM) / EQUATRE_LENGTH_IN_KM; double tangensValue = (double)offsetInPx / earthRadiusOnMapInPx; double offsetInDegrees = Math.toDegrees(Math.atan(tangensValue)); return (int)(offsetInDegrees * 1E6); } private static int dpToPxConverter(Context context, int dp){ if (metrics == null) { metrics = context.getResources().getDisplayMetrics(); density = metrics.density; } return (int) (density * dp + 0.5f); } }