GPSユーザーに現在の位置に最も近いフーターズレストランを知らせる緯度と経度の座標を比較する必要があります

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.

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

    }   

} 

ここで私が助けたいのは、配列を解析し、ユーザーの場所と6つのレストランの場所のそれぞれの違いを比較する方法を見つけることであり、どちらの違いが最も小さいか(ユーザーに最も近いレストランの場所)はレストランですそれが選択され、誰の情報が表示されます。

そうは言っても、配列を解析し、緯度/経度の差を6つすべて取得した後、最小の差を使用するように指示するにはどうすればよいですか?

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

+1おそらく史上最高のstackoverflowの質問。

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

コメント 2

だから...多くの...コメント

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

コメント 3

GPSポイントを配列に入れてから、静的intを使用して配列にインデックスを付けることを検討しましたか。大量のコードを繰り返すよりも、配列をループする方が簡単です。ただし、各ストアに結び付けられたメソッドを作成して、コードをきれいにすることができると思います。:P

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

コメント 4

あなたはあなたの質問をより具体的にすべきです。正確には何の問題がありますか?2つのポイント間の距離を取得する方法を知る必要がある場合-ここに多くのコードを配置してタスクの詳細について多くを話す必要はないので、単純で正確な短い質問で十分です。ところで、この情報は検索で簡単に見つけることができます。

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

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

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

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

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

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