How to format GPS latitude and longitude?
Here's a Kotlin version, adapted from Martin Weber's answer. It also sets the correct hemisphere; N, S, W or E
object LocationConverter {
fun latitudeAsDMS(latitude: Double, decimalPlace: Int): String {
val direction = if (latitude > 0) "N" else "S"
var strLatitude = Location.convert(latitude.absoluteValue, Location.FORMAT_SECONDS)
strLatitude = replaceDelimiters(strLatitude, decimalPlace)
strLatitude += " $direction"
return strLatitude
}
fun longitudeAsDMS(longitude: Double, decimalPlace: Int): String {
val direction = if (longitude > 0) "W" else "E"
var strLongitude = Location.convert(longitude.absoluteValue, Location.FORMAT_SECONDS)
strLongitude = replaceDelimiters(strLongitude, decimalPlace)
strLongitude += " $direction"
return strLongitude
}
private fun replaceDelimiters(str: String, decimalPlace: Int): String {
var str = str
str = str.replaceFirst(":".toRegex(), "°")
str = str.replaceFirst(":".toRegex(), "'")
val pointIndex = str.indexOf(".")
val endIndex = pointIndex + 1 + decimalPlace
if (endIndex < str.length) {
str = str.substring(0, endIndex)
}
str += "\""
return str
}
}
As already mentioned, there are some string manipulations required. I created the following helper class, which converts the location to DMS format and allows to specify the decimal places for the seconds:
import android.location.Location;
import android.support.annotation.NonNull;
public class LocationConverter {
public static String getLatitudeAsDMS(Location location, int decimalPlace){
String strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_SECONDS);
strLatitude = replaceDelimiters(strLatitude, decimalPlace);
strLatitude = strLatitude + " N";
return strLatitude;
}
public static String getLongitudeAsDMS(Location location, int decimalPlace){
String strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_SECONDS);
strLongitude = replaceDelimiters(strLongitude, decimalPlace);
strLongitude = strLongitude + " W";
return strLongitude;
}
@NonNull
private static String replaceDelimiters(String str, int decimalPlace) {
str = str.replaceFirst(":", "°");
str = str.replaceFirst(":", "'");
int pointIndex = str.indexOf(".");
int endIndex = pointIndex + 1 + decimalPlace;
if(endIndex < str.length()) {
str = str.substring(0, endIndex);
}
str = str + "\"";
return str;
}
}
to conver from decimals to degrees you can do as follow
String strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_DEGREES);
String strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_DEGREES);
reference is android developer site.
Edit
I have tried following thing and get the output:
strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_DEGREES);
strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_DEGREES);
OUTPUT : Long: 73.16584: Lat: 22.29924
strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_SECONDS);
strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_SECONDS);
OUTPUT : Long: 73:9:57.03876: Lat: 22:17:57.26472
strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_MINUTES);
strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_MINUTES);
OUTPUT : Long: 73:9.95065: Lat: 22:17.95441
Try different option as per your requirement
Should be some math:
(int)37.33168 => 37
37.33168 % 1 = 0.33168
0.33168 * 60 = 19.905 => 19
19.905 % 1 = 0.905
0.905 * 60 => 54
same with -122 (add 360 if negative value)
EDIT: May be there is some API, which I don't know.
Refer From: How to find degree from the latitude value in android?
Convert Latitude and Longitude Values (Degrees) to Double . Java