Methods Summary |
---|
public float | bearingTo(android.location.Location dest)Returns the approximate initial bearing in degrees East of true
North when traveling along the shortest path between this
location and the given location. The shortest path is defined
using the WGS84 ellipsoid. Locations that are (nearly)
antipodal may produce meaningless results.
synchronized (mResults) {
// See if we already have the result
if (mLatitude != mLat1 || mLongitude != mLon1 ||
dest.mLatitude != mLat2 || dest.mLongitude != mLon2) {
computeDistanceAndBearing(mLatitude, mLongitude,
dest.mLatitude, dest.mLongitude, mResults);
mLat1 = mLatitude;
mLon1 = mLongitude;
mLat2 = dest.mLatitude;
mLon2 = dest.mLongitude;
mDistance = mResults[0];
mInitialBearing = mResults[1];
}
return mInitialBearing;
}
|
private static void | computeDistanceAndBearing(double lat1, double lon1, double lat2, double lon2, float[] results)
// Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf
// using the "Inverse Formula" (section 4)
int MAXITERS = 20;
// Convert lat/long to radians
lat1 *= Math.PI / 180.0;
lat2 *= Math.PI / 180.0;
lon1 *= Math.PI / 180.0;
lon2 *= Math.PI / 180.0;
double a = 6378137.0; // WGS84 major axis
double b = 6356752.3142; // WGS84 semi-major axis
double f = (a - b) / a;
double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b);
double L = lon2 - lon1;
double A = 0.0;
double U1 = Math.atan((1.0 - f) * Math.tan(lat1));
double U2 = Math.atan((1.0 - f) * Math.tan(lat2));
double cosU1 = Math.cos(U1);
double cosU2 = Math.cos(U2);
double sinU1 = Math.sin(U1);
double sinU2 = Math.sin(U2);
double cosU1cosU2 = cosU1 * cosU2;
double sinU1sinU2 = sinU1 * sinU2;
double sigma = 0.0;
double deltaSigma = 0.0;
double cosSqAlpha = 0.0;
double cos2SM = 0.0;
double cosSigma = 0.0;
double sinSigma = 0.0;
double cosLambda = 0.0;
double sinLambda = 0.0;
double lambda = L; // initial guess
for (int iter = 0; iter < MAXITERS; iter++) {
double lambdaOrig = lambda;
cosLambda = Math.cos(lambda);
sinLambda = Math.sin(lambda);
double t1 = cosU2 * sinLambda;
double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
double sinSqSigma = t1 * t1 + t2 * t2; // (14)
sinSigma = Math.sqrt(sinSqSigma);
cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15)
sigma = Math.atan2(sinSigma, cosSigma); // (16)
double sinAlpha = (sinSigma == 0) ? 0.0 :
cosU1cosU2 * sinLambda / sinSigma; // (17)
cosSqAlpha = 1.0 - sinAlpha * sinAlpha;
cos2SM = (cosSqAlpha == 0) ? 0.0 :
cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18)
double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn
A = 1 + (uSquared / 16384.0) * // (3)
(4096.0 + uSquared *
(-768 + uSquared * (320.0 - 175.0 * uSquared)));
double B = (uSquared / 1024.0) * // (4)
(256.0 + uSquared *
(-128.0 + uSquared * (74.0 - 47.0 * uSquared)));
double C = (f / 16.0) *
cosSqAlpha *
(4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10)
double cos2SMSq = cos2SM * cos2SM;
deltaSigma = B * sinSigma * // (6)
(cos2SM + (B / 4.0) *
(cosSigma * (-1.0 + 2.0 * cos2SMSq) -
(B / 6.0) * cos2SM *
(-3.0 + 4.0 * sinSigma * sinSigma) *
(-3.0 + 4.0 * cos2SMSq)));
lambda = L +
(1.0 - C) * f * sinAlpha *
(sigma + C * sinSigma *
(cos2SM + C * cosSigma *
(-1.0 + 2.0 * cos2SM * cos2SM))); // (11)
double delta = (lambda - lambdaOrig) / lambda;
if (Math.abs(delta) < 1.0e-12) {
break;
}
}
float distance = (float) (b * A * (sigma - deltaSigma));
results[0] = distance;
if (results.length > 1) {
float initialBearing = (float) Math.atan2(cosU2 * sinLambda,
cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
initialBearing *= 180.0 / Math.PI;
results[1] = initialBearing;
if (results.length > 2) {
float finalBearing = (float) Math.atan2(cosU1 * sinLambda,
-sinU1 * cosU2 + cosU1 * sinU2 * cosLambda);
finalBearing *= 180.0 / Math.PI;
results[2] = finalBearing;
}
}
|
public static java.lang.String | convert(double coordinate, int outputType)Converts a coordinate to a String representation. The outputType
may be one of FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS.
The coordinate must be a valid double between -180.0 and 180.0.
if (coordinate < -180.0 || coordinate > 180.0 ||
Double.isNaN(coordinate)) {
throw new IllegalArgumentException("coordinate=" + coordinate);
}
if ((outputType != FORMAT_DEGREES) &&
(outputType != FORMAT_MINUTES) &&
(outputType != FORMAT_SECONDS)) {
throw new IllegalArgumentException("outputType=" + outputType);
}
StringBuilder sb = new StringBuilder();
// Handle negative values
if (coordinate < 0) {
sb.append('-");
coordinate = -coordinate;
}
DecimalFormat df = new DecimalFormat("###.#####");
if (outputType == FORMAT_MINUTES || outputType == FORMAT_SECONDS) {
int degrees = (int) Math.floor(coordinate);
sb.append(degrees);
sb.append(':");
coordinate -= degrees;
coordinate *= 60.0;
if (outputType == FORMAT_SECONDS) {
int minutes = (int) Math.floor(coordinate);
sb.append(minutes);
sb.append(':");
coordinate -= minutes;
coordinate *= 60.0;
}
}
sb.append(df.format(coordinate));
return sb.toString();
|
public static double | convert(java.lang.String coordinate)Converts a String in one of the formats described by
FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS into a
double.
// IllegalArgumentException if bad syntax
if (coordinate == null) {
throw new NullPointerException("coordinate");
}
boolean negative = false;
if (coordinate.charAt(0) == '-") {
coordinate = coordinate.substring(1);
negative = true;
}
StringTokenizer st = new StringTokenizer(coordinate, ":");
int tokens = st.countTokens();
if (tokens < 1) {
throw new IllegalArgumentException("coordinate=" + coordinate);
}
try {
String degrees = st.nextToken();
double val;
if (tokens == 1) {
val = Double.parseDouble(degrees);
return negative ? -val : val;
}
String minutes = st.nextToken();
int deg = Integer.parseInt(degrees);
double min;
double sec = 0.0;
if (st.hasMoreTokens()) {
min = Integer.parseInt(minutes);
String seconds = st.nextToken();
sec = Double.parseDouble(seconds);
} else {
min = Double.parseDouble(minutes);
}
boolean isNegative180 = negative && (deg == 180) &&
(min == 0) && (sec == 0);
// deg must be in [0, 179] except for the case of -180 degrees
if ((deg < 0.0) || (deg > 179 && !isNegative180)) {
throw new IllegalArgumentException("coordinate=" + coordinate);
}
if (min < 0 || min > 59) {
throw new IllegalArgumentException("coordinate=" +
coordinate);
}
if (sec < 0 || sec > 59) {
throw new IllegalArgumentException("coordinate=" +
coordinate);
}
val = deg*3600.0 + min*60.0 + sec;
val /= 3600.0;
return negative ? -val : val;
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("coordinate=" + coordinate);
}
|
public int | describeContents()
return 0;
|
public static void | distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)Computes the approximate distance in meters between two
locations, and optionally the initial and final bearings of the
shortest path between them. Distance and bearing are defined using the
WGS84 ellipsoid.
The computed distance is stored in results[0]. If results has length
2 or greater, the initial bearing is stored in results[1]. If results has
length 3 or greater, the final bearing is stored in results[2].
if (results == null || results.length < 1) {
throw new IllegalArgumentException("results is null or has length < 1");
}
computeDistanceAndBearing(startLatitude, startLongitude,
endLatitude, endLongitude, results);
|
public float | distanceTo(android.location.Location dest)Returns the approximate distance in meters between this
location and the given location. Distance is defined using
the WGS84 ellipsoid.
// See if we already have the result
synchronized (mResults) {
if (mLatitude != mLat1 || mLongitude != mLon1 ||
dest.mLatitude != mLat2 || dest.mLongitude != mLon2) {
computeDistanceAndBearing(mLatitude, mLongitude,
dest.mLatitude, dest.mLongitude, mResults);
mLat1 = mLatitude;
mLon1 = mLongitude;
mLat2 = dest.mLatitude;
mLon2 = dest.mLongitude;
mDistance = mResults[0];
mInitialBearing = mResults[1];
}
return mDistance;
}
|
public void | dump(android.util.Printer pw, java.lang.String prefix)
pw.println(prefix + "mProvider=" + mProvider + " mTime=" + mTime);
pw.println(prefix + "mLatitude=" + mLatitude + " mLongitude=" + mLongitude);
pw.println(prefix + "mHasAltitude=" + mHasAltitude + " mAltitude=" + mAltitude);
pw.println(prefix + "mHasSpeed=" + mHasSpeed + " mSpeed=" + mSpeed);
pw.println(prefix + "mHasBearing=" + mHasBearing + " mBearing=" + mBearing);
pw.println(prefix + "mHasAccuracy=" + mHasAccuracy + " mAccuracy=" + mAccuracy);
pw.println(prefix + "mExtras=" + mExtras);
|
public float | getAccuracy()Returns the accuracy of the fix in meters. If hasAccuracy() is false,
0.0 is returned.
return mAccuracy;
|
public double | getAltitude()Returns the altitude of this fix. If {@link #hasAltitude} is false,
0.0f is returned.
return mAltitude;
|
public float | getBearing()Returns the direction of travel in degrees East of true
North. If hasBearing() is false, 0.0 is returned.
return mBearing;
|
public android.os.Bundle | getExtras()Returns additional provider-specific information about the
location fix as a Bundle. The keys and values are determined
by the provider. If no additional information is available,
null is returned.
A number of common key/value pairs are listed
below. Providers that use any of the keys on this list must
provide the corresponding value as described below.
- satellites - the number of satellites used to derive the fix
return mExtras;
|
public double | getLatitude()Returns the latitude of this fix.
return mLatitude;
|
public double | getLongitude()Returns the longitude of this fix.
return mLongitude;
|
public java.lang.String | getProvider()Returns the name of the provider that generated this fix,
or null if it is not associated with a provider.
return mProvider;
|
public float | getSpeed()Returns the speed of the device over ground in meters/second.
If hasSpeed() is false, 0.0f is returned.
return mSpeed;
|
public long | getTime()Returns the UTC time of this fix, in milliseconds since January 1,
1970.
return mTime;
|
public boolean | hasAccuracy()Returns true if the provider is able to report accuracy information,
false otherwise. The default implementation returns false.
return mHasAccuracy;
|
public boolean | hasAltitude()Returns true if this fix contains altitude information, false
otherwise.
return mHasAltitude;
|
public boolean | hasBearing()Returns true if the provider is able to report bearing information,
false otherwise. The default implementation returns false.
return mHasBearing;
|
public boolean | hasSpeed()Returns true if this fix contains speed information, false
otherwise. The default implementation returns false.
return mHasSpeed;
|
public void | removeAccuracy()Clears the accuracy of this fix. Following this call, hasAccuracy()
will return false.
mAccuracy = 0.0f;
mHasAccuracy = false;
|
public void | removeAltitude()Clears the altitude of this fix. Following this call,
hasAltitude() will return false.
mAltitude = 0.0f;
mHasAltitude = false;
|
public void | removeBearing()Clears the bearing of this fix. Following this call, hasBearing()
will return false.
mBearing = 0.0f;
mHasBearing = false;
|
public void | removeSpeed()Clears the speed of this fix. Following this call, hasSpeed()
will return false.
mSpeed = 0.0f;
mHasSpeed = false;
|
public void | reset()Clears the contents of the location.
mProvider = null;
mTime = 0;
mLatitude = 0;
mLongitude = 0;
mHasAltitude = false;
mAltitude = 0;
mHasSpeed = false;
mSpeed = 0;
mHasBearing = false;
mBearing = 0;
mHasAccuracy = false;
mAccuracy = 0;
mExtras = null;
|
public void | set(android.location.Location l)Sets the contents of the location to the values from the given location.
mProvider = l.mProvider;
mTime = l.mTime;
mLatitude = l.mLatitude;
mLongitude = l.mLongitude;
mHasAltitude = l.mHasAltitude;
mAltitude = l.mAltitude;
mHasSpeed = l.mHasSpeed;
mSpeed = l.mSpeed;
mHasBearing = l.mHasBearing;
mBearing = l.mBearing;
mHasAccuracy = l.mHasAccuracy;
mAccuracy = l.mAccuracy;
mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras);
|
public void | setAccuracy(float accuracy)Sets the accuracy of this fix. Following this call, hasAccuracy()
will return true.
mAccuracy = accuracy;
mHasAccuracy = true;
|
public void | setAltitude(double altitude)Sets the altitude of this fix. Following this call,
hasAltitude() will return true.
mAltitude = altitude;
mHasAltitude = true;
|
public void | setBearing(float bearing)Sets the bearing of this fix. Following this call, hasBearing()
will return true.
while (bearing < 0.0f) {
bearing += 360.0f;
}
while (bearing >= 360.0f) {
bearing -= 360.0f;
}
mBearing = bearing;
mHasBearing = true;
|
public void | setExtras(android.os.Bundle extras)Sets the extra information associated with this fix to the
given Bundle.
mExtras = (extras == null) ? null : new Bundle(extras);
|
public void | setLatitude(double latitude)Sets the latitude of this fix.
mLatitude = latitude;
|
public void | setLongitude(double longitude)Sets the longitude of this fix.
mLongitude = longitude;
|
public void | setProvider(java.lang.String provider)Sets the name of the provider that generated this fix.
mProvider = provider;
|
public void | setSpeed(float speed)Sets the speed of this fix, in meters/second. Following this
call, hasSpeed() will return true.
mSpeed = speed;
mHasSpeed = true;
|
public void | setTime(long time)Sets the UTC time of this fix, in milliseconds since January 1,
1970.
mTime = time;
|
public java.lang.String | toString()
return "Location[mProvider=" + mProvider +
",mTime=" + mTime +
",mLatitude=" + mLatitude +
",mLongitude=" + mLongitude +
",mHasAltitude=" + mHasAltitude +
",mAltitude=" + mAltitude +
",mHasSpeed=" + mHasSpeed +
",mSpeed=" + mSpeed +
",mHasBearing=" + mHasBearing +
",mBearing=" + mBearing +
",mHasAccuracy=" + mHasAccuracy +
",mAccuracy=" + mAccuracy +
",mExtras=" + mExtras + "]";
|
public void | writeToParcel(android.os.Parcel parcel, int flags)
parcel.writeString(mProvider);
parcel.writeLong(mTime);
parcel.writeDouble(mLatitude);
parcel.writeDouble(mLongitude);
parcel.writeInt(mHasAltitude ? 1 : 0);
parcel.writeDouble(mAltitude);
parcel.writeInt(mHasSpeed ? 1 : 0);
parcel.writeFloat(mSpeed);
parcel.writeInt(mHasBearing ? 1 : 0);
parcel.writeFloat(mBearing);
parcel.writeInt(mHasAccuracy ? 1 : 0);
parcel.writeFloat(mAccuracy);
parcel.writeBundle(mExtras);
|