I am working on an Android application and Google Maps in which I am searching for the particular address by using the following code. I want to get the location of the searched address if it is in 100km within my location, and if it outside that limit, it will not show me.
I am trying to get the searched location within my 100km radius.
private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{
#Override
protected List<Address> doInBackground(String... locationName) {
// Creating an instance of Geocoder class
Geocoder geocoder = new Geocoder(getBaseContext());
List<Address> addresses = null;
try {
//
//24.798406, 54.790448
//25.452403, 55.537519
// Getting a maximum of 3 Address that matches the input text
addresses = geocoder.getFromLocationName(locationName[0], 10,
24.861969, 54.857740,25.545368, 55.474347);//.getFromLocationName(locationName[0], 3);
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
#Override
protected void onPostExecute(List<Address> addresses) {
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
}
// Clears all the existing markers on the map
mMap.clear();
// Adding Markers on Google Map for each matching address
for(int i=0;i<addresses.size();i++){
Address address = (Address) addresses.get(i);
LatLng latLng;
// Creating an instance of GeoPoint, to display in Google Map
latLng = new LatLng(address.getLatitude(), address.getLongitude());
String addressText = String.format("%s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getCountryName());
markerOptions = new MarkerOptions();
markerOptions.position(latLng);
// markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.flag));
markerOptions.title(addressText);
mMap.addMarker(markerOptions);
// Locate the first location
if(i==0)
mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
You can calculate distance using this code; here, distance is in meters. You can call this function and check where the location is in the range or not.
private boolean checkForArea(int rad, LatLng fromPosition, LatLng toPosition) {
Location locationA = new Location("point A");
locationA.setLatitude(fromPosition.latitude);
locationA.setLongitude(fromPosition.longitude);
Location locationB = new Location("point B");
locationB.setLatitude(toPosition.latitude);
locationB.setLongitude(toPosition.longitude);
int distance = (int) locationA.distanceTo(locationB);
if (distance / 1000 <= rad)
return true;
else
return false;
}
Related
I am trying to display markers on map in android by using address.
This is my code:
public void onMapReady(GoogleMap googleMap){
mMap = googleMap;
Geocoder coder= new Geocoder(this);
try
{
String straddress = "155 Park Theater,Palo Alto,CA";
Double latitude = 0.0;
Double longitude = 0.0;
List<Address> addresses = coder.getFromLocationName("155 Park Theater,Palo Alto,CA",1);
Address location = addresses.get(0);
LatLng p1 = new LatLng(location.getLatitude(), location.getLongitude());
mMap.addMarker(new MarkerOptions().position(p1).title("California"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(p1));
}
catch (Exception e)
{
e.printStackTrace();
}
}
If I do not put street number, then it will display the marker.
But, it will just display marker on the street. I want marker on particular location.
I am getting following error while inputting the whole address with street number. The "address" list is empty.
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Update your code with following :
List<Address> address;
LatLng latLng = null;
try {
address = coder.getFromLocationName(strAddress,5);
if (address==null) {
return null;
}
Address location=address.get(0);
latLng = new LatLng(location.getLatitude(),location.getLongitude());
}
Ive added reverse Geocoding to my map and set the map to clickable. Everything works as it should except the address is not showing above the marker when i click the map.
my latLan is an array but thats the only way it would allow me to use the variable. i think the problem lies around this area but cant put my hand on it.
#Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); // changes view to hybrid
mMap.setMyLocationEnabled(true); // shows location on map
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // uses GPS only to get location
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
final LatLng[] latLng = {(new LatLng(currentLatitude, currentLongitude))};
mMap.animateCamera(
CameraUpdateFactory.newLatLngZoom(latLng[0], 18)); // This will zoom camera to updated lat and long without constant updates
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {// Setting a click event handler for the map
#Override
public void onMapClick(LatLng arg0) {
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); // uses GPS only to get location
double currentLatitude = location.getLatitude();
double currentLongitude = location.getLongitude();
//LatLng latLng;
// Getting the Latitude and Longitude of the touched location
latLng[0] = arg0;
// Clears the previously touched position
mMap.clear();
// Animating to the touched position
mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng[0]));
// Creating a marker
markerOptions = new MarkerOptions();
// Setting the position for the marker
markerOptions.position(latLng[0]);
// Placing a marker on the touched position
mMap.addMarker(markerOptions);
// Adding Marker on the touched location with address
new ReverseGeocodingTask(getBaseContext()).execute(latLng[0]);
}
});
//new ReverseGeocodingTask(getBaseContext()).execute(latLng);
}
private class ReverseGeocodingTask extends AsyncTask<LatLng, Void, String> {
Context mContext;
public ReverseGeocodingTask(Context context) {
super();
mContext = context;
}
#Override
protected String doInBackground(LatLng... params) {
Geocoder geocoder = new Geocoder(mContext);
double latitude = params[0].latitude;
double longitude = params[0].longitude;
List<android.location.Address> addresses = null;
String addressText = "";
try {
addresses = geocoder.getFromLocation(latitude, longitude, 1);
} catch (IOException e) {
e.printStackTrace();
}
if (addresses != null && addresses.size() > 0) {
android.location.Address address = addresses.get(0);
addressText = String.format("%s, %s, %s", address.getMaxAddressLineIndex() > 0 ?
address.getAddressLine(0) : "", address.getLocality(), address.getCountryName());
}
return addressText;
}
#Override
protected void onPostExecute(String addressText) {
markerOptions.title(addressText);
mMap.addMarker(markerOptions);
}
}
}
Tested your code and found possible cause of error.
// Placing a marker on the touched position
mMap.addMarker(markerOptions);
Upon implementing addMarker() before doing the ReverseGeocodingTask() and calling addMarker() again in the onPostExecute(). You can try adding an custom marker image large enough to make the address and the overwriting marker visible.
Customize the marker image
You can replace the default marker image with a custom marker image, often called an icon. Custom icons are always set as a BitmapDescriptor, and defined using one of four methods in the BitmapDescriptorFactory class.
Code for custom image:
private static final LatLng MELBOURNE = new LatLng(-37.813, 144.962);
private Marker melbourne = mMap.addMarker(new MarkerOptions()
.position(MELBOURNE)
.title("Melbourne")
.snippet("Population: 4,137,400")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));
You can remove the first mMap.addMarker(markerOptions); before new ReverseGeocodingTask(getBaseContext()).execute(latLng[0]); then it your app will work as it should be.
Use This Code May be work for getting Address
if (addresses != null && addresses.size() > 0) {
Address address = addresses.get(0);
String addressLine = address.getAddressLine(0) + address.getAddressLine(1) + address.getAddressLine(2) + address.getAddressLine(3);
}
Hi dears I am searching location from google map and getting it.Now I want to save it so that I can use it again by getting from database. Now tell me How I save it and How I retrieve it from database in LatLang form
here is My code for for searching location from map.
LatLng latLng;
btn_find.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// Getting user input location
String location = etLocation.getText().toString();
if(location!=null && !location.equals("")){
new GeocoderTask().execute(location);
}
}
});
private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{
#Override
protected List<Address> doInBackground(String... locationName) {
// Creating an instance of Geocoder class
Geocoder geocoder = new Geocoder(getBaseContext());
List<Address> addresses = null;
try {
// Getting a maximum of 3 Address that matches the input text
addresses = geocoder.getFromLocationName(locationName[0], 3);
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
#Override
protected void onPostExecute(List<Address> addresses) {
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
}
// Clears all the existing markers on the map
googleMap.clear();
// Adding Markers on Google Map for each matching address
for(int i=0;i<addresses.size();i++){
Address address = (Address) addresses.get(i);
// Creating an instance of GeoPoint, to display in Google Map
latLng = new LatLng(address.getLatitude(), address.getLongitude());
String addressText = String.format("%s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getCountryName());
markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title(addressText);
googleMap.addMarker(markerOptions);
// Locate the first location
if(i==0)
googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
now tell me please that how I save this location by save button ?
I think you can use SharedPrefrence for this like the following
declare SharedPreferences settings;
settings = context.getSharedPreferences("myprefs", 0); //global declaration in oncreate
inside onPost of assync task
#Override
protected void onPostExecute(List addresses) {
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
}
// Clears all the existing markers on the map
googleMap.clear();
// Adding Markers on Google Map for each matching address
for(int i=0;i<addresses.size();i++){
Address address = (Address) addresses.get(i);
// Creating an instance of GeoPoint, to display in Google Map
latLng = new LatLng(address.getLatitude(), address.getLongitude());
SharedPreferences.Editor editor = settings.edit();
editor.putString("latitude", Double.toString(address.getLatitude().toString()));'
editor.putString("longitude", Double.toString(address.getLongitude()));
editor.commit();
String addressText = String.format("%s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getCountryName());
markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title(addressText);
googleMap.addMarker(markerOptions);
// Locate the first location
if(i==0)
googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
to get the values
String latitude=settings.getString("latitude","0");
String longitude=settings.getString("longitude","0");
double lati = Double.parseDouble(lat);
double lngi = Double.parseDouble(lng);
LatLng LOCATION = new LatLng(lati, lngi);
To save in the database;
DBLocation helper1=new DBLocation(getBaseContext());
database = helper1.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ONLINELOCATION_lATITUDE, latitude);
values.put(ONLINELOCATION_LONGITUDE, longitude);
Log.i("Insert Into Database","Insert");
database.insert(ONLINELOCATION_TABLE, null, values);
To retrieve:
Cursor callpending_cursor=null;
database=helper1.getReadableDatabase();
callpending_cursor=database.query(ONLINELOCATION_TABLE, new String[] {ONLINELOCATION_ID,ONLINELOCATION_AID_ID,ONLINELOCATION_USERID_ID,ONLINELOCATION_lATITUDE,ONLINELOCATION_LONGITUDE,ONLINELOCATION_ID +" DESC"}, null, null, null, null, null);
Log.i("step8","step8");
//callpending_cursor.moveToLast();
if(!callpending_cursor.isAfterLast()) {
callpending_cursor.moveToFirst();
do{
Log.i("step9","step9");
String callpending_id=callpending_cursor.getString(0);
Aid_ID=callpending_cursor.getString(1);
USER_Id=callpending_cursor.getString(2);
USER_Latitude=callpending_cursor.getString(3);
USER_Longitude=callpending_cursor.getString(4);
callpending_cursor.moveToNext();
Im trying to put all addresses (Strings) into a list and then get them one by one and populate a map with markers, but i get this error saing that java.util.arraylist cannot be cast to android.location.address. any help?
this is the snipet of code that generates the error
int i = 0;
List<List<Address>> addressList = new ArrayList<List<Address>>();
//while (indirizzi != null) {
while (i <= 3) {
try {
addressList.add(geocoder.getFromLocationName(indirizzi.get(i), 1));
Log.i("indirizzo i-esimo",indirizzi.get(i));
i++;
} catch (IOException e) {
Log.i("geolocation","geolocation IOException");
e.printStackTrace();
}
}
for (int j = 0; j < addressList.size(); j++) {
Address address = (Address) addressList.get(j);
if(address.hasLatitude() && address.hasLongitude()){
latLng = new LatLng(address.getLatitude(), address.getLongitude());
}
markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title(indirizzi.get(i));
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.icn_albero));
Log.i("for", Integer.toString(i));
j++;
googleMap.addMarker(markerOptions);
}
Look at the definition , it is a List of List of Address.
List<List<Address>> addressList = new ArrayList<List<Address>>();
You cannot do this :
Address address = (Address) addressList.get(j);
As this will give you a List<Address> which is not an Address object.
You can possibly do :
Address address = (Address) addressList.get(j).get(someOtherIndex);
Define the List as :
List<Address> addressList = new ArrayList<Address>();
I have Used the below code.
I have called the GeocoderTask class from the oncreate.
ed.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {
addresstext = (String) parent.getItemAtPosition(position);
Toast.makeText(getBaseContext(),""+addresstext+ "", Toast.LENGTH_SHORT).show();
if(addresstext!=null && !addresstext.equals("")){
new GeocoderTask().execute(addresstext);
}
}
});
-
private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{
#Override
protected List<Address> doInBackground(String... locationName) {
// Creating an instance of Geocoder class
Geocoder geocoder = new Geocoder(getBaseContext());
List<Address> addresses = null;
try {
// Getting a maximum of 10 Address that matches the input text
addresses = geocoder.getFromLocationName(locationName[0], 10);
System.out.println(" Inside Background Process");
} catch (IOException e) {
e.printStackTrace();
}
return addresses;
}
#Override
protected void onPostExecute(List<Address> addresses) {
if(addresses==null || addresses.size()==0){
Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show();
}
// Clears all the existing markers on the map
if(marker!=null){
marker.remove();
}
// Adding Markers on Google Map for each matching address
for(int i=0;i<addresses.size();i++){
Address address = (Address) addresses.get(i);
// Creating an instance of GeoPoint, to display in Google Map
LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
addressText = String.format("%s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getCountryName());
System.out.println(" Inside OnPostExecutemeathod Process");
Toast.makeText(getBaseContext(), ""+address.getLatitude()+" - "+address.getLongitude()+"", Toast.LENGTH_SHORT).show();
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(latLng) // Sets the center of the map to Mountain View
.zoom(17) // Sets the zoom
.bearing(90) // Sets the orientation of the camera to east
.tilt(30) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 18));
marker = map.addMarker(new MarkerOptions()
.position(latLng)
.title(""+addresstext+""));
marker.showInfoWindow();
}
}
I want to do reverse geocoding in my app using map api 2.But i dont know exactly how to do that?Any ideas?
Use Geocoder:
Geocoder geoCoder = new Geocoder(context);
List<Address> matches = geoCoder.getFromLocation(latitude, longitude, 1);
Address bestMatch = (matches.isEmpty() ? null : matches.get(0));
This is how it works for me..
MarkerOptions markerOptions;
Location myLocation;
Button btLocInfo;
String selectedLocAddress;
private GoogleMap myMap;
LatLng latLng;
LatLng tmpLatLng;
#Override
public void onMapLongClick(LatLng point) {
// Getting the Latitude and Longitude of the touched location
latLng = point;
// Clears the previously touched position
myMap.clear();
// Animating to the touched position
myMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// Creating a marker
markerOptions = new MarkerOptions();
// Setting the position for the marker
markerOptions.position(latLng);
// Adding Marker on the touched location with address
new ReverseGeocodingTask(getBaseContext()).execute(latLng);
//tmpLatLng = latLng;
btLocInfo.setEnabled(true);
btLocInfo.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
double[] coordinates={tmpLatLng.latitude/1E6,tmpLatLng.longitude/1E6};
double latitude = tmpLatLng.latitude;
double longitude = tmpLatLng.longitude;
Log.i("selectedCoordinates", latitude + " " + longitude);
Log.i("selectedLocAddress", selectedLocAddress);
}
});
}
private class ReverseGeocodingTask extends AsyncTask<LatLng, Void, String>{
Context mContext;
public ReverseGeocodingTask(Context context){
super();
mContext = context;
}
// Finding address using reverse geocoding
#Override
protected String doInBackground(LatLng... params) {
Geocoder geocoder = new Geocoder(mContext);
double latitude = params[0].latitude;
double longitude = params[0].longitude;
List<Address> addresses = null;
String addressText="";
try {
addresses = geocoder.getFromLocation(latitude, longitude,1);
Thread.sleep(500);
if(addresses != null && addresses.size() > 0 ){
Address address = addresses.get(0);
addressText = String.format("%s, %s, %s",
address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "",
address.getLocality(),
address.getCountryName());
}
}
catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
selectedLocAddress = addressText;
return addressText;
}
#Override
protected void onPostExecute(String addressText) {
// Setting the title for the marker.
// This will be displayed on taping the marker
markerOptions.title(addressText);
// Placing a marker on the touched position
myMap.addMarker(markerOptions);
}
}
You can do like this to get complete address :
public class MainActivity extends AppCompatActivity {
...
private Geocoder geocoder;
private TextView mAddressTxtVu;
...
// assume that you got latitude and longitude correctly
mLatitude = 20.23232
mLongitude = 32.999
String errorMessage = "";
geocoder = new Geocoder(context, Locale.getDefault());
List<Address> addresses = null;
try {
addresses = geocoder.getFromLocation(
mlattitude,
mlongitude,
1);
} catch (IOException e) {
errorMessage = getString(R.string.service_not_available);
Log.e(TAG, errorMessage, e);
} catch (IllegalArgumentException illegalArgumentException) {
// Catch invalid latitude or longitude values.
errorMessage = getString(R.string.invalid_lat_long_used);
Log.e(TAG, errorMessage + ". " + "Latitude = " + mlattitude +",
Longitude = " + mlongitude, illegalArgumentException);
}
// Handle case where no address was found.
if (addresses == null || addresses.size() == 0) {
if (errorMessage.isEmpty()) {
errorMessage = getString(R.string.no_address_found);
Log.e(TAG, errorMessage);
}
} else {
Address address = addresses.get(0);
ArrayList<String> addressFragments = new ArrayList<String>();
// Fetch the address lines using getAddressLine,
// join them, and send them to the thread.
for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
addressFragments.add(address.getAddressLine(i));
}
// Log.i(TAG, getString(R.string.address_found));
mAddressTxtVu.setText(TextUtils.join(System.getProperty("line.separator"),
addressFragments));
}
Hope it helps!
You don't need to use Google Maps Api for this purpose. Android SKD have a class for it which you can simply use without any registration of API Key and so on. The class is android.location.Geocoder. It have methods for geocoding and reverse geocoding. I was looking in the source code of this class and found that it have a method android.location.Geocoder#getFromLocationName(java.lang.String, int) where first argument is address, and second is max number of results you want. It returns a List<Address>. The Address class have methods like android.location.Address#getLatitude and android.location.Address#getLongitude. They both return double.
Try it and let me know how good it is :-)