添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
侠义非凡的剪刀  ·  java - Graal.js ...·  1 年前    · 
一直单身的饭卡  ·  python - ...·  1 年前    · 

如何格式化GPS的经纬度?

16 人关注

在android(java)中,当你使用函数getlatitude()等获得当前的纬度和经度时,你会得到十进制格式的坐标。

纬度:24.3454523 经度:10.123450

我想把它变成度数和十进制分钟,看起来像这样。

纬度:北纬40°42′51″,经度:西经74°00′21″。

android
gps
formatting
coordinates
user3182266
user3182266
发布于 2014-01-27
8 个回答
dinesh sharma
dinesh sharma
发布于 2021-06-23
已采纳
0 人赞同

从小数到度数的转换,你可以按以下方法进行

String strLongitude = Location.convert(location.getLongitude(), Location.FORMAT_DEGREES);
String strLatitude = Location.convert(location.getLatitude(), Location.FORMAT_DEGREES);

reference is 安卓开发者网站.

我已经尝试了以下的事情,并得到了输出。

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

根据你的要求,尝试不同的选项

这对我来说是有效的,但我不得不做大量的子串处理,以使格式变成N S E W格式......。
mshoaiblibra
mshoaiblibra
发布于 2021-06-23
0 人赞同

应该是一些数学题。

(int)37.33168                => 37
37.33168 % 1 = 0.33168
0.33168 * 60 = 19.905        => 19
19.905 % 1 = 0.905    
0.905 * 60                   => 54

与-122相同(如果是负值则加360)。

EDIT:可能有一些API,我不知道。

Refer From: 如何从安卓系统的纬度值中找到度数?

将纬度和经度值(度)转换成双数。爪哇

Michael Colville
Michael Colville
发布于 2021-06-23
0 人赞同

这里有一个Kotlin版本,改编自Martin Weber的答案。它还设置了正确的半球;N、S、W或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
    
Martin
Martin
发布于 2021-06-23
0 人赞同

如前所述,需要进行一些字符串操作。我创建了以下的辅助类,它可以将位置转换为DMS格式,并允许指定秒的小数位。

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;
    
abi
abi
发布于 2021-06-23
0 人赞同

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) ;
    
Ebrahim Byagowi
Ebrahim Byagowi
发布于 2021-06-23
0 人赞同

我想要类似的东西,在研究了这里的答案和维基百科后,发现有一个格式化坐标的标准。 ISO 6709#Annex D 其中描述了所需的坐标文本表示法,考虑到这一点,并希望在Kotlin中有一个可移植的、紧凑的实现,我最后写了这段代码,希望能对其他人有用。

import kotlin.math.abs
import java.util.Locale
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(" ") { (degree: Double, direction: String) ->
    val minutes = ((degree - degree.toInt()) * 60).toInt()
    val seconds = ((degree - degree.toInt()) * 3600 % 60).toInt()
    "%d°%02d′%02d″%s".format(Locale.US, degree.toInt(), minutes, seconds, direction)
} + (alt?.let { " %s%.1fm".format(Locale.US, if (alt < 0) "−" else "", abs(alt)) } ?: "")
    
AlexWien
AlexWien
发布于 2021-06-23
0 人赞同

你有一个十进制度数的坐标,这种表示格式被称为 "DEG"

而你要的是DEG转DMS(度、分、秒)(如40°42′51″N)。
conversion.

这个java代码的实现在 http://en.wikipedia.org/wiki/Geographic_coordinate_conversion

if the DEG coordinate values is < 0, it is West for longitude or South for latitude.

在问题被改进为想要转换为DMS格式后,更新了我的答案。
Nikit Dungrani
Nikit Dungrani
发布于 2021-06-23
0 人赞同

使用此方法,并将坐标传递给该方法

 private String convertDegMinsSecs(double latitude, double longitude) {
    StringBuilder builder = new StringBuilder();
    String latitudeDegrees = Location.convert(Math.abs(latitude), Location.FORMAT_SECONDS);
    String[] latitudeSplit = latitudeDegrees.split(":");
    builder.append(latitudeSplit[0]);
    builder.append("°");
    builder.append(latitudeSplit[1]);
    builder.append("'");
    builder.append(latitudeSplit[2]);
    builder.append("\"");
    if (latitude < 0) {
        builder.append("S ");
    } else {
        builder.append("N ");
    builder.append("  ");
    String longitudeDegrees = Location.convert(Math.abs(longitude), Location.FORMAT_SECONDS);
    String[] longitudeSplit = longitudeDegrees.split(":");
    builder.append(longitudeSplit[0]);
    builder.append("°");
    builder.append(longitudeSplit[1]);
    builder.append("'");
    builder.append(longitudeSplit[2]);
    builder.append("\"");
    if (longitude < 0) {
        builder.append("W ");
    } else {
        builder.append("E ");