我已经完成了为威斯康星州的所有 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]);
}