java - How to get user's current location and plot it on the map using OverlayItem -
i working on application related plotting buses , bus stops on map. 1 task user's current location , stop updating when app pauses , continue updating when app resumes. also, location update occurs @ once every 10 seconds or change in position of @ least 25 meters. need plot user's current location on map.
here's code mapdisplayfragment. overlayitems added here (including overlayitem representing user's location), , seems need create new classes implement these functionality instead of writing code in class did. thinking of building 2 classes: mylocationlistener extends locationlistener , mylocationfragment extends fragment, don't know how started: more specifically, don't know relationship between these classes should build. idea?
import java.util.arraylist; import java.util.list; import org.osmdroid.defaultresourceproxyimpl; import org.osmdroid.resourceproxy; import org.osmdroid.api.imapcontroller; import org.osmdroid.tileprovider.tilesource.tilesourcefactory; import org.osmdroid.util.geopoint; import org.osmdroid.views.mapview; import org.osmdroid.views.overlay.itemizediconoverlay; import org.osmdroid.views.overlay.itemizediconoverlay.onitemgesturelistener; import org.osmdroid.views.overlay.overlayitem; import android.app.activity; import android.app.alertdialog; import android.app.progressdialog; import android.content.context; import android.content.res.resources; import android.location.criteria; import android.location.location; import android.location.locationmanager; import android.os.asynctask; import android.os.bundle; import android.support.v4.app.fragment; import android.util.log; import android.view.layoutinflater; import android.view.menu; import android.view.menuinflater; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import ca.ubc.cpsc210.exception.translinkexception; import ca.ubc.cpsc210.nextbus.model.bus; import ca.ubc.cpsc210.nextbus.model.busstop; import ca.ubc.cpsc210.nextbus.translink.itranslinkservice; import ca.ubc.cpsc210.nextbus.translink.translinkservice; import ca.ubc.cpsc210.nextbus.util.latlon; import ca.ubc.cpsc210.nextbus.util.textoverlay; /** * fragment holding map in ui. */ public class mapdisplayfragment extends fragment { /** * log tag logcat messages */ private final static string log_tag = "mapdisplayfragment"; /** * location of nelson & granville, downtown vancouver */ private final static geopoint nelson_granville = new geopoint(49.279285, -123.123007); /** * overlay bus markers. */ private itemizediconoverlay<overlayitem> buslocnoverlay; /** * overlay bus stop location */ private itemizediconoverlay<overlayitem> busstoplocationoverlay; /** * overlay legend */ private textoverlay legendoverlay; /** * view shows map */ private mapview mapview; /** * selected bus stop */ private busstop selectedstop; /** * wraps translink web service */ private itranslinkservice tlservice; /** * map controller zooming in/out, centering */ private imapcontroller mapcontroller; /** * true if , if map should zoom fit displayed route. */ private boolean zoomtofit; /** * bus selected user */ private overlayitem selectedbus; /** * user's location icon. */ private overlayitem userlocnicon; /** * overlay user current location. */ private itemizediconoverlay<overlayitem> userlocnoverlay; /** * user's location. */ private geopoint location; /** * set translink service */ @override public void oncreate(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); log.d(log_tag, "onactivitycreated"); sethasoptionsmenu(true); tlservice = new translinkservice(getactivity()); log.d(log_tag, "stop number mapping: " + (selectedstop == null ? "not set" : selectedstop.getstopnum())); } /** * set map view overlays buses , selected bus stop. */ @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { log.d(log_tag, "oncreateview"); if (mapview == null) { mapview = new mapview(getactivity(), null); mapview.settilesource(tilesourcefactory.mapnik); mapview.setclickable(true); mapview.setbuiltinzoomcontrols(true); // set default view map (this seems important when // gets overwritten plotbuses) mapcontroller = mapview.getcontroller(); mapcontroller.setzoom(mapview.getmaxzoomlevel() - 4); mapcontroller.setcenter(nelson_granville); buslocnoverlay = createbuslocnoverlay(); busstoplocationoverlay = createbusstoplocnoverlay(); legendoverlay = createtextoverlay(); userlocnoverlay = createuserlocnoverlay(); // order matters: overlays added later displayed on top of // overlays added earlier. mapview.getoverlays().add(busstoplocationoverlay); mapview.getoverlays().add(buslocnoverlay); mapview.getoverlays().add(userlocnoverlay); mapview.getoverlays().add(legendoverlay); } return mapview; } @override public void oncreateoptionsmenu(menu menu, menuinflater inflater) { super.oncreateoptionsmenu(menu, inflater); inflater.inflate(r.menu.fragment_map_refresh, menu); } @override public boolean onoptionsitemselected(menuitem item) { if (item.getitemid() == r.id.map_refresh) { update(false); return true; } return super.onoptionsitemselected(item); } /** * when view destroyed, remove map view parent can * added again when view re-created. */ @override public void ondestroyview() { log.d(log_tag, "ondestroyview"); ((viewgroup) mapview.getparent()).removeview(mapview); super.ondestroyview(); } @override public void ondestroy() { log.d(log_tag, "ondestroy"); super.ondestroy(); } /** * update bus locations. */ @override public void onresume() { log.d(log_tag, "onresume"); update(true); super.onresume(); } /** * set selected bus stop * @param selectedstop selected stop */ public void setbusstop(busstop selectedstop) { this.selectedstop = selectedstop; } /** * update bus location info selected stop, * zoomtofit status , repaint. * * @param zoomtofit true if map must zoomed fit (when new bus stop has been selected) */ void update(boolean zoomtofit) { log.d(log_tag, "update - zoomtofit: " + zoomtofit); this.zoomtofit = zoomtofit; if(selectedstop != null) { new getbusinfo().execute(selectedstop); selectedbus = null; } mapview.invalidate(); } /** * create overlay bus markers. */ private itemizediconoverlay<overlayitem> createbuslocnoverlay() { resourceproxy rp = new defaultresourceproxyimpl(getactivity()); onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() { /** * display bus information in dialog box when user taps * bus. * * @param index index of item tapped * @param oi overlayitem tapped * @return true indicate tap event has been handled */ @override public boolean onitemsingletapup(int index, overlayitem oi) { alertdialog dlg = createsimpledialog(oi.gettitle(), oi.getsnippet()); dlg.show(); if(selectedbus != null){ selectedbus.setmarker(getresources().getdrawable(r.drawable.bus)); } selectedbus = oi; selectedbus.setmarker(getresources().getdrawable(r.drawable.selected_bus)); mapview.postinvalidate(); return true; } @override public boolean onitemlongpress(int index, overlayitem oi) { // nothing return false; } }; return new itemizediconoverlay<overlayitem>( new arraylist<overlayitem>(), getresources().getdrawable(r.drawable.bus), gesturelistener, rp); } /** * create overlay bus stop marker. */ private itemizediconoverlay<overlayitem> createbusstoplocnoverlay() { resourceproxy rp = new defaultresourceproxyimpl(getactivity()); onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() { /** * display bus stop description in dialog box when user taps * stop. * * @param index index of item tapped * @param oi overlayitem tapped * @return true indicate tap event has been handled */ @override public boolean onitemsingletapup(int index, overlayitem oi) { alertdialog dlg = createsimpledialog(oi.gettitle(), oi.getsnippet()); dlg.show(); return true; } @override public boolean onitemlongpress(int index, overlayitem oi) { // nothing return false; } }; return new itemizediconoverlay<overlayitem>( new arraylist<overlayitem>(), getresources().getdrawable(r.drawable.stop), gesturelistener, rp); } private textoverlay createtextoverlay() { resourceproxy rp = new defaultresourceproxyimpl(getactivity()); resources res = getresources(); string legend = res.getstring(r.string.legend); return new textoverlay(rp, legend); } /** * create overlay user location markers. */ private itemizediconoverlay<overlayitem> createuserlocnoverlay() { resourceproxy rp = new defaultresourceproxyimpl(getactivity()); onitemgesturelistener<overlayitem> gesturelistener = new onitemgesturelistener<overlayitem>() { /** * display user location. * * @param index index of item tapped * @param oi overlayitem tapped * @return true indicate tap event has been handled */ @override public boolean onitemsingletapup(int index, overlayitem oi) { // don't anything. return false; } @override public boolean onitemlongpress(int index, overlayitem oi) { // nothing return false; } }; return new itemizediconoverlay<overlayitem>( new arraylist<overlayitem>(), getresources().getdrawable(r.drawable.map_pin_blue), gesturelistener, rp); } /** * plot bus stop */ private void plotbusstop() { latlon latlon = selectedstop.getlatlon(); geopoint point = new geopoint(latlon.getlatitude(), latlon.getlongitude()); overlayitem overlayitem = new overlayitem(integer.valueof(selectedstop.getstopnum()).tostring(), selectedstop.getlocationdesc(), point); busstoplocationoverlay.removeallitems(); // make sure not adding // bus stop more once busstoplocationoverlay.additem(overlayitem); } /** * plot buses onto bus location overlay * * @param zoomtofit determines if map should zoomed bounds of plotted buses */ private void plotbuses(boolean zoomtofit) { list<bus> buses = selectedstop.getbuses(); double maxlatspan = 0.0; double maxlonspan = 0.0; buslocnoverlay.removeallitems(); for(bus b : buses){ double latdifference = math.abs(b.getlatlon().getlatitude()-nelson_granville.getlatitude() ); if(latdifference > maxlatspan && (latdifference < 2.0)){ maxlatspan = latdifference; } double londifference = math.abs(b.getlatlon().getlongitude()-nelson_granville .getlongitude()); if(londifference > maxlonspan && (londifference < 2.0)){ maxlonspan = londifference; } string routeno = b.getroute().getname(); string desc = b.getdescription(); latlon latlon = b.getlatlon(); geopoint point = new geopoint(latlon.getlatitude(), latlon.getlongitude()); overlayitem overlayitem = new overlayitem(routeno, desc, point); buslocnoverlay.additem(overlayitem); } if(zoomtofit){ mapcontroller.zoomtospan((int)math.abs(maxlatspan*2e6), (int) math.abs(maxlonspan*2e6)); } } /** * helper create simple alert dialog display message * @param title title displayed @ top of dialog * @param msg message display in dialog * @return alert dialog */ private alertdialog createsimpledialog(string title, string msg) { alertdialog.builder dialogbldr = new alertdialog.builder(getactivity()); dialogbldr.settitle(title); dialogbldr.setmessage(msg); dialogbldr.setneutralbutton(r.string.ok, null); return dialogbldr.create(); } public void getuserlocation() { criteria criteria = new criteria(); context cont = new activity(); locationmanager locationmanager = (locationmanager) getactivity().getsystemservice(context.location_service); string bestprovider = locationmanager.getbestprovider(criteria, true); location userlocation = locationmanager.getlastknownlocation(bestprovider); location = new geopoint(userlocation.getlatitude() * 1e6, userlocation.getlongitude() * 1e6); } private void plotuserlocation() { getuserlocation(); userlocnicon = new overlayitem("userlocn", "user location", location); userlocnoverlay.additem(userlocnicon); } /** * asynchronous task bus location estimates translink service. * displays progress dialog while running in background. */ private class getbusinfo extends asynctask<busstop, void, void> { private progressdialog dialog = new progressdialog(getactivity()); private boolean success = true; @override protected void onpreexecute() { dialog.setmessage("retrieving bus info..."); dialog.show(); } @override protected void doinbackground(busstop... selectedstops) { busstop selectedstop = selectedstops[0]; try { tlservice.addbuslocationsforstop(selectedstop); } catch (translinkexception e) { e.printstacktrace(); success = false; } return null; } @override protected void onpostexecute(void dummy) { dialog.dismiss(); if (success) { plotbuses(zoomtofit); plotbusstop(); plotuserlocation(); mapview.invalidate(); } else { alertdialog dialog = createsimpledialog("error", "unable retrieve bus location info..."); dialog.show(); } } } } any appreciated.
i had same problem after doing search on google know mapview deprecated now. must use map fragment , extend fragmentactivity instead of mapactivity
Comments
Post a Comment