Поиск с расстоянием

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
21
задан Peter O. 16 November 2012 в 10:18
поделиться

3 ответа

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

Определяют сетку мусорных ведер приблизительно 20 миль на стороне. Снабдите число мусорного ведра записью каждого хранилища. Во время поиска вычислите числа всех мусорных ведер, которые пересекают 20-мильный радиус от Вашей поисковой точки. Тогда получите все хранилища в любом из тех мусорных ведер и продолжите двигаться как прежде.

9
ответ дан 29 November 2019 в 21:47
поделиться

Мы используем это, чтобы сделать много тысяч точек. Важно при выполнении этого в SQL, чтобы иметь индекс на столбце Latitude и Longitude. Мы пытались делать это в SQL 2008 с пространственными индексами, но мы действительно не видели, что производительность увеличилась, мы ожидали. Хотя, если Вы хотите вычислить на определенном расстоянии от ZIP, необходимо думать о том, если Вы собираетесь использовать центроид ZIP или представление полигона почтового индекса.

Haversine forumla является хорошим местом для запуска.

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

SELECT
        [DistanceRadius]=
        69.09 *
        DEGREES(
          ACOS(
            SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
           +
            COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
           *
            COS( RADIANS(longitude - (@ziplon)) )
          )
        )
        ,*
        FROM
            table

    ) sub
WHERE
    sub.DistanceRadius < @radius
12
ответ дан 29 November 2019 в 21:47
поделиться

Мы делаем это приблизительно для 1 200 мест. Я просто использовал бы формулу Haversine на лету, хотя в зависимости от Вас приложение, могло бы быть лучше сохранить его в PHP вместо SQL. (Наша реализация находится в .NET, таким образом, Ваш milage может варьироваться).

Действительно наш самый большой недостаток со способом, которым мы реализовали его, то, что каждое вычисление (до недавнего времени) должно было быть вычислено на уровень данных, который был крайне медленным (когда я говорю медленный, я действительно имею в виду немгновенный, потребовалась приблизительно секунда), но это было то, вследствие того, что он должен был вычислить расстояние для всех 1 200 мест на основе предоставленного почтового индекса.

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

Мы на самом деле посмотрели на хранение всех возможных комбинаций в нашей базе данных. В действительности это кажется, что могло быть большое хранилище данных, но это находится действительно не в большом объеме вещей. С индексами это может быть довольно быстро, и Вы не должны волноваться об оптимизации алгоритма и т.д. Мы отклонили его, потому что у нас было уравнение в C#, и это позволило нам кэшировать информацию, необходимую, чтобы сделать все вычисления в бизнес-уровне. Любой будет работать просто великолепно, это - просто вопрос того, каково Ваше предпочтение.

2
ответ дан 29 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: