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

質問 written by Sam Peterson @2013-03-09 03:35:14Z

: 6 : 2 : 5

ウィスコンシン州の6つのフーターズレストランの場所すべてについて、正確な緯度/経度(10進数表記)座標を見つける準備作業を行いました。 これらの座標値を別のクラスの配列に格納するつもりです。 また、ユーザーの現在のGPS位置を取得するために、コードに既に位置リスナーがあります。 以下の私のコードを参照してください:

package sam.finalmap.hooters;

// Camera is the view of the map.

// the google map

import android.content.Context;

import; // 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;  // the Map class.
import; // for creating lattitudes and longitutes in memory.
import; // used to draw from one location to the other

 * 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;

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


        // recommended method by google to make the map object.

        // Sets the map type to be "normal"

        tv = (TextView) findViewById(;

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                500, 1, this);
        Location location = locationManager
        // 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
                    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.


     * 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(
            // 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


    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

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





     * 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]);
コメント 1


written by ケビンバウアーソックス @2013-03-08 22:38:29Z

コメント 2


written by デイブニュートン @2013-03-08 22:41:20Z

コメント 3


written by ジャスティンダニエルソン @2013-03-08 22:44:03Z

コメント 4


written by プリゾフ @2013-03-08 22:54:07Z

回答 1 written by abbath @2013-03-08 22:36:44Z

Location.distanceBetween()を試してください: 参照

回答 2 written by JustinDanielson @2013-03-08 22:39:33Z

GPS DirectionsをGoogle Directions APIに入力し、移動距離を使用して最寄りの店舗を特定できます。

Android Locationクラスには、2つのGPSポイント間の直線距離を取得するために使用できるdistanceToまたはdistanceBetweenメソッドがあります。 これを使用して2〜3個の候補に絞り込んでから、directions APIを使用して最終的な回答を取得できます。