найти ближайший пункт Gps к местоположению пользователя из списка - PullRequest
6 голосов
/ 21 октября 2010

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

Я провел небольшое исследование, и вот что я нашел:

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

но это предназначено для использования его с mySql и некоторым расширением пространственного поиска.Есть ли возможность, я могу сделать что-то подобное, используя Android API или внешние библиотеки?

public Point dialogFindClosestLocationToPoint(geometry.Point aStartPoint){
List<PointWithDistance> helperList=new ArrayList<PointWithDistance>();
try {
openDataBase();
Cursor c=getCursorQueryWithAllTheData();
if(c.moveToFirst())
 do{
  PointWithDistance helper=new PointWithDistance(c.getDouble(1),c.getDouble(2),c.getString(3));
  int distance=returnDistanceBetween2Points(aStartPoint, helper);
  if(distance<MAX_SEARCH_DISTANCE){
   helper.setDistance(distance);
   Log.i("values", helper.name);
   helperList.add(helper);
  }
 }while (c.moveToNext());
Collections.sort(helperList,new PointComparator());

if(helperList!=null)
 return helperList.get(0);
else return null;
}catch(SQLException sqle){

throw sqle;

}
finally{
 close();
}

это код в классе PointComparator ():

   public int compare(PointWithDistance o1, PointWithDistance o2) {
  return (o1.getDistance()<o2.getDistance() ? -1 : (o1.getDistance()==o2.getDistance() ? 0 : 1));
 }

где PointWithDistanceобъект, который содержит: широта, длинна, расстояние, имя

, однако это решение не обеспечивает правильную возвращаемую информацию ... и я понимаю, что оно вообще не масштабируется и очень медленно.Мне нужно решение, которое будет работать быстро с базой данных, содержащей не более 1000 строк.

edit: моя ошибка в этом коде при сортировке, теперь я изменил ее (должно быть <вместо>)

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Подобные вещи выполняются наиболее эффективно с использованием R-Tree . Библиотека JSI предоставляет реализацию Java, которую я успешно использовал, с индексом 80 000 местоположений, обрабатывающим тысячи поисков в секунду. Тем не менее, он может не работать на Android.

2 голосов
/ 21 октября 2010

Некоторое время назад я искал что-то очень похожее:

SQL-сортировка Android по вычисляемому столбцу (расстояние по координатам)

Я использовал поиск MySQLна моем сервере MySQL позволяет вам создать виртуальный столбец, выполнить расчет и сортировку по расстоянию, а затем вы можете установить максимальное возвращаемое значение или максимальное расстояние - это работает очень хорошо:

Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC

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

1 голос
/ 21 октября 2010

Я не пробовал запускать ваш код, но похоже, что он будет работать, просто он неэффективен.как будто вам на самом деле не нужно сортировать, вам нужно извлечь минимум.

вы можете ограничить свой запрос только квадратом размером (2 * MAX_SEARCH_DISTANCE) ^ 2 (с точкой в ​​серединеТаким образом, вы локализуете свой запрос, и это даст вам меньше результатов для вычисления расстояния. Конечно, это не поможет, если все ваши местоположения находятся в локализованном квадрате (возможно, маловероятно?).

Кроме того, япредположим, что вы можете использовать гамильтоново расстояние вместо евклидового.

...