Add GPX export.

This commit is contained in:
Geoffrey POUZET 2018-08-14 17:29:42 +02:00
parent e883f7eeba
commit 95bd039122
6 changed files with 200 additions and 42 deletions

View File

@ -6,6 +6,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.hardware.GeomagneticField;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
@ -50,6 +51,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
public static final String TAG = MainActivity.class.getName();
public static String appName = "";
private MyLocationNewOverlay mLocationOverlay;
private CompassOverlay mCompassOverlay;
private IOrientationProvider compass = null;
@ -68,6 +71,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
private FloatingActionButton start_stop_trace;
private FloatingActionButton start_stop_dog_trace;
private FloatingActionButton add_object;
@RequiresApi(api = Build.VERSION_CODES.M)
protected void checkPermissions() {
@ -81,6 +85,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appName = getString(R.string.app_name);
//handle permissions first, before map is created. not depicted here
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkPermissions();
@ -148,7 +153,8 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
changeStatusDogTrace();
}
});
FloatingActionButton add_object = findViewById(R.id.add_object);
add_object = findViewById(R.id.add_object);
add_object.setVisibility(View.GONE);
add_object.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@ -166,8 +172,12 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
serviceGps.toggleTraceurActivation();
if (serviceGps.isTraceurActivated()) {
this.start_stop_trace.setImageResource(R.drawable.ic_menu_offline);
this.add_object.setVisibility(View.VISIBLE);
this.start_stop_dog_trace.setVisibility(View.GONE);
} else {
this.start_stop_trace.setImageResource(R.drawable.ic_menu_mylocation);
this.add_object.setVisibility(View.GONE);
this.start_stop_dog_trace.setVisibility(View.VISIBLE);
}
}
@ -175,8 +185,12 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
serviceGps.toggleDogActivation();
if (serviceGps.isDogActivated()) {
this.start_stop_dog_trace.setImageResource(R.drawable.ic_menu_offline);
this.add_object.setVisibility(View.GONE);
this.start_stop_trace.setVisibility(View.GONE);
} else {
this.start_stop_dog_trace.setImageResource(R.drawable.ic_menu_mylocation);
this.add_object.setVisibility(View.VISIBLE);
this.start_stop_trace.setVisibility(View.VISIBLE);
}
}
@ -225,6 +239,7 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
}
serviceGps.setLocationManager((LocationManager) getSystemService(Context.LOCATION_SERVICE));
serviceGps.setAppName(appName);
serviceGps.start();
mLocationOverlay.enableFollowLocation();
@ -359,43 +374,41 @@ public class MainActivity extends AppCompatActivity implements IOrientationConsu
@Override
public void update(Observable observable, Object o) {
Log.i(TAG, "update");
if (observable == serviceGps) {
Log.i(TAG, "service GPS");
if (o instanceof String && o.equals(ServiceGps.NOTIF_NEW_LOCATION)) {
Log.i(TAG, "new location");
GeoPoint currentPoint = serviceGps.getCurrentGeoPoint();
Polyline line = null;
if (serviceGps.isTraceurActivated()) {
Log.i(TAG, "polyline traceur");
map.getController().setCenter(currentPoint);
Location loc = serviceGps.getCurrentLocation();
if (loc != null) {
GeoPoint currentPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude(), loc.getAltitude());
Polyline line = null;
if (serviceGps.isTraceurActivated()) {
map.getController().setCenter(currentPoint);
line = new Polyline(map);
line.setTitle("Traceur");
line.setColor(Color.RED);
line.setPoints(convertListLocation(serviceGps.getListGeoPointTraceur()));
line = new Polyline(map);
line.setTitle("Trail");
line.setColor(Color.RED);
line.setPoints(convertListLocation(serviceGps.getListGeoPointTraceur()));
} else if (serviceGps.isDogActivated()) {
Log.i(TAG, "polyline dog");
map.getController().setCenter(currentPoint);
} else if (serviceGps.isDogActivated()) {
map.getController().setCenter(currentPoint);
line = new Polyline(map);
line.setTitle("Dog");
line.setColor(Color.BLUE);
line.setPoints(convertListLocation(serviceGps.getListGeoPointDog()));
}
line = new Polyline(map);
line.setTitle("Dog");
line.setColor(Color.BLUE);
line.setPoints(convertListLocation(serviceGps.getListGeoPointDog()));
}
if (line != null) {
line.setSubDescription(Polyline.class.getCanonicalName());
line.setWidth(LINE_WIDTH_BIG);
line.setGeodesic(true);
line.setInfoWindow(new BasicInfoWindow(R.layout.bonuspack_bubble, map));
map.getOverlayManager().add(line);
map.invalidate();
}
float orientation = serviceGps.getOrientation(deviceOrientation);
if (orientation >= 0) {
map.setMapOrientation(orientation);
if (line != null) {
line.setSubDescription(Polyline.class.getCanonicalName());
line.setWidth(LINE_WIDTH_BIG);
line.setGeodesic(true);
line.setInfoWindow(new BasicInfoWindow(R.layout.bonuspack_bubble, map));
map.getOverlayManager().add(line);
map.invalidate();
}
float orientation = serviceGps.getOrientation(deviceOrientation);
if (orientation >= 0) {
map.setMapOrientation(orientation);
}
}
}
}

View File

@ -0,0 +1,83 @@
package fr.chteufleur.mytrackingdog.models;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
public class ExportGpx extends Gpx {
private static final String TAG = Traces.class.getName();
private static final String XML_HEADER = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>";
private static final String GPX_HEADER = "<gpx xmlns=\"http://www.topografix.com/GPX/1/0\" version=\"1.0\" creator=\"fr.chteufleur.mytrackingdog\">";
private static final String GPX_FOOTER = "</gpx>";
private final String traceName;
private final List<MyLocation> listObjects = new ArrayList<>();
private final List<MyLocation> listTracePoint = new ArrayList<>();
public ExportGpx(File filePath, String traceName) {
super(filePath);
this.traceName = traceName;
}
public void setObjects(List<MyLocation> objects) {
this.listObjects.clear();
this.listObjects.addAll(objects);
}
public void setTrace(List<MyLocation> points) {
this.listTracePoint.clear();
this.listTracePoint.addAll(points);
}
public boolean export() {
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
Log.e(TAG, "External media not mounted.");
return false;
}
File parent = filePath.getParentFile();
if (!parent.exists()) {
if (parent.mkdir()) {
Log.i(TAG, "Create directory : "+parent.getAbsolutePath());
} else {
Log.e(TAG, "Fail to create dir : "+parent.getAbsolutePath());
}
}
boolean ret = false;
try {
FileWriter writer = new FileWriter(filePath);
writer.write(XML_HEADER+"\n"+GPX_HEADER);
for (MyLocation loc: listObjects) {
writer.write("\n"+loc.toWayPoint());
}
writer.write("\n<trk>");
writer.write("\n<trkseg>");
writer.write("\n<name>"+this.traceName+"</name>");
for (MyLocation loc: listTracePoint) {
writer.write("\n"+loc.toTracePoint());
}
writer.write("\n</trkseg>");
writer.write("\n</trk>");
writer.append("\n"+GPX_FOOTER);
writer.close();
ret = true;
Log.i(TAG, "Export successful to : "+filePath.getAbsolutePath());
} catch (Exception e) {
Log.e(TAG, "Failed to export to GPX file : "+filePath.getAbsolutePath(), e);
}
return ret;
}
}

View File

@ -0,0 +1,12 @@
package fr.chteufleur.mytrackingdog.models;
import java.io.File;
public class Gpx {
protected final File filePath;
public Gpx(File filePath) {
this.filePath = filePath;
}
}

View File

@ -28,7 +28,7 @@ public class Traces {
listPointDog.add(point);
}
public void addPointObject(MyLocation point) {
Log.i(TAG, "add point object");
Log.i(TAG, "add point object ("+point.toString()+")");
listPointObjects.add(point);
}
public void addCurrentPoint(MyLocation point) {

View File

@ -7,4 +7,23 @@ public class MyLocation extends Location {
public MyLocation(Location l) {
super(l);
}
public String toWayPoint() {
String ret = "<wpt lat=\""+getLatitude()+"\" lon=\""+getLongitude()+"\">";
ret += "<time>"+getTime()+"</time>";
ret += "</wpt>";
return ret;
}
public String toTracePoint() {
String ret = "<trkpt lat=\""+getLatitude()+"\" lon=\""+getLongitude()+"\">";
ret += "<time>"+getTime()+"</time>";
ret += "</trkpt>";
return ret;
}
@Override
public String toString() {
return String.format("lat=%,4f ; lon=%,4f ; time=%d", getLatitude(), getLongitude(), getTime());
}
}

View File

@ -4,13 +4,16 @@ import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import org.osmdroid.util.GeoPoint;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Observable;
import fr.chteufleur.mytrackingdog.models.ExportGpx;
import fr.chteufleur.mytrackingdog.models.Traces;
import fr.chteufleur.mytrackingdog.models.beans.MyLocation;
@ -21,12 +24,16 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe
private LocationManager locationManager;
private MyLocation currentLocation = null;
private String appName = "";
private final Traces traces = new Traces();
public void setLocationManager(LocationManager locationManager) {
this.locationManager = locationManager;
}
public void setAppName(String appName) {
this.appName = appName;
}
public MyLocation getCurrentLocation() {
return currentLocation;
@ -89,15 +96,11 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe
stop();
}
public GeoPoint getCurrentGeoPoint() {
if (currentLocation == null) {
return null;
}
return new GeoPoint(currentLocation.getLatitude(), currentLocation.getLongitude(), currentLocation.getAltitude());
}
public void toggleTraceurActivation() {
traces.toggleTraceurActivation();
if (!isTraceurActivated()) {
exportTrailTraceToGpx();
}
}
public boolean isTraceurActivated() {
return traces.isTraceurActivated();
@ -105,6 +108,9 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe
public void toggleDogActivation() {
traces.toggleDogActivation();
if (!isDogActivated()) {
exportDogTraceToGpx();
}
}
public boolean isDogActivated() {
return traces.isDogActivated();
@ -126,4 +132,29 @@ public class ServiceGps extends Observable implements IServiceGps, LocationListe
public List<MyLocation> getListGeoPointObjects() {
return traces.getListPointObjects();
}
public String getFileName(String prefix) {
SimpleDateFormat formater = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String date = formater.format(new Date());
return Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
+ appName + "/" + appName + "_" + date + "_" + prefix
+ ".gpx";
}
public boolean exportDogTraceToGpx() {
File file = new File(getFileName("dog"));
ExportGpx exportGpx = new ExportGpx(file, "dog");
exportGpx.setTrace(traces.getListPointDog());
return exportGpx.export();
}
public boolean exportTrailTraceToGpx() {
SimpleDateFormat formater = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String date = formater.format(new Date());
File file = new File(getFileName("trail"));
ExportGpx exportGpx = new ExportGpx(file, "trail");
exportGpx.setObjects(traces.getListPointObjects());
exportGpx.setTrace(traces.getListPointTraceur());
return exportGpx.export();
}
}