Android Google Map how to check if the gps location is inside the circle -
i'm trying detect if user in radius of marker , using users gps location. have marker's coordinates, don't know how calculate whether user in area. i've tried use following, when current location inside circle keep getting "outside" message.
public class mapaescola extends fragmentactivity { private googlemap googlemap; private serializable escolas; private progressdialog dialog; private circle mcircle; private marker mmarker; @targetapi(build.version_codes.ice_cream_sandwich) @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); getactionbar().setdisplayhomeasupenabled(true); getactionbar().sethomebuttonenabled(true); setcontentview(r.layout.maps); // loading map initilizemap(); // changing map type googlemap.setmaptype(googlemap.map_type_normal); // showing / hiding current location googlemap.setmylocationenabled(true); // enable / disable zooming controls googlemap.getuisettings().setzoomcontrolsenabled(true); // enable / disable location button googlemap.getuisettings().setmylocationbuttonenabled(true); // enable / disable compass icon googlemap.getuisettings().setcompassenabled(true); // enable / disable rotate gesture googlemap.getuisettings().setrotategesturesenabled(true); // enable / disable zooming functionality googlemap.getuisettings().setzoomgesturesenabled(true); bundle = getintent().getbundleextra("extra"); arraylist<escolas> objects = (arraylist<escolas>) extra.getserializable("array"); try { for(int = 0; < objects.size(); ++) { system.out.println(" escolas " + objects.get(i).getlatitude() + " " + objects.get(i).getlongitude()); float latitude = objects.get(i).getlatitude(); float longitude = objects.get(i).getlongitude(); googlemap.movecamera(cameraupdatefactory.newlatlngzoom(new latlng(-23.316281, -51.155528), 15)); markeroptions options = new markeroptions(); // setting position of marker options.position(new latlng(latitude, longitude)); googlemap = ((mapfragment) getfragmentmanager().findfragmentbyid(r.id.map)).getmap(); latlng latlng = new latlng(latitude, longitude); drawmarkerwithcircle(latlng); googlemap.setonmylocationchangelistener(new googlemap.onmylocationchangelistener() { @override public void onmylocationchange(location location) { float[] distance = new float[2]; location.distancebetween( mmarker.getposition().latitude, mmarker.getposition().longitude, mcircle.getcenter().latitude, mcircle.getcenter().longitude, distance); if( distance[0] > (mcircle.getradius() / 2) ){ toast.maketext(getbasecontext(), "outside", toast.length_long).show(); } else { toast.maketext(getbasecontext(), "inside", toast.length_long).show(); } } }); } } catch (exception e) { e.printstacktrace(); } } private void drawmarkerwithcircle(latlng position){ double radiusinmeters = 500.0; int strokecolor = 0xffff0000; //red outline int shadecolor = 0x44ff0000; //opaque red fill circleoptions circleoptions = new circleoptions().center(position).radius(radiusinmeters).fillcolor(shadecolor).strokecolor(strokecolor).strokewidth(8); mcircle = googlemap.addcircle(circleoptions); markeroptions markeroptions = new markeroptions().position(position); mmarker = googlemap.addmarker(markeroptions); } private void initilizemap() { if (googlemap == null) { googlemap = ((mapfragment) getfragmentmanager().findfragmentbyid( r.id.map)).getmap(); // check if map created or not if (googlemap == null) { toast.maketext(getapplicationcontext(), "não foi possível carregar o mapa", toast.length_short) .show(); } } } @targetapi(build.version_codes.honeycomb) @override public void onbackpressed() { super.onbackpressed(); finish(); } @override public boolean oncreateoptionsmenu(menu menu) { // todo auto-generated method stub menuinflater inflater = getmenuinflater(); inflater.inflate(r.menu.menu_main, menu); return super.oncreateoptionsmenu(menu); } @targetapi(build.version_codes.honeycomb) public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case android.r.id.home: super.onbackpressed(); finish(); return true; } return true; } @override protected void onresume() { super.onresume(); initilizemap(); } }
i ran updated code , figured out main problem is.
you should using location passed onmylocationchange() callback, uses current location tell if device within circle or not:
googlemap.setonmylocationchangelistener(new googlemap.onmylocationchangelistener() { @override public void onmylocationchange(location location) { float[] distance = new float[2]; /* location.distancebetween( mmarker.getposition().latitude, mmarker.getposition().longitude, mcircle.getcenter().latitude, mcircle.getcenter().longitude, distance); */ location.distancebetween( location.getlatitude(), location.getlongitude(), mcircle.getcenter().latitude, mcircle.getcenter().longitude, distance); if( distance[0] > mcircle.getradius() ){ toast.maketext(getbasecontext(), "outside, distance center: " + distance[0] + " radius: " + mcircle.getradius(), toast.length_long).show(); } else { toast.maketext(getbasecontext(), "inside, distance center: " + distance[0] + " radius: " + mcircle.getradius() , toast.length_long).show(); } } }); here full working example ran, it's pared down version of original code:
public class mainactivity extends actionbaractivity { private googlemap googlemap; private serializable escolas; private progressdialog dialog; private circle mcircle; private marker mmarker; @targetapi(build.version_codes.ice_cream_sandwich) @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); getsupportactionbar().setdisplayhomeasupenabled(true); getsupportactionbar().sethomebuttonenabled(true); setcontentview(r.layout.activity_main); // loading map initilizemap(); // changing map type googlemap.setmaptype(googlemap.map_type_normal); // showing / hiding current location googlemap.setmylocationenabled(true); // enable / disable zooming controls googlemap.getuisettings().setzoomcontrolsenabled(true); // enable / disable location button googlemap.getuisettings().setmylocationbuttonenabled(true); // enable / disable compass icon googlemap.getuisettings().setcompassenabled(true); // enable / disable rotate gesture googlemap.getuisettings().setrotategesturesenabled(true); // enable / disable zooming functionality googlemap.getuisettings().setzoomgesturesenabled(true); // bundle = getintent().getbundleextra("extra"); //arraylist<escolas> objects = (arraylist<escolas>) extra.getserializable("array"); try { //test outside double mlatitude = 37.77657; double mlongitude = -122.417506; //test inside //double mlatitude = 37.7795516; //double mlongitude = -122.39292; googlemap.movecamera(cameraupdatefactory.newlatlngzoom(new latlng(mlatitude, mlongitude), 15)); markeroptions options = new markeroptions(); // setting position of marker options.position(new latlng(mlatitude, mlongitude)); //googlemap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid(r.id.map)).getmap(); latlng latlng = new latlng(mlatitude, mlongitude); drawmarkerwithcircle(latlng); googlemap.setonmylocationchangelistener(new googlemap.onmylocationchangelistener() { @override public void onmylocationchange(location location) { float[] distance = new float[2]; /* location.distancebetween( mmarker.getposition().latitude, mmarker.getposition().longitude, mcircle.getcenter().latitude, mcircle.getcenter().longitude, distance); */ location.distancebetween( location.getlatitude(), location.getlongitude(), mcircle.getcenter().latitude, mcircle.getcenter().longitude, distance); if( distance[0] > mcircle.getradius() ){ toast.maketext(getbasecontext(), "outside, distance center: " + distance[0] + " radius: " + mcircle.getradius(), toast.length_long).show(); } else { toast.maketext(getbasecontext(), "inside, distance center: " + distance[0] + " radius: " + mcircle.getradius() , toast.length_long).show(); } } }); } catch (exception e) { e.printstacktrace(); } } private void drawmarkerwithcircle(latlng position){ double radiusinmeters = 500.0; int strokecolor = 0xffff0000; //red outline int shadecolor = 0x44ff0000; //opaque red fill circleoptions circleoptions = new circleoptions().center(position).radius(radiusinmeters).fillcolor(shadecolor).strokecolor(strokecolor).strokewidth(8); mcircle = googlemap.addcircle(circleoptions); markeroptions markeroptions = new markeroptions().position(position); mmarker = googlemap.addmarker(markeroptions); } private void initilizemap() { if (googlemap == null) { googlemap = ((supportmapfragment) getsupportfragmentmanager().findfragmentbyid( r.id.map)).getmap(); // check if map created or not if (googlemap == null) { toast.maketext(getapplicationcontext(), "não foi possível carregar o mapa", toast.length_short) .show(); } } } @targetapi(build.version_codes.honeycomb) @override public void onbackpressed() { super.onbackpressed(); finish(); } @override public boolean oncreateoptionsmenu(menu menu) { // todo auto-generated method stub menuinflater inflater = getmenuinflater(); inflater.inflate(r.menu.menu_main, menu); return super.oncreateoptionsmenu(menu); } @targetapi(build.version_codes.honeycomb) public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case android.r.id.home: super.onbackpressed(); finish(); return true; } return true; } @override protected void onresume() { super.onresume(); initilizemap(); } } results of inside circle:

results of outside circle:

Comments
Post a Comment