6

我已经完成了为威斯康星州的所有 6 家 Hooters 餐厅位置找到准确的纬度/经度(以十进制数字表示)坐标的准备工作。我打算将这些坐标值存储在一个单独类的数组中。我的代码中也已经有一个位置监听器来获取用户当前的 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 类有一个 distanceTo 或 distanceBetween 方法,可用于获取 2 个 GPS 点之间的直线距离。您可以使用它来将其缩小到 2-3 个候选人,然后使用方向 api 来获得最终答案。

于 2013-03-08T22:39:33.347 回答