Уменьшить сложность. Найдите ближайшую пару широт и долгот

1

У меня есть два массива, представляющих два разных маршрута GPS. Каждый массив содержит широты в четных индексах (начиная с 0) и долготы в нечетных индексах, как показано ниже:

48.855002219371706,2.3472976684570312,48.855050000000006,2.34735,48.85508,2.3473200000000003,48.85584,2.3477300000000003,48.8562,2.3465000000000003,...

Я хотел бы рассчитать сумму расстояний между ближайшими точками этих двух путей. Я вычисляю расстояние между парами широт и долгот с использованием метода Хаверсина.

Это то, что я делаю: я ищу пару широт и долгот, которые находятся на минимальном расстоянии в текущих массивах. Затем я добавляю минимальное расстояние до переменной, суммирующей все минимальные расстояния. Затем я удаляю широты и долготы, обработанные из массивов.

Вот код:

public class Distance {

private String filename1;
private String filename2;

public Distance(String filename1, String filename2) {
    this.filename1 = filename1;
    this.filename2 = filename2;
}

public double distance() {
    if(this.filename1.equals(this.filename2))
        return 0;
    double distance = 0;
    BufferedReader br1 = null;
    BufferedReader br2 = null;
    try {
        br1 = new BufferedReader(new FileReader("files/" + this.filename1));
        br2 = new BufferedReader(new FileReader("files/" + this.filename2));
        String []data1 = br1.readLine().split(",");
        String []data2 = br2.readLine().split(",");
        System.out.println("Number of points in " + this.filename1 + " = " + data1.length/2);
        System.out.println("Number of points in " + this.filename2 + " = " + data2.length/2);

        while((isPresent(data1)) && (isPresent(data2))) {
            int posi = -1;
            int posj = -1;
            double minD = Double.MAX_VALUE;

            for(int i = 0; i < data1.length; i+=2) {
                if(!data1[i].equals("-9999")) {
                    double lat1 = Double.parseDouble(data1[i]);
                    double lon1 = Double.parseDouble(data1[i+1]);

                for(int j = 0; j < data2.length; j+=2) {
                    if(!data2[j].equals("-9999")) {
                        double lat2 = Double.parseDouble(data2[j]);
                        double lon2 = Double.parseDouble(data2[j+1]);
                        double d = getDistance(lat1, lon1, lat2, lon2);
                        if(minD > d) {

                            minD = d;
                            posi = i;
                            posj = j;
                        }
                    }
                }
              }
            }
            if(posi != -1){
            data1[posi] = data1[posi+1] = data2[posj] = data2[posj+1] = "-9999";
            distance += minD;
            }
        }
    } catch (FileNotFoundException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    } finally {
        if(br1 != null) {
            try {
                br1.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }
        if(br2 != null) {
            try {
                br2.close();
            } catch (IOException e) {

                e.printStackTrace();
            }
        }
    }
    return distance;
}

private boolean isPresent(String arr[]) {

    for(int i = 0; i < arr.length; i+=2) {
        if(!arr[i].equals("-9999"))
            return true;
    }
    return false;
}

private double getDistance(double lat1, double lon1, double lat2,
        double lon2) {

    double R = 6378.1; // Radius of the earth in km
      double dLat = deg2rad(lat2-lat1);  // deg2rad below
      double dLon = deg2rad(lon2-lon1); 
      double a = 
        Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * 
        Math.sin(dLon/2) * Math.sin(dLon/2)
        ; 
      double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      double d = R * c; // Distance in km
      return d*1000;
}

private double deg2rad(double d) {

    return d * (Math.PI/180);
 }
}

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

NB Я видел самую близкую пару проблем, но не знаю, как я могу реализовать ее с широтами и долготами для сравнения точек между двумя разными массивами.

Теги:
arrays
latitude-longitude
gps

1 ответ

0

Надеюсь, это поможет

input: файлы с данными широты и долготы
из первого файла

  • сортировать все значения на основе широты и хранить их в массиве

  • сортировать все значения на основе долготы и хранить их во втором массиве


Размер входных данных массивов равен n и m
Теперь выберите точку из второго массива и найдите ближайшую точку, используя это видео.
Повторите это для всех точек и напечатайте минимум

Сортировка каждого массива O (nlogn) * 2 = O (nlogn) Поиск ближайшей точки будет не более O (2m)

Поскольку длина массива известна. Используйте массив большого размера и используйте его для операций массива размером n.



Если один из файлов исправлен, то это можно повторно использовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню