Как я могу преобразовать точку GPS из DDD MM.MMM (строка) в десятичное (широта и долгота)?

Мне нужно преобразовать точку GPS из DDD MM.MMM (строка) в десятичное (два значения: широта и долгота) с помощью Java.

Например, у меня есть строка:

String a = "N 39° 28.941 W 0° 23.275"

Мне нужно преобразовать эту строку в эти два значения:

double lat= 39.48235
double lon= -0.38792

Как я могу сделать это с помощью кода Java?


person NullPointerException    schedule 17.09.2011    source источник
comment
см. en.wikipedia.org/wiki/   -  person    schedule 17.09.2011


Ответы (1)


Разберите строку для этих шести значений:

  • N или S для определения знака широты (плюс или минус)
  • Градусы (39 - часть перед точкой)
  • Двойное значение (28.941 - часть после точки)

... то же самое для долготы

Быстрый взлом для этого:

public class CoordTest {

    private static String  coords = "N 39° 28.941 W 0° 23.275";

    public static void main(String[] args) {
        String[] cArray = coords.split(" ");
        String latSign = cArray[0];
        String latDegrees = cArray[1].substring(0, cArray[1].length()-1);
        String latSubdegrees = cArray[2];
        String lonSign = cArray[3];
        String lonDegrees = cArray[4].substring(0, cArray[4].length()-1);
        String lonSubdegrees = cArray[5];
        double lat = getSign(latSign) * (Integer.valueOf(latDegrees) + convertFromDegreesToDecimal(Double.valueOf(latSubdegrees)));
        double lon = getSign(lonSign) * (Integer.valueOf(lonDegrees) + convertFromDegreesToDecimal(Double.valueOf(lonSubdegrees)));
    }


    private static int getSign(String c){
        if (c.equals("N") || c.equals("E")){
            return 1;
        }
        return -1;
    }

    private static double convertFromDegreesToDecimal(Double value){
        double result = value/60d;
        return result;
    }
}
person Christopher    schedule 17.09.2011
comment
Привет, приятель, функция convertFromDegreesToDecimal никогда не используется, для чего она мне нужна? - person NullPointerException; 17.09.2011
comment
Строка double lat = getSign(latSign) * (Integer.valueOf(latDegrees) + convertFromDegreesToDecimal(Double.valueOf(latSubdegrees))); использует эту функцию. Я только что заметил, что вы упомянули вики-страницу, и рад, что я сделал правильные вещи в своем коде. Но когда вы прочтете эту страницу, должно стать очевидным, почему эта функция действительно необходима. - person Christopher; 17.09.2011