6

ウィスコンシン州の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]);
                                                  }
4

2 に答える 2

4

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

于 2013-03-08T22:36:44.057 に答える
1

GPS 座標を Google Directions API にフィードし、移動距離を使用して最寄りの店舗を特定できます。

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

于 2013-03-08T22:39:33.347 に答える