19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.location; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.DecimalFormat; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.StringTokenizer; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class representing a geographic location sensed at a particular 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time (a "fix"). A location consists of a latitude and longitude, a 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * UTC timestamp. and optionally information on altitude, speed, and 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bearing. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> Information specific to a particular provider or class of 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * providers may be communicated to the application using getExtras, 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which returns a Bundle of key/value pairs. Each provider will only 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide those entries for which information is available. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Location implements Parcelable { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "[+-]DDD.DDDDD where D indicates degrees. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_DEGREES = 0; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "[+-]DDD:MM.MMMMM" where D indicates degrees and 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * M indicates minutes of arc (1 minute = 1/60th of a degree). 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_MINUTES = 1; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constant used to specify formatting of a latitude or longitude 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the form "DDD:MM:SS.SSSSS" where D indicates degrees, M 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicates minutes of arc, and S indicates seconds of arc (1 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * minute = 1/60th of a degree, 1 second = 1/3600th of a degree). 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FORMAT_SECONDS = 2; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mProvider; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private long mTime = 0; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLatitude = 0.0; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLongitude = 0.0; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasAltitude = false; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mAltitude = 0.0f; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasSpeed = false; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mSpeed = 0.0f; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasBearing = false; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mBearing = 0.0f; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasAccuracy = false; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mAccuracy = 0.0f; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mExtras = null; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache the inputs and outputs of computeDistanceAndBearing 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so calls to distanceTo() and bearingTo() can share work 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLat1 = 0.0; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLon1 = 0.0; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLat2 = 0.0; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private double mLon2 = 0.0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mDistance = 0.0f; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mInitialBearing = 0.0f; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Scratchpad 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float[] mResults = new float[2]; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(Printer pw, String prefix) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mProvider=" + mProvider + " mTime=" + mTime); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mLatitude=" + mLatitude + " mLongitude=" + mLongitude); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mHasAltitude=" + mHasAltitude + " mAltitude=" + mAltitude); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mHasSpeed=" + mHasSpeed + " mSpeed=" + mSpeed); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mHasBearing=" + mHasBearing + " mBearing=" + mBearing); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mHasAccuracy=" + mHasAccuracy + " mAccuracy=" + mAccuracy); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "mExtras=" + mExtras); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a new Location. By default, time, latitude, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * longitude, and numSatellites are 0; hasAltitude, hasSpeed, and 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hasBearing are false; and there is no extra information. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param provider the name of the location provider that generated this 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location fix. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location(String provider) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = provider; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a new Location object that is a copy of the given 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location(Location l) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set(l); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the contents of the location to the values from the given location. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Location l) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = l.mProvider; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = l.mTime; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = l.mLatitude; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = l.mLongitude; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = l.mHasAltitude; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = l.mAltitude; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = l.mHasSpeed; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = l.mSpeed; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = l.mHasBearing; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = l.mBearing; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = l.mHasAccuracy; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = l.mAccuracy; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the contents of the location. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reset() { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = null; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = 0; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = 0; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = 0; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = false; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = 0; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = false; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = 0; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = false; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = 0; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = false; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = 0; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = null; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a coordinate to a String representation. The outputType 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may be one of FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The coordinate must be a valid double between -180.0 and 180.0. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if coordinate is less than 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * -180.0, greater than 180.0, or is not a number. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if outputType is not one of 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String convert(double coordinate, int outputType) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate < -180.0 || coordinate > 180.0 || 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Double.isNaN(coordinate)) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outputType != FORMAT_DEGREES) && 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (outputType != FORMAT_MINUTES) && 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (outputType != FORMAT_SECONDS)) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("outputType=" + outputType); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Handle negative values 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate < 0) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('-'); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate = -coordinate; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DecimalFormat df = new DecimalFormat("###.#####"); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputType == FORMAT_MINUTES || outputType == FORMAT_SECONDS) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int degrees = (int) Math.floor(coordinate); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(degrees); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(':'); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate -= degrees; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate *= 60.0; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputType == FORMAT_SECONDS) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minutes = (int) Math.floor(coordinate); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(minutes); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(':'); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate -= minutes; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate *= 60.0; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(df.format(coordinate)); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a String in one of the formats described by 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FORMAT_DEGREES, FORMAT_MINUTES, or FORMAT_SECONDS into a 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * double. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NullPointerException if coordinate is null 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if the coordinate is not 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in one of the valid formats. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static double convert(String coordinate) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // IllegalArgumentException if bad syntax 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate == null) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException("coordinate"); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean negative = false; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (coordinate.charAt(0) == '-') { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate = coordinate.substring(1); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project negative = true; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringTokenizer st = new StringTokenizer(coordinate, ":"); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tokens = st.countTokens(); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens < 1) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String degrees = st.nextToken(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double val; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tokens == 1) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = Double.parseDouble(degrees); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return negative ? -val : val; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String minutes = st.nextToken(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int deg = Integer.parseInt(degrees); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double min; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sec = 0.0; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (st.hasMoreTokens()) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = Integer.parseInt(minutes); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String seconds = st.nextToken(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sec = Double.parseDouble(seconds); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project min = Double.parseDouble(minutes); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isNegative180 = negative && (deg == 180) && 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (min == 0) && (sec == 0); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // deg must be in [0, 179] except for the case of -180 degrees 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((deg < 0.0) || (deg > 179 && !isNegative180)) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (min < 0 || min > 59) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sec < 0 || sec > 59) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project coordinate); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = deg*3600.0 + min*60.0 + sec; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val /= 3600.0; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return negative ? -val : val; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NumberFormatException nfe) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("coordinate=" + coordinate); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void computeDistanceAndBearing(double lat1, double lon1, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lat2, double lon2, float[] results) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // using the "Inverse Formula" (section 4) 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int MAXITERS = 20; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert lat/long to radians 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lat1 *= Math.PI / 180.0; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lat2 *= Math.PI / 180.0; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lon1 *= Math.PI / 180.0; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lon2 *= Math.PI / 180.0; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double a = 6378137.0; // WGS84 major axis 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double b = 6356752.3142; // WGS84 semi-major axis 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double f = (a - b) / a; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double aSqMinusBSqOverBSq = (a * a - b * b) / (b * b); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double L = lon2 - lon1; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double A = 0.0; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double U1 = Math.atan((1.0 - f) * Math.tan(lat1)); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double U2 = Math.atan((1.0 - f) * Math.tan(lat2)); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU1 = Math.cos(U1); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU2 = Math.cos(U2); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU1 = Math.sin(U1); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU2 = Math.sin(U2); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosU1cosU2 = cosU1 * cosU2; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinU1sinU2 = sinU1 * sinU2; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sigma = 0.0; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double deltaSigma = 0.0; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosSqAlpha = 0.0; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cos2SM = 0.0; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosSigma = 0.0; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinSigma = 0.0; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cosLambda = 0.0; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinLambda = 0.0; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lambda = L; // initial guess 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iter = 0; iter < MAXITERS; iter++) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double lambdaOrig = lambda; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosLambda = Math.cos(lambda); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sinLambda = Math.sin(lambda); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double t1 = cosU2 * sinLambda; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double t2 = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinSqSigma = t1 * t1 + t2 * t2; // (14) 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sinSigma = Math.sqrt(sinSqSigma); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSigma = sinU1sinU2 + cosU1cosU2 * cosLambda; // (15) 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sigma = Math.atan2(sinSigma, cosSigma); // (16) 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double sinAlpha = (sinSigma == 0) ? 0.0 : 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosU1cosU2 * sinLambda / sinSigma; // (17) 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSqAlpha = 1.0 - sinAlpha * sinAlpha; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cos2SM = (cosSqAlpha == 0) ? 0.0 : 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSigma - 2.0 * sinU1sinU2 / cosSqAlpha; // (18) 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double uSquared = cosSqAlpha * aSqMinusBSqOverBSq; // defn 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project A = 1 + (uSquared / 16384.0) * // (3) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (4096.0 + uSquared * 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-768 + uSquared * (320.0 - 175.0 * uSquared))); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double B = (uSquared / 1024.0) * // (4) 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (256.0 + uSquared * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-128.0 + uSquared * (74.0 - 47.0 * uSquared))); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double C = (f / 16.0) * 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosSqAlpha * 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (4.0 + f * (4.0 - 3.0 * cosSqAlpha)); // (10) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double cos2SMSq = cos2SM * cos2SM; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project deltaSigma = B * sinSigma * // (6) 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cos2SM + (B / 4.0) * 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cosSigma * (-1.0 + 2.0 * cos2SMSq) - 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (B / 6.0) * cos2SM * 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-3.0 + 4.0 * sinSigma * sinSigma) * 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-3.0 + 4.0 * cos2SMSq))); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lambda = L + 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (1.0 - C) * f * sinAlpha * 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (sigma + C * sinSigma * 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (cos2SM + C * cosSigma * 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (-1.0 + 2.0 * cos2SM * cos2SM))); // (11) 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double delta = (lambda - lambdaOrig) / lambda; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Math.abs(delta) < 1.0e-12) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float distance = (float) (b * A * (sigma - deltaSigma)); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[0] = distance; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.length > 1) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float initialBearing = (float) Math.atan2(cosU2 * sinLambda, 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cosU1 * sinU2 - sinU1 * cosU2 * cosLambda); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initialBearing *= 180.0 / Math.PI; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[1] = initialBearing; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results.length > 2) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float finalBearing = (float) Math.atan2(cosU1 * sinLambda, 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalBearing *= 180.0 / Math.PI; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project results[2] = finalBearing; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Computes the approximate distance in meters between two 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * locations, and optionally the initial and final bearings of the 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shortest path between them. Distance and bearing are defined using the 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WGS84 ellipsoid. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> The computed distance is stored in results[0]. If results has length 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2 or greater, the initial bearing is stored in results[1]. If results has 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * length 3 or greater, the final bearing is stored in results[2]. 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startLatitude the starting latitude 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param startLongitude the starting longitude 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endLatitude the ending latitude 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param endLongitude the ending longitude 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param results an array of floats to hold the results 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException if results is null or has length < 1 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void distanceBetween(double startLatitude, double startLongitude, 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double endLatitude, double endLongitude, float[] results) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (results == null || results.length < 1) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("results is null or has length < 1"); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(startLatitude, startLongitude, 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project endLatitude, endLongitude, results); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the approximate distance in meters between this 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location and the given location. Distance is defined using 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the WGS84 ellipsoid. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest the destination location 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the approximate distance in meters 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float distanceTo(Location dest) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if we already have the result 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mResults) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLatitude != mLat1 || mLongitude != mLon1 || 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude != mLat2 || dest.mLongitude != mLon2) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(mLatitude, mLongitude, 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude, dest.mLongitude, mResults); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat1 = mLatitude; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon1 = mLongitude; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat2 = dest.mLatitude; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon2 = dest.mLongitude; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDistance = mResults[0]; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialBearing = mResults[1]; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDistance; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the approximate initial bearing in degrees East of true 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * North when traveling along the shortest path between this 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location and the given location. The shortest path is defined 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the WGS84 ellipsoid. Locations that are (nearly) 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * antipodal may produce meaningless results. 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dest the destination location 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the initial bearing in degrees 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float bearingTo(Location dest) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mResults) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // See if we already have the result 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLatitude != mLat1 || mLongitude != mLon1 || 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude != mLat2 || dest.mLongitude != mLon2) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project computeDistanceAndBearing(mLatitude, mLongitude, 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.mLatitude, dest.mLongitude, mResults); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat1 = mLatitude; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon1 = mLongitude; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLat2 = dest.mLatitude; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLon2 = dest.mLongitude; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDistance = mResults[0]; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialBearing = mResults[1]; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInitialBearing; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the name of the provider that generated this fix, 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or null if it is not associated with a provider. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getProvider() { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProvider; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the name of the provider that generated this fix. 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProvider(String provider) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProvider = provider; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the UTC time of this fix, in milliseconds since January 1, 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1970. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTime() { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTime; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the UTC time of this fix, in milliseconds since January 1, 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1970. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTime(long time) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTime = time; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the latitude of this fix. 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getLatitude() { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLatitude; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the latitude of this fix. 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLatitude(double latitude) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLatitude = latitude; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the longitude of this fix. 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getLongitude() { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLongitude; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the longitude of this fix. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLongitude(double longitude) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLongitude = longitude; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if this fix contains altitude information, false 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAltitude() { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasAltitude; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the altitude of this fix. If {@link #hasAltitude} is false, 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0.0f is returned. 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public double getAltitude() { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAltitude; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the altitude of this fix. Following this call, 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hasAltitude() will return true. 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAltitude(double altitude) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = altitude; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = true; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the altitude of this fix. Following this call, 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * hasAltitude() will return false. 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAltitude() { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAltitude = 0.0f; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAltitude = false; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if this fix contains speed information, false 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. The default implementation returns false. 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasSpeed() { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasSpeed; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the speed of the device over ground in meters/second. 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If hasSpeed() is false, 0.0f is returned. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getSpeed() { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSpeed; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the speed of this fix, in meters/second. Following this 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * call, hasSpeed() will return true. 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSpeed(float speed) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = speed; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = true; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the speed of this fix. Following this call, hasSpeed() 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will return false. 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeSpeed() { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSpeed = 0.0f; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasSpeed = false; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the provider is able to report bearing information, 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false otherwise. The default implementation returns false. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasBearing() { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasBearing; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the direction of travel in degrees East of true 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * North. If hasBearing() is false, 0.0 is returned. 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getBearing() { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBearing; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the bearing of this fix. Following this call, hasBearing() 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will return true. 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBearing(float bearing) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (bearing < 0.0f) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bearing += 360.0f; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (bearing >= 360.0f) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bearing -= 360.0f; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = bearing; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = true; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the bearing of this fix. Following this call, hasBearing() 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will return false. 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeBearing() { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBearing = 0.0f; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasBearing = false; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if the provider is able to report accuracy information, 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false otherwise. The default implementation returns false. 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasAccuracy() { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHasAccuracy; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the accuracy of the fix in meters. If hasAccuracy() is false, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0.0 is returned. 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAccuracy() { 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAccuracy; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the accuracy of this fix. Following this call, hasAccuracy() 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will return true. 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAccuracy(float accuracy) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = accuracy; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = true; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clears the accuracy of this fix. Following this call, hasAccuracy() 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will return false. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAccuracy() { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAccuracy = 0.0f; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasAccuracy = false; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns additional provider-specific information about the 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location fix as a Bundle. The keys and values are determined 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the provider. If no additional information is available, 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null is returned. 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> A number of common key/value pairs are listed 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * below. Providers that use any of the keys on this list must 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * provide the corresponding value as described below. 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> satellites - the number of satellites used to derive the fix 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle getExtras() { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mExtras; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the extra information associated with this fix to the 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given Bundle. 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setExtras(Bundle extras) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mExtras = (extras == null) ? null : new Bundle(extras); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public String toString() { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Location[mProvider=" + mProvider + 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mTime=" + mTime + 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mLatitude=" + mLatitude + 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mLongitude=" + mLongitude + 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mHasAltitude=" + mHasAltitude + 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mAltitude=" + mAltitude + 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mHasSpeed=" + mHasSpeed + 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mSpeed=" + mSpeed + 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mHasBearing=" + mHasBearing + 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mBearing=" + mBearing + 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mHasAccuracy=" + mHasAccuracy + 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mAccuracy=" + mAccuracy + 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ",mExtras=" + mExtras + "]"; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<Location> CREATOR = 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<Location>() { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location createFromParcel(Parcel in) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String provider = in.readString(); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Location l = new Location(provider); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mTime = in.readLong(); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mLatitude = in.readDouble(); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mLongitude = in.readDouble(); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasAltitude = in.readInt() != 0; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mAltitude = in.readDouble(); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasSpeed = in.readInt() != 0; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mSpeed = in.readFloat(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasBearing = in.readInt() != 0; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mBearing = in.readFloat(); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mHasAccuracy = in.readInt() != 0; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mAccuracy = in.readFloat(); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.mExtras = in.readBundle(); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Location[] newArray(int size) { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Location[size]; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel parcel, int flags) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeString(mProvider); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeLong(mTime); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mLatitude); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mLongitude); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasAltitude ? 1 : 0); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeDouble(mAltitude); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasSpeed ? 1 : 0); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mSpeed); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasBearing ? 1 : 0); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mBearing); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeInt(mHasAccuracy ? 1 : 0); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeFloat(mAccuracy); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parcel.writeBundle(mExtras); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 742