Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I need to compare latitude and longitude coordinates that will tell a GPS user which Hooters restaurant is closest to his current position

Tags:

java

android

I've done the prep work of finding accurate latitude/longitude (in decimal number notation) coordinates for all 6 Hooters restaurant locations in Wisconsin. I intend to store those coordinate values in an array of a separate class. I also already have a Location Listener in my code to get the user's current GPS location. See my code below:

package sam.finalmap.hooters;


// Camera is the view of the map.

import com.google.android.gms.maps.CameraUpdateFactory;
// the google map
import com.google.android.gms.maps.GoogleMap;


import android.app.Activity;
import android.content.Context;

import android.graphics.Color; // for drawing a line.

import android.location.Location; // for detecting location changes with the GPS.
import android.location.LocationListener; // to listen for location changes
import android.location.LocationManager;
import android.os.Bundle;

import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.MapFragment;  // the Map class.
import com.google.android.gms.maps.model.LatLng; // for creating lattitudes and longitutes in memory.
import com.google.android.gms.maps.model.Polyline; // used to draw from one location to the other
import com.google.android.gms.maps.model.PolylineOptions;

/**
 * Draws a map, uses GPS to get the current location, the draws a line from Eau CLaire (see constants)
 * to the new position, which will be the closest Hooters restaurant to the user's current location. 
 * This is the AdapterView.
 * 
 * @author daviddalsveen
 *
 */
public class GMapsLocationPath extends Activity implements LocationListener {
    /** Called when the activity is first created. */

    private GoogleMap mMap;

    // constants to hard code all 6 of Wisconsin's Hooters restaurant points on the map:

    private static final float Appleton_LAT = 44.2655012f;

    private static final float Appleton_LNG = -88.4768057f;


    private static final float Brookfield_LAT = 43.03645f;

    private static final float Brookfield_LNG = -88.124937f;


    private static final float EastMadison_LAT = 43.132432f;

    private static final float EastMadison_LNG = -89.3016256f;


    private static final float GreenBay_LAT = 44.477903f;

    private static final float GreenBay_LNG = -88.067014f;


    private static final float Janesville_LAT = 42.7215666f;

    private static final float Janesville_LNG = -88.9889661f;


    private static final float LaCrosse_LAT = 43.8109318f;

    private static final float LaCrosse_LNG = -91.2536215f;



    private LocationManager locationManager;

    private TextView tv;   // a Textview for displaying lattitude and longitude.

    private float curLat = 44.88f; // current position -- assigned constants for
                                    // testing...
    private float curLng = -91.47f;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // called when the activity is first started.

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // recommended method by google to make the map object.
        setUpMapIfNeeded();

        // Sets the map type to be "normal"
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        tv = (TextView) findViewById(R.id.label1);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                500, 1, this);
        Location location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        // 500 is the minimum time interval to update, in milliseconds
        // 1 is the distance in meters in which to sense an update.
        // 'this' is the pending intent.

        // center latitude and longitude for EC
        float lat = Appleton_LAT;
        float lng = Appleton_LNG;

        // debug example...
        Toast.makeText(this, "" + (int) (lat * 1E6), Toast.LENGTH_LONG).show();

        if (location == null) { // no last known location
            locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,
                    this, null);
            // Create a new Lattitude Longitude Object, passing it the
            // coordinates.
            LatLng latLng = new LatLng(lat, lng);

            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10.0f));
            // re-draw

        } else {
            // explicitly call and update view with last known location or the
            // one set above.
            onLocationChanged(location);
        }

    }

    /**
     * Checks to see that the map exists, if not, creates one.
     */
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the
        // map.
        if (mMap == null) {
            mMap = ((MapFragment) getFragmentManager().findFragmentById(
                    R.id.map)).getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                // The Map is verified. It is now safe to manipulate the map.

            }// else?
        }
    }

    // Java Interface RULE NOTE: that we must implement every method of
    // interface LocationListener,
    // whether we use the method or not.
    /**
     * Use the GPS to get the current location of the user
     * 
     */
    public void onLocationChanged(final Location loc) {

        String lat = String.valueOf(loc.getLatitude());
        String lon = String.valueOf(loc.getLongitude());
        Log.e("GPS", "location changed: lat=" + lat + ", lon=" + lon);
        tv.setText("lat=" + lat + ", lon=" + lon);

        curLat = Float.parseFloat(lat); // update the current lattitude and longitude.
        curLng = Float.parseFloat(lon);

        // Create a new Lattitude Longitude Object, passing it the coordinates.
        LatLng latLng = new LatLng(curLat, curLng);

        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10.0f));
        // re-draw
        draw();

    }

    public void onProviderDisabled(String loc) {
        Log.e("GPS", "provider disabled " + loc);
    }

    public void onProviderEnabled(String loc) {
        Log.e("GPS", "provider enabled " + loc);
    }

    /**
     * loc: name of location provider status: status of location provider
     * (temporarily unavailable, etc) extras: optional bundle with additional
     * status information
     */
    public void onStatusChanged(String loc, int status, Bundle extras) {
        Log.e("GPS", "status changed to " + loc + " [" + status + "]");
    }

    /**
     * Draw a line from 
     */
    public void draw() {

        float lat = 44.88f;
        float lng = -91.48f;

        // Instantiates a new Polyline object and adds points to define a
        // endpoints of a line
        PolylineOptions rectOptions = new PolylineOptions().add(
                new LatLng(curLat, curLng))

                .add(new LatLng(lat, lng)); // Closes the polyline.

        // Set the rectangle's color to red
        rectOptions.color(Color.RED);

        // Get back the mutable Polyline
        Polyline polyline = mMap.addPolyline(rectOptions);      

    }   

} 

What I want help with here is finding a way to parse through the array, and compare the difference of the user's location with each of the 6 restaurant locations, and whichever difference is smallest (whichever restaurant location is closest to the user) is the restaurant that will be selected and who's information will displayed.

That said, how do I tell it to use the smallest difference after it finishes parsing through the array and getting all 6 of the latitude/longitude differences?

/**
     * My teacher suggested subtracting the current latitudes and longitudes from the restaurant latitudes and 
     * longitudes to see if they fall within a certain range (lets just say less than 10). Then, using the resulting 
     * differences as absolute values in an if statement (if absolute value < 10 for both are true), that restaurant
     * would be the one selected:  
     */

    //float[] H_Latitude = {44.2655012f, 43.03645f, 43.132432f, 44.477903f, 42.7215666f, 43.8109318f};  

    //float[] H_Longitude = {-88.4768057f, -88.124937f, -89.3016256f, -88.067014f, -88.9889661f, -91.2536215f};

    float LATdifference = curLat - H_Latitude; 

    float LNGdifference = curLng - H_Longitude;//I'm pretty sure I can't use "H_Longitude and H_Latitude", because
    //they're merely the name of the array. So how do I access the elements inside of them? How do I successfully
    //address them with a reference variable that I can use to dynamically subtract from curLat and curLng and get
    //what I need to replace the "i" in the for loops:
                                            for (float LATdifference = 0; i < 4; i++) {
                                                System.out.println (count[i]);
                                                  }
like image 324
Sam Peterson Avatar asked Mar 08 '13 22:03

Sam Peterson


People also ask

Which coordinate system is used with GPS system?

GPS Reference System WGS 84 The operational GPS reference system is known as WGS 84 (“World Geodetic System 1984”).

What is the best GPS for coordinates?

Google Maps For Android users, Google Maps is the simplest way to either enter latitude and longitude coordinates or to find out your current coordinates.

Is longitude and latitude the same as GPS coordinates?

GPS coordinates are usually expressed as the combination of latitude and longitude. Lines of latitude coordinates measure degrees of distance north and south from the equator, which is 0 degrees. The north pole and south pole are at 90 degrees in either direction.


2 Answers

Try Location.distanceBetween(): reference

like image 82
abbath Avatar answered Oct 17 '22 14:10

abbath


You could feed the GPS coordinates into the Google Directions API and use the travel distance to determine the closest store.

The Android Location class has a distanceTo or distanceBetween method that you could use to get a straight line distance between 2 GPS points. You could use this to narrow it down to 2-3 candidates and then use the directions api to get a final answer.

like image 23
JustinDanielson Avatar answered Oct 17 '22 12:10

JustinDanielson