Thursday, January 21, 2010

Convert Exif GPS info to Degree format

In the previous exercise "Android File Explorer with JPG's Exif & Photo displayed", Exif, include GPS info, of a JPG will be retrieve and displayed.

In my own case; I have no digital camera with GPS, but I have a GPS logger. The GPS info can be added into JPG file using GPicSync. But it's in the format of degree, minute, second, not GeoPoint form, as I used in my Mapper exercise. So I have to convert it by myself.



Here I create a class geoDegree to handle the conversion from degree, minute, second form to GeoPoint form.

package com.AndroidExplorer;

import android.media.ExifInterface;

public class geoDegree {
private boolean valid = false;
Float Latitude, Longitude;
geoDegree(ExifInterface exif){
String attrLATITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
String attrLATITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
String attrLONGITUDE = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
String attrLONGITUDE_REF = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);

if((attrLATITUDE !=null)
&& (attrLATITUDE_REF !=null)
&& (attrLONGITUDE != null)
&& (attrLONGITUDE_REF !=null))
{
valid = true;

if(attrLATITUDE_REF.equals("N")){
Latitude = convertToDegree(attrLATITUDE);
}
else{
Latitude = 0 - convertToDegree(attrLATITUDE);
}

if(attrLONGITUDE_REF.equals("E")){
Longitude = convertToDegree(attrLONGITUDE);
}
else{
Longitude = 0 - convertToDegree(attrLONGITUDE);
}

}
};

private Float convertToDegree(String stringDMS){
Float result = null;
String[] DMS = stringDMS.split(",", 3);

String[] stringD = DMS[0].split("/", 2);
Double D0 = new Double(stringD[0]);
Double D1 = new Double(stringD[1]);
Double FloatD = D0/D1;

String[] stringM = DMS[1].split("/", 2);
Double M0 = new Double(stringM[0]);
Double M1 = new Double(stringM[1]);
Double FloatM = M0/M1;

String[] stringS = DMS[2].split("/", 2);
Double S0 = new Double(stringS[0]);
Double S1 = new Double(stringS[1]);
Double FloatS = S0/S1;

result = new Float(FloatD + (FloatM/60) + (FloatS/3600));

return result;


};

public boolean isValid()
{
return valid;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return (String.valueOf(Latitude)
+ ", "
+ String.valueOf(Longitude));
}

public int getLatitudeE6(){
return (int)(Latitude*1000000);
}

public int getLongitudeE6(){
return (int)(Longitude*1000000);
}

}


In a short comming, I will have a exercise to open a MapView locate the GPS location of a photo.

3 comments:

mahsanq said...

Its great thank you.

Abukaff said...

Thank you for the post. it helped me

Anonymous said...

Thanks for your post.It is very useful.