i am try to get latitude & longitude from address , problem is that .. when i give only city name than it give me correct latitude & longitude and when i give complete address (like state , city name , street No.) than it do not give me correct latitude & longitude ...
thanks for your cooperative response ...
my code is ..
//String addressStr = "faisalabad";/// this give me correct address
String addressStr = "Sainta Augustine,FL,4405 Avenue A";
Geocoder geoCoder = new Geocoder(MapClass.this, Locale.getDefault());
try {
List<Address> addresses =
geoCoder.getFromLocationName(addressStr, 1);
if (addresses.size() > 0) {
latitude = addresses.get(0).getLatitude(); longtitude =
addresses.get(0).getLongitude(); }
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace(); }
pos = new LatLng(latitude, longtitude);
googleMap.addMarker(new MarkerOptions().icon(
BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_RED))
.position(pos));
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(pos, 15));
googleMap.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
i don it ... :)
only sequence is incorrect ...
first give street address than city name and than state ... it give me correct latitude and longitude from address .. :)
and change
Geocoder geoCoder = new Geocoder(MapClass.this, Locale.getDefault());
to
Geocoder geoCoder = new Geocoder(MapClass.this);
thanks, all of you for your time ...
This is my solution :
private void createMarkerWithLocation() {
/* Use the LocationManager class to obtain GPS locations */
LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 40, this);
Location location = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
/*check both providers even for lastKnownLocation*/
if (location == null)
location = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if(location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
LatLng currentLatLng = new LatLng(latitude, longitude);
if(isConnected(this)) {
Geocoder gCoder = new Geocoder(ChoiceDestinationActivity.this);
List<Address> addresses = gCoder.getFromLocation(latitude, longitude, 1);
String address = addresses.get(0).getAddressLine(0);
String city = addresses.get(0).getAddressLine(1);
String country = addresses.get(0).getAddressLine(2);
Toast.makeText(this, country + ", " + city + ", " + address, Toast.LENGTH_SHORT).show();
marker = map.addMarker(new MarkerOptions()
.position(currentLatLng)
.title(city)
.snippet(address)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker)));
}
}
}
public static boolean isConnected(Context context) {
NetworkInfo ni = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
return (ni!=null && ni.isAvailable() && ni.isConnected());
}
I use it to add a marker on google map. It allows you to retrieve all the information regarding the location of the user.
I hope you have helped!
Related
I am looking advice on options i have to save data from markers and searches from placepicker on google maps.
Ive looked into shared preferences and tried the code out but not working.
I need to take address data from a place picker search and save it so that a history activity can generate a list.
is there any option that place picker saves searches?
im using android studio
This is an example of my place picker
Place place = PlacePicker.getPlace(data, this);
LatLng placeLatLng = place.getLatLng(); // gett lat lng from place
double placeLat = placeLatLng.latitude;
double placeLong = placeLatLng.longitude;
final CharSequence name = place.getName();
final CharSequence address = place.getAddress();
Marker destination = mMap.addMarker(new MarkerOptions().position(new LatLng(placeLat, placeLong)).title("This is your destination"));
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//Current Location
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, true);
Location myLocation = locationManager.getLastKnownLocation(provider);
//Current Location LatLong
final double currentLat = myLocation.getLatitude();
final double currentLng = myLocation.getLongitude();
List<CharSequence> listItems = new ArrayList<>();
//Directions From Current Location To Destination
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?" + "saddr=" + currentLat + "," + currentLng + "&daddr=" + placeLat + "," + placeLong));
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
listItems.add(name);
listItems.add(address);
startActivity(intent);
}
}
public void saveInfo(View v){
SharedPreferences sharedPreferences = getSharedPreferences("Place Deatils", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
}
get location address using Geocoder and store the information in SharedPreferences
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());
try {
addresses = geocoder.getFromLocation(latt,lang, 1); // Here 1 represent max location result to returned, by documents it recommended 1 to 5
String address = addresses.get(0).getAddressLine(0); // If any additional address line present than only, check with max available address lines by getMaxAddressLineIndex()
String area = addresses.get(0).getSubLocality();
String dist= addresses.get(0).getSubAdminArea();
String city = addresses.get(0).getLocality();
mapMarker.setTitle(area+","+dist+","+city);
} catch (IOException e) {
e.printStackTrace();
}
check this SharedPreferences
I'm using a Geocoder to locate my location with address, postal code and country values included.
But getFromLocation(latitude,longitude,number) returns null, even though i use known location attributes ( Latitude: 40,645081 Longitude: 22,988892 ).
I'm testing my app on an AVD (API Level 7), using Eclipse.
Thanks in advance.
Here is a snippet of where the getFromLocation function is used.
private void updateWithNewLocation(Location location){
String latLongString;
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);
String addressString = "No address found";
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
//double latitude = 73.147536;
//double longitude = 0.510638;
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = gc.getFromLocation(lat, lng, 1);
Log.v("TRY_BODY", "All addresses are: " + addresses);
StringBuilder sb = new StringBuilder();
if (addresses.size() > 0) {
Log.v("IF_BODY", "All addresses are: " + addresses);
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++){
sb.append(address.getAddressLine(i)).append("\n");
sb.append(address.getLocality()).append("\n");
sb.append(address.getPostalCode()).append("\n");
sb.append(address.getCountryName());
}
addressString = sb.toString();
}
} catch (IOException e) {}
}
else {
latLongString = "No location found";
}
myLocationText.setText("Current Position:\n"+latLongString + "\n" + addressString);
}
Its very common, sometimes google server does not return any address, so that you should try it agian, it could be anything server busy, or somethimg else,
you can run this code in any thread with a loop, and if the address comes successfully, you can stop the loop and it will end the thread.
I have this method to show the user's latitude and longitude on a map activity:
public void animateMap(Location location){
double lat = location.getLatitude();
double lng = location.getLongitude();
Toast.makeText(MyMapActivity.this,
"Sie sind an\n" + lat + "\n" + lng, Toast.LENGTH_SHORT)
.show();
GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
mapController.animateTo(point, new Message());
mapOverlay.setPointToDraw(point);
}
How to implement the Geocoder on my method? So the Toast will display the location's address instead of the coordinates
you use
Geocoder myLocation = new Geocoder(context, Locale.ENGLISH);
List<Address> myList= myLocation.getFromLocation(lat, lng, 1);
Address add = myList.get(0);
String addressString = add.getAddressLine(0);
String country = add.getCountryName();
String city = add.getLocality();
The easiest implementation is by using the geocoder class:
Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
geocoder.getFromLocation(lat, lng, 1);
List<Address> ls=new ArrayList();
ls= geocoder.getFromLocation(lat, lng, 1);
String myLocation = ls.get(0).getSubAdminArea();
You can check all the information returned by this class and choose which one fits you most. It contains from country names to landmarks name, neighbors postalcodes... almost anything you may need.
But keep in mind, if Google has no info about this location will return a null string!
So for you exapmple should be something like that:
public void animateMap(Location location){
double lat = location.getLatitude();
double lng = location.getLongitude();
String myLocation;
try{
Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
geocoder.getFromLocation(lat, lng, 1);
List<Address> ls=new ArrayList();
ls= geocoder.getFromLocation(lat, lng, 1);
myLocation = ls.get(0).getSubAdminArea();
}catch(Exception e){
myLocation="Sorry, we have no information about this location";
}
Toast.makeText(MyMapActivity.this,
"Sie sind an\n" + myLocation , Toast.LENGTH_SHORT)
.show();
GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
mapController.animateTo(point, new Message());
mapOverlay.setPointToDraw(point);
}
Get the list of Addresses at your location from Geocoder and check for a null or empty result:
Geocoder geocoder = new Geocoder(getApplicationContext,Locale.getDefault());
List<Address> address = geocoder.getFromLocation(lat, long, 1);
String myLocation = "";
if(address != null && !address.isEmpty())
{
myLocation = address.get(0).getSubAdminArea();
}
I have tried using this code. It is not giving the location name. It is giving only latitude and longitude.
String latLongString;
if (location != null)
{
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
}
else
{
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" + latLongString);
Location by default means Co-ordinates which is latitude and longitude
and that is what you are getting. To get the actual Address you need
to geocode the coordinates.
There are 2 steps to be follow to get current location name.
1) To get current lovation that you have done,
now
2) Using the Geocoder class to convert that lat long into Address
See this answer for links and detail expression.
Try this:
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
bestProvider = locationManager.getBestProvider(criteria, true);
location = locationManager.getLastKnownLocation(bestProvider);
if (location != null) {
lat = location.getLatitude();
lng = location.getLongitude();
} else {
location = new Location("");
location.setLatitude((double) 38.0000000000);
location.setLongitude((double) -97.0000000000);
lat = location.getLatitude();
lng = location.getLongitude();
}
I tried to show my current position on map using a marker, find my code below.
but if my position is changed (position updated), the previous marker is still appear.
how to remove previous marker. please help
public void UpdateMyPosition (Location location){
String addressString = "No location found";
if (location != null) {
// Update the map location.
double latitude = location.getLatitude();
double longitude = location.getLongitude();
GeoPoint geoPoint = new GeoPoint((int) (latitude * 1E6),(int) (longitude * 1E6));
mapController.animateTo(geoPoint);
Drawable drawable = this.getResources().getDrawable(R.drawable.red);
MapsOverlay itemizedoverlay2 = new MapsOverlay(drawable, this);
List<Overlay> myOverlays = mapView.getOverlays();
OverlayItem overlayitem2 = new OverlayItem(geoPoint, "", "");
itemizedoverlay2.addOverlay(overlayitem2);
myOverlays.add(itemizedoverlay2);
mapView.postInvalidate();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = gc.getFromLocation(latitude, longitude, 1);
StringBuilder sb = new StringBuilder();
if (addresses.size() > 0) {
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
sb.append(address.getAddressLine(i));
}
addressString = sb.toString();
} catch (IOException e) {}
} else {
addressString = "No location found";
}
Toast.makeText(getBaseContext(),addressString, Toast.LENGTH_SHORT).show();
}
Put
myOverlays.clear();
before
myOverlays.add(itemizedoverlay2);
Maybe it'll be better to use bundled MyLocationOverlay, in this case drawing and updating will be performed automatically.
An other idea would be to not remove the old marker, but to change its position instead.