package edu.fsu.cs.contextprovider.map;
import com.google.android.maps.GeoPoint;
import android.location.Location;
public class GeoPointUtil {
public static GeoPoint fromLocation(Location location) {
return new GeoPoint((int) Math.round(location.getLatitude() * 1E6),
(int) Math.round(location.getLongitude() * 1E6));
}
public static FloatingPointGeoPoint getGeoPointNear(double lat, double lon,
double distanceMeters) {
double targetLat = Math.random() - 0.5 + lat;
double targetLon = Math.random() - 0.5 + lon;
return geoPointTowardsTarget(lat, lon, targetLat, targetLon, distanceMeters);
}
public static FloatingPointGeoPoint geoPointTowardsTarget(
double oLat,
double oLon,
double dLat,
double dLon,
double distanceMeters) {
double diffLat = dLat - oLat;
double diffLon = dLon - oLon;
double diffMagnitudeMeters = distanceMeters(oLat, oLon, dLat, dLon);
double deltaLat = diffLat * (distanceMeters / diffMagnitudeMeters);
double deltaLon = diffLon * (distanceMeters / diffMagnitudeMeters);
return new FloatingPointGeoPoint(oLat + deltaLat, oLon + deltaLon);
}
/**
* A version of distanceMeters that can be used without allocating additional
* FloatingPointGeoPoint objects.
*/
public static double distanceMeters(double aLat, double aLon, double bLat, double bLon) {
// Haversine formula, from http://mathforum.org/library/drmath/view/51879.html
double dlon = bLon - aLon;
double dlat = bLat - aLat;
double a = Math.pow(Math.sin(Math.toRadians(dlat/2)), 2) +
Math.cos(Math.toRadians(aLat)) *
Math.cos(Math.toRadians(bLat)) *
Math.pow(Math.sin(Math.toRadians(dlon / 2)), 2);
double greatCircleDistance = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return 6378100 * greatCircleDistance;
}
}