Похоже, вы создаете сайт Ridehare. :)
Суть в том, что для сортировки результата запроса по расстоянию на поверхности вам потребуется пространственная индексация, встроенная в ядро базы данных. Я думаю, что ваши варианты здесь MySQL с расширениями OpenGIS (уже упоминалось) или PostgreSQL с PostGIS . Похоже, это возможно и в ravenDB: http://ravendb.net/documentation/indexes/sptial
Но если это не вариант, есть несколько других способов. Давайте упростим задачу и скажем, что вы просто хотите отсортировать записи базы данных по их расстоянию до местоположения A, поскольку вы просто делаете это дважды и суммируете результат.
Самое простое решение - вытащить каждую запись из базы данных и вычислить расстояние до местоположения A один за другим, а затем отсортировать в коде. Проблема в том, что вы заканчиваете тем, что выполняете много избыточных вычислений и опускаете всю таблицу для каждого запроса.
Давайте еще раз упростим и представим, что нам небезразлично Чебышевское (максимальное) расстояние . Это будет работать для сужения нашей области видимости в БД, прежде чем мы получим более точную информацию. Мы можем сделать «бинарный поиск» для близлежащих записей. Мы должны определить приблизительное количество ближайших записей для возврата; скажем 10 . Затем мы запрашиваем внутри квадратной области, скажем, 1 градус широты на 1 градус долготы (это около 60x60 миль) вокруг интересующего места. Скажем, наше местоположение интереса - широта, lng = 43,5,86,5. Тогда наш запрос БД - ВЫБЕРИТЕ СЧЕТЧИК (*) ОТ МЕСТА, ГДЕ (ШТ> 43 И ШТ <44) И (ЛГ> 86 И ЛГ <87) Если у вас есть индексы в полях lat / lng, это должен быть быстрый запрос. </p>
Наша цель - получить чуть более 10 суммарных результатов внутри коробки. Здесь начинается «бинарный поиск». Если мы получили только 5 результатов, мы удваиваем область окна и снова ищем. Если мы получили 100 результатов, мы разрезаем площадь пополам и снова ищем. Если сразу после этого мы получим 3 результата, мы увеличим площадь бокса на 50% (вместо 100%) и попробуем снова, продолжая, пока не подойдем достаточно близко к нашей цели 10 результатов.
Наконец, мы берем этот управляемый набор записей и вычисляем их евклидово расстояние от интересующего местоположения и сортируем по коду.
Удачи!