How to add the coding for displaying the address when a particular set of latitude and longitude is selected into the following codes?
package net.learn2develop.PopularAttractions;
import java.io.IOException; import java.util.List; import java.util.Locale;
import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView;
import android.location.Address; import android.location.Geocoder; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View;
import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.Toast; import android.widget.AdapterView.OnItemSelectedListener;
public class PopularAttractions extends MapActivity {
private String[ ][ ] locations = {
{"Chinatown Heritage Center","1.2836,103.84425"},
{"Escape Theme Park","1.38104,103.936928"},
{"G-Max Reverse Bungy","1.2906,103.845322"},
{"Jurong BirdPark","1.32005,103.707153"},
{"NEWater Visitor Center","1.33105,103.955311"},
{"Red Dot Design Museum","1.277762,103.846225"},
{"Singapore Botanic Garden","1.31471,103.815689"},
{"Singapore Science Center","1.3249,103.740578"},
{"Singapore Zoological Garden","1.40502,103.793449"},
{"Snow City","1.32823,103.74263"},
{"Sungei Buloh Wetland Reserver","1.445144,103.729595"},
{"Super Ice World","1.300422,103.875348"},
};
Spinner spinnerView;
MapView mapView;
MapController mc;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
spinnerView = (Spinner) this.findViewById(R.id.spinner1);
mapView = (MapView) findViewById(R.id.mapview1);
mc = mapView.getController();
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_dropdown_item);
for(int i = 0; i < locations.length; i++)
adapter.add(locations[i][0]);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerView.setAdapter(adapter);
spinnerView.setOnItemSelectedListener(selectListener);
gotoSelected();
}
private OnItemSelectedListener selectListener = new OnItemSelectedListener() {
public void onItemSelected(
AdapterView<?>parent, View v, int position, long id)
{
gotoSelected();
}
public void onNothingSelected(AdapterView<?> arg0) {}
};
public void gotoSelected()
{
int index = spinnerView.getSelectedItemPosition();
String[] coordinates = locations[index][1].split(",");
double lat = Double.parseDouble(coordinates[0]);
double lng = Double.parseDouble(coordinates[1]);
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
Address ad = addresses.get(0);
String buff = new String();
for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) {
buff += ad.getAddressLine(i);
Toast.makeText(getBaseContext(), buff, Toast.LENGTH_SHORT).show();
GeoPoint location = new GeoPoint (
(int)(lat * 1E6),
(int)(lng * 1E6));开发者_如何转开发
mc.animateTo(location);
mc.setZoom(16);
mapView.setStreetView(true);
}
for (Address a : addresses) {
Log.v("TAG", a.toString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
MapController mc = mapView.getController();
switch (keyCode)
{
case KeyEvent.KEYCODE_2:
mc.zoomIn();
break;
case KeyEvent.KEYCODE_1:
mc.zoomOut();
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
You could try Geocoder: https://developer.android.com/reference/android/location/Geocoder.html
for(int i = 0; i < locations.length; i++) {
List<Address> list;
Geocoder geo = new Geocoder(this);
try {
String[] latlong = locations[i][1].split(",");
list = geo.getFromLocation(Double.valueOf(latlong[0]), Double.valueOf(latlong[1]), 1); // the 1st result should be the best one
Address ad = list.get(0); // Position 0 is the most specific to the coordinates.
String buff = new String();
for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) {
buff += ad.getAddressLine(i); // for a good addres(with street name u should get getMaxAddressLineIndex() = 2
// HERE you would want to do something with buff to show or to store it
}
for (Address a : list) {
Log.v("TAG", a.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
Usually the first one in the list should be the one you are interested. For each Address you take the address with getAddressLine(int pos), normally you will get in position 0 the name of the street, in position 1 the zipcode + city and the next one the country. However, I haven't made enough tests to be sure of this.
To get the address you could use something like this:
Address ad = list.get(0); // Position 0 is the most specific to the coordinates.
String buff = new String();
for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) {
buff += ad.getAddressLine(i); // for a good addres(with street name u should get getMaxAddressLineIndex() = 2
}
精彩评论