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.

4 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.

Unknown said...

It is only work for camera image ? becauase it failed to get for gallery image.Thanks in adv.