How to format GPS latitude and longitude?

后端 未结 7 820
囚心锁ツ
囚心锁ツ 2021-01-04 07:48

In android(java) when you get the current latitude and longitude using the function getlatitude() etc you get the coordinates in decimal format:

latit

相关标签:
7条回答
  • 2021-01-04 08:16

    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
        }
    }
    
    0 讨论(0)
  • 2021-01-04 08:18

    Use This

    public static String getFormattedLocationInDegree(double latitude, double longitude) {
    try {
        int latSeconds = (int) Math.round(latitude * 3600);
        int latDegrees = latSeconds / 3600;
        latSeconds = Math.abs(latSeconds % 3600);
        int latMinutes = latSeconds / 60;
        latSeconds %= 60;
    
        int longSeconds = (int) Math.round(longitude * 3600);
        int longDegrees = longSeconds / 3600;
        longSeconds = Math.abs(longSeconds % 3600);
        int longMinutes = longSeconds / 60;
        longSeconds %= 60;
        String latDegree = latDegrees >= 0 ? "N" : "S";
        String lonDegrees = longDegrees >= 0 ? "E" : "W";
    
        return  Math.abs(latDegrees) + "°" + latMinutes + "'" + latSeconds
                + "\"" + latDegree +" "+ Math.abs(longDegrees) + "°" + longMinutes
                + "'" + longSeconds + "\"" + lonDegrees;
    } catch (Exception e) {
        return ""+ String.format("%8.5f", latitude) + "  "
                + String.format("%8.5f", longitude) ;
    }
    

    }

    0 讨论(0)
  • 2021-01-04 08:20

    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

    0 讨论(0)
  • 2021-01-04 08:28

    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

    0 讨论(0)
  • 2021-01-04 08:30

    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;
        }
    }
    
    0 讨论(0)
  • 2021-01-04 08:30

    I wanted something similar and after studying answers here and Wikipedia, found there is a standard for formatting coordinates, ISO 6709#Annex D which describes the desired text representation for coordinates, considering that and wanting to have a portable and compact implementation in Kotlin, I ended with this code hopefully would be useful for others,

    import kotlin.math.abs
    import java.util.Locale
    
    // https://en.wikipedia.org/wiki/ISO_6709#Representation_at_the_human_interface_(Annex_D)
    fun formatCoordinateISO6709(lat: Double, long: Double, alt: Double? = null) = listOf(
        abs(lat) to if (lat >= 0) "N" else "S", abs(long) to if (long >= 0) "E" else "W"
    ).joinToString(" ") {
        val degrees = it.first.toInt()
        val minutes = ((it.first - degrees) * 60).toInt()
        val seconds = ((it.first - degrees) * 3600 % 60).toInt()
        "%d°%02d′%02d″%s".format(Locale.US, degrees, minutes, seconds, it.second)
    } + (alt?.let { " %s%.1fm".format(Locale.US, if (alt < 0) "−" else "", abs(alt)) } ?: "")
    
    0 讨论(0)
提交回复
热议问题