Преобразовать из десятичной в шестнадцатеричные степени - PullRequest
0 голосов
/ 17 апреля 2020

Мы выполняем следующее упражнение: Половая возрастная степень . Мы хотели бы преобразовать десятичный ввод, например,

lat: 48.858222
lon: 2.2945

в шестнадцатеричный результат как:

48° 51′ 30″ N, 2° 17′ 40″ E

Мы написали следующий код:

import java.util.*;
public class SexagesimalDegree {

  /**
   * Convert WGS84-Coordinates from decimal degrees in sexagesimal degrees
   * 
   * @param lat Latitute as Double
   * @param lon Longtitute as Double
   * @return String "%d° %d′ %d″ %s, %d° %d′ %d″ %s" (lat_degree, lat_minute, lat_second, lat_direction,
   *                                                  lon_degree, lon_minute, lon_second, lon_direction)
   * @throws Exception 
   */
  public static String convert /*???*/ (double lat, double lon) throws Exception {
    System.out.println("lat: "+lat);
    System.out.println("lon: "+lon);
    String[] latSplitted = String.valueOf(lat).split("\\.");
    String[] lonSplitted = String.valueOf(lon).split("\\.");
    System.out.println("latSplitted: "+Arrays.toString(latSplitted));
    System.out.println("lonSplitted: "+Arrays.toString(lonSplitted));
    String latHours = latSplitted[0];
    String lonHours = lonSplitted[0];
    System.out.println("latHours: "+latHours);
    System.out.println("lonHours: "+lonHours);

    double latMinutesNumber = Double.parseDouble(latSplitted[1])*60;
    double lonMinutesNumber = Double.parseDouble(lonSplitted[1])*60;
    System.out.println("latMinutesNumber: "+latMinutesNumber);
    System.out.println("lonMinutesNumber: "+lonMinutesNumber);


    String latMinutes = String.valueOf((int)(latMinutesNumber)).substring(0,2);
    String lonMinutes = String.valueOf((int)(lonMinutesNumber)).substring(0,2);
    System.out.println("latMinutes: "+latMinutes);
    System.out.println("lonMinutes: "+lonMinutes);

    String latDecimalPart = "0"+String.valueOf(latMinutesNumber).substring(String.valueOf(latMinutesNumber).indexOf("."));
    String lonDecimalPart = "0"+String.valueOf(lonMinutesNumber).substring(String.valueOf(lonMinutesNumber).indexOf("."));
    System.out.println("latDecimalPart: "+latDecimalPart);
    System.out.println("lonDecimalPart: "+lonDecimalPart);

    System.out.println("Double.parseDouble(latDecimalPart): "+Double.parseDouble(latDecimalPart));

    double remainingLatSeconds = Integer.parseInt(latMinutes)-Double.parseDouble(latDecimalPart);
    System.out.println("remainingLatSeconds: "+remainingLatSeconds);

    return "";
  }
}

Который выдает следующие результаты:

lat: 48.858222
lon: 2.2945
latSplitted: [48, 858222]
lonSplitted: [2, 2945]
latHours: 48
lonHours: 2
latMinutesNumber: 5.149332E7
lonMinutesNumber: 176700.0
latMinutes: 51
lonMinutes: 17
latDecimalPart: 0.149332E7
lonDecimalPart: 0.0
Double.parseDouble(latDecimalPart): 1493320.0
remainingLatSeconds: -1493269.0

Как вы могли заметить, мы можем получить часы и минуты, как и ожидалось. Однако часть загадки приходит, когда мы изо всех сил пытаемся получить секунды. Нам нужно получить из широты десятичную часть: 0,1493327E7, а из минут - ее десятичную часть: 0,6700.

Однако мы получаем 0,149332E7 для широты и 0,0 для долготы. Сомнение заключается в следующем: как мы можем получить оставшиеся десятичные числа и вычислить секунды?

Чтобы иметь возможность отладить его, мы прочитали:

https://www.thoughtco.com/decimal-degrees-conversion-1434592
https://stackoverflow.com/questions/36474338/converting-string-to-double-with-dotç
https://stackoverflow.com/questions/5769669/convert-string-to-double-in-java
https://stackoverflow.com/questions/27480633/converting-from-string-to-double?noredirect=1&lq=1

Подводя итог, как мы можем рассчитать остальные десятичные дроби после расчета минут, чтобы можно было получить секунды?

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

То, как вы рассчитали минуты и секунды, излишне сложно. Вы можете сделать это проще следующим образом:

public class Main {
    public static void main(String[] args) {
        String latMinutesStr = "858222";// latSplitted[1]
        double latMinutesFraction = Double.parseDouble("0." + latMinutesStr) * 60;
        int latMinutes = (int) latMinutesFraction;
        System.out.println(latMinutes + " minutes");
        double latSeconds = (latMinutesFraction - latMinutes) * 60;
        System.out.println(String.format("%.2f", latSeconds) + " seconds");
    }
}

Вывод:

51 minutes
29.60 seconds

Фактически весь расчет можно сделать намного проще, как показано ниже:

public class Main {
    public static void main(String[] args) {
        String lat = "48.858222";
        double degrees = Double.parseDouble(lat);
        double minutes = (degrees - (int) degrees) * 60;
        double seconds = (minutes - (int) minutes) * 60;
        System.out.println((int) degrees + " degrees " + (int) minutes + " minutes " + String.format("%.2f", seconds)
                + " seconds");
    }
}

Вывод:

48 degrees 51 minutes 29.60 seconds
0 голосов
/ 17 апреля 2020

Чтобы выполнить преобразование, вы просто получаете последовательно 60.

  • Предоставляются следующие значения: lat: 48.858222 lon: 2.2945

  • Часы - это просто целочисленное значение значения или 48

  • Минуты являются дробной частью * 60. Это работает, поскольку вы берете соответствующую дробную часть 60.

    • .858222 * 60 = 51,49332, округленное до целого или преобразованное в целое число или 51.
  • Секунды являются дробной частью минут * 60 + .5 к округлению.

    • .49332 * 60 = 29.59968 +.5 округляется в большую сторону и преобразуется в целое число или 30

В Java удобно использовать оператор%, чтобы получить остаток или дробную часть типа double или float. Просто используйте 1 в качестве модуля.

Соберите все вместе в лямбду, которая принимает двойное число и возвращает в виде полученной строки.

    static Function<Double, String> HrsMinsSecs = (f) -> f.intValue()
            + " Degrees " + ((int) ((f % 1) * 60)) + " Minutes "
            + ((int) ((((f % 1) * 60) % 1) * 60 + .5)) + " Seconds";

    public static void main(String[] args) {

        double lat = 48.858222;
        double lon = 2.2945;
        System.out.println("Latitude:  " + HrsMinsSecs.apply(lat));
        System.out.println("Longitude: " + HrsMinsSecs.apply(lon));     
    }

Это печатает

Latitude:  48 Degrees 51 Minutes 30 Seconds
Longitude: 2 Degrees 17 Minutes 40 Seconds

0 голосов
/ 17 апреля 2020

Вместо того, чтобы иметь дело со строками, сначала преобразуйте количество градусов в целое число секунд.

double latDegrees = 48.858222;
int latSeconds = (int) Math.round(latDegrees * 60 * 60); // = 175890

Теперь вы можете выделять отдельные части с помощью простой целочисленной арифметики c.

int seconds = latSeconds % 60; // = 30
int minutes = (latSeconds / 60) % 60; // = 51
int degrees = (latSeconds / 60) / 60; // = 48

Вот альтернативный подход, который может быть легче понять, если вы не знакомы с оператором по модулю %:

double latDegreesWithFraction = 48.858222;
int degrees = (int) latDegreesWithFraction; // = 48

double fractionalDegrees = latDegrees - degrees; // = .858222
double minutesWithFraction = 60 * fractionalDegrees; // = 51.49332
int minutes = (int) minutesWithFraction; // = 51

double fractionalMinutes = minutesWithFraction - minutes; // = .49332
double secondsWithFraction = 60 * fractionalMinutes; // = 29.6
int seconds = (int) Math.round(secondsWithFraction); // = 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...