android - OverlayItem not updating on location change (OSM) -
i using osmdroid.
i have managed post adding overlay osmdroid creata overlay static item on specific location.
now trying make map little bit more dynamic. when location change overlayitem (which marking specific location on map) update also.
this tried do. map update overlayitem doesnt.
code:
package com.test.overlay; import java.util.arraylist; import org.osmdroid.defaultresourceproxyimpl; import org.osmdroid.resourceproxy; import org.osmdroid.tileprovider.tilesource.tilesourcefactory; import org.osmdroid.util.geopoint; import org.osmdroid.views.mapcontroller; import org.osmdroid.views.mapview; import org.osmdroid.views.overlay.itemizediconoverlay; import org.osmdroid.views.overlay.itemizedoverlay; import org.osmdroid.views.overlay.overlayitem; import org.osmdroid.views.util.constants.mapviewconstants; import android.app.activity; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.widget.toast; public class samplewithminimapitemizedoverlay extends activity implements locationlistener, mapviewconstants { private mapview mmapview; private mapcontroller mapcontroller; private locationmanager mlocmgr; private itemizedoverlay<overlayitem> mmylocationoverlay; private resourceproxy mresourceproxy; int longtitude = 31987968; int latitude = 34783155; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mresourceproxy = new defaultresourceproxyimpl(getapplicationcontext()); setcontentview(r.layout.main); mmapview = (mapview) this.findviewbyid(r.id.mapview); mmapview.settilesource(tilesourcefactory.mapnik); mmapview.setbuiltinzoomcontrols(true); mmapview.setmultitouchcontrols(true); mapcontroller = this.mmapview.getcontroller(); mapcontroller.setzoom(15); geopoint point2 = new geopoint(longtitude, latitude); // centre map here geopoint point3 = new geopoint(longtitude + 2000, latitude + 2000); // icon // goes // here // 31.987968,34.783155 mapcontroller.setcenter(point2); mlocmgr = (locationmanager) getsystemservice(location_service); mlocmgr.requestlocationupdates(locationmanager.gps_provider, 1000, 100, this); arraylist<overlayitem> items = new arraylist<overlayitem>(); // put overlay icon little way map centre items.add(new overlayitem("here", "sampledescription", point3)); /* ontaplistener markers, shows simple toast. */ this.mmylocationoverlay = new itemizediconoverlay<overlayitem>(items, new itemizediconoverlay.onitemgesturelistener<overlayitem>() { @override public boolean onitemsingletapup(final int index, final overlayitem item) { toast.maketext(samplewithminimapitemizedoverlay.this, "item '" + item.mtitle, toast.length_long) .show(); return true; // 'handled' event. } @override public boolean onitemlongpress(final int index, final overlayitem item) { toast.maketext(samplewithminimapitemizedoverlay.this, "item '" + item.mtitle, toast.length_long) .show(); return false; } }, mresourceproxy); this.mmapview.getoverlays().add(this.mmylocationoverlay); mmapview.invalidate(); } -------//here tried change !!!!!!!!!--------------- -- map location being updated not overlayitem. public void onlocationchanged(location location) { latitude = (int) (location.getlatitude() * 1e6); longtitude = (int) (location.getlongitude() * 1e6); toast.maketext(samplewithminimapitemizedoverlay.this, "location changed. lat:" + latitude + " long:" + longtitude , toast.length_long).show(); geopoint gpt = new geopoint(latitude, longtitude); mapcontroller.setcenter(gpt); mmapview.invalidate(); } @override public void onproviderdisabled(string arg0) { } @override public void onproviderenabled(string provider) { } @override public void onstatuschanged(string provider, int status, bundle extras) { } }
thanks,
ray.
this should work ok
.
public class samplewithminimapitemizedoverlay extends activity implements locationlistener, mapviewconstants { private mapview mmapview; private mapcontroller mapcontroller; private locationmanager mlocmgr; private itemizedoverlay<overlayitem> mmylocationoverlay; private resourceproxy mresourceproxy; int mlongtitude = 31987968; int mlatitude = 34783155; arraylist<overlayitem> mitems; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mresourceproxy = new defaultresourceproxyimpl(getapplicationcontext()); setcontentview(r.layout.main); mmapview = (mapview) this.findviewbyid(r.id.mapview); mmapview.settilesource(tilesourcefactory.mapnik); mmapview.setbuiltinzoomcontrols(true); mmapview.setmultitouchcontrols(true); mapcontroller = this.mmapview.getcontroller(); mapcontroller.setzoom(15); geopoint point2 = new geopoint(mlongtitude, mlatitude); // centre map here geopoint point3 = new geopoint(mlongtitude + 2000, mlatitude + 2000); // icon // goes // 31.987968,34.783155 mapcontroller.setcenter(point2); mlocmgr = (locationmanager) getsystemservice(location_service); mlocmgr.requestlocationupdates(locationmanager.gps_provider, 1000, 100, this); mitems = new arraylist<overlayitem>(); // put overlay icon little way map centre mitems.add(new overlayitem("here", "sampledescription", point3)); /* ontaplistener markers, shows simple toast. */ // refer gesture listemer name this.mmylocationoverlay = new itemizediconoverlay<overlayitem>(mitems, new glistener() , mresourceproxy); this.mmapview.getoverlays().add(this.mmylocationoverlay); mmapview.invalidate(); } //we can't use anonymous class anymore if want change position // of overlays/icons when location changed, give name class glistener implements onitemgesturelistener<overlayitem> { @override public boolean onitemlongpress(int index, overlayitem item) { toast.maketext(samplewithminimapitemizedoverlay.this, "item " + item.mtitle, toast.length_long).show(); return false; } @override public boolean onitemsingletapup(int index, overlayitem item) { toast.maketext(samplewithminimapitemizedoverlay.this, "item " + item.mtitle, toast.length_long).show(); return true; // 'handled' event. } } // -------//here tried change !!!!!!!!!--------------- // -- map location being updated not overlayitem. public void onlocationchanged(location location) { mlatitude = (int) (location.getlatitude() * 1e6); mlongtitude = (int) (location.getlongitude() * 1e6); toast.maketext(samplewithminimapitemizedoverlay.this, "location changed. lat:" + mlatitude + " long:" + mlongtitude, toast.length_long).show(); geopoint gpt = new geopoint(mlatitude, mlongtitude); mapcontroller.setcenter(gpt); mitems.clear(); // comment out line if want new icon each change of position mitems.add(new overlayitem("new", "sampledescription", gpt)); // change overlay this.mmylocationoverlay = new itemizediconoverlay<overlayitem>(mitems, new glistener() , mresourceproxy); this.mmapview.getoverlays().clear(); this.mmapview.getoverlays().add(this.mmylocationoverlay); mmapview.invalidate(); } @override public void onproviderdisabled(string arg0) { } @override public void onproviderenabled(string provider) { } @override public void onstatuschanged(string provider, int status, bundle extras) { } }
just comment/uncomment mitems.clear(); line depending on whether want new marker each time change position. (the icon appears atthe position have moved to)
Comments
Post a Comment