app runs without errors, want calculate distance, when clicked button start it's start position , when clicked reset - finish position, , it'll calculate distance between start , finish position, cant calculate distance , speed. how correct that? here code:
public class tab1 extends fragment implements locationlistener, view.onclicklistener{ googlemap googlemap; supportmapfragment mapfragment; private button buttonstart; private button buttonstop; private button buttonreset; private chronometer chronometerrun; private double latstart; private double lonstart; private double latstop; private double lonstop; private latlng latlngstart; private latlng latlngstop; private textview textviewdistance; location location; long time = 0; @nullable public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.tab_1, container, false); textviewdistance = (textview)view.findviewbyid(r.id.textviewdistance); buttonstart = (button) view.findviewbyid(r.id.buttonstart); buttonstop = (button) view.findviewbyid(r.id.buttonstop); buttonreset = (button) view.findviewbyid(r.id.buttonreset); chronometerrun = (chronometer) view.findviewbyid(r.id.chronometerrunning); buttonstart.setonclicklistener(this); buttonstop.setonclicklistener(this); buttonreset.setonclicklistener(this); initmap(); return view; } public void initmap(){ if (googlemap == null) { mapfragment = (supportmapfragment) getchildfragmentmanager().findfragmentbyid(r.id.map); } googlemap = mapfragment.getmap(); googlemap.setmylocationenabled(true); // getting locationmanager object system service location_service locationmanager locationmanager = (locationmanager) getactivity().getsystemservice(context.location_service); // creating criteria object retrieve provider criteria criteria = new criteria(); // getting name of best provider string provider = locationmanager.getbestprovider(criteria, true); // getting current location location = locationmanager.getlastknownlocation(provider); if(location!=null){ onlocationchanged(location); } locationmanager.requestlocationupdates(provider, 20000, 0, this); googlemap.getuisettings().setmylocationbuttonenabled(true); } public double calculationbydistance(latlng startp, latlng endp) { int radius = 6371;// radius of earth in km double lat1 = startp.latitude; double lat2 = endp.latitude; double lon1 = startp.longitude; double lon2 = endp.longitude; double dlat = math.toradians(lat2 - lat1); double dlon = math.toradians(lon2 - lon1); double = math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.toradians(lat1)) * math.cos(math.toradians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2); double c = 2 * math.asin(math.sqrt(a)); double valueresult = radius * c; double km = valueresult / 1; decimalformat newformat = new decimalformat("####"); int kmindec = integer.valueof(newformat.format(km)); double meter = valueresult % 1000; int meterindec = integer.valueof(newformat.format(meter)); log.i("radius value", "" + valueresult + " km " + kmindec + " meter " + meterindec); return radius * c; //km } @override public void onclick(view v) { switch(v.getid()) { case r.id.buttonstart: chronometerrun.setbase(systemclock.elapsedrealtime() - time); chronometerrun.start(); latstart = location.getlatitude(); // getting longitude lonstart = location.getlongitude(); toast.maketext(tab1.super.getactivity() , "latstart: "+latstart+"; lonstart: "+lonstart,toast.length_long).show(); // creating latlng object latlngstart = new latlng(latstart, lonstart); log.i("latstart: "+latstart , "lonstart: "+lonstart); break; case r.id.buttonstop: time = systemclock.elapsedrealtime() - chronometerrun.getbase(); chronometerrun.stop(); break; case r.id.buttonreset: time = systemclock.elapsedrealtime() - chronometerrun.getbase(); toast.maketext(tab1.super.getactivity() , "time: "+time,toast.length_short).show(); latstop = location.getlatitude(); // getting longitude of current location lonstop = location.getlongitude(); toast.maketext(tab1.super.getactivity() , "latstop: "+latstop+"; lonstop: "+lonstop,toast.length_long).show(); // creating latlng object current location latlngstop = new latlng(latstop, lonstop); log.i("latstop: "+latstop , "lonstop: "+lonstop); double distance = calculationbydistance(latlngstart,latlngstop); string sdistance = double.tostring(distance); textviewdistance.settext(sdistance); if (time > 0 ) { double speed = distance / time*1000; // time in ms toast.maketext(tab1.super.getactivity() , "distance: "+ distance +"; speed: "+speed,toast.length_long).show(); } time = 0; chronometerrun.setbase(systemclock.elapsedrealtime()); chronometerrun.stop(); break; } } @override public void onlocationchanged(location location) { // getting latitude of current location double latitude = location.getlatitude(); // getting longitude of current location double longitude = location.getlongitude(); // creating latlng object current location latlng latlng = new latlng(latitude, longitude); // showing current location in google map googlemap.movecamera(cameraupdatefactory.newlatlng(latlng)); // zoom in google map googlemap.animatecamera(cameraupdatefactory.zoomto(14)); } @override public void onstatuschanged(string provider, int status, bundle extras) { } @override public void onproviderenabled(string provider) { } @override public void onproviderdisabled(string provider) { } }
you dont have call onlocationchanged method that, automatically called everytime there change in location. either have call getlastknownlocation again in reset button code , take location last 1 (like in init map) or have global variable update in onlocationchanged method. so(pseudo-pseudo code):
onlocationchanged(location location) { globalvarlocation.latitude = location.latitude; globalvarlocation.longitude = location.longitude; }
Comments
Post a Comment