Поиск и упорядочение широты и долготы в SQL - PullRequest
1 голос
/ 16 июля 2010

У меня есть база данных SQL, где я храню долготу и широту из приложения iPhone. Мне нужно запросить все записи, начиная с данного местоположения в другое самое дальнее местоположение.

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

Надеюсь, вы поняли, и я жду ответа.

Ответы [ 5 ]

2 голосов
/ 16 июля 2010

Расстояние с широтой и долготой не является простым вычислением, а требует сферической тригонометрии.

acos(cos(lat1)*cos(lon1)*cos(lat2)*cos(lon2) + 
     cos(lat1)*sin(lon1)*cos(lat2)*sin(lon2) + 
     sin(lat1)*sin(lat2)) * R(adius of the earth)

Так что этот запрос

select locID, locName, locDesc, lat, lon, locDiffMeters   
from (select locID, locName, locDesc, lat, lon, 
             acos(cos($lat)*cos($lon)*cos(lat)*cos(lon) + 
                  cos($lat)*sin($lon)*cos(lat)*sin(lon) + 
                  sin($lat)*sin(lat) ) * 6,371,000 -- earths radius in meters
               as locDiffMeters
      from locationTable    
    where locID <> $ID    
) a    
order by locDiffMeters    

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

1 голос
/ 16 июля 2010

Аналогично Фоско, но с использованием теоремы Пифагора:

select locID, locName, locDesc, lat, lon, locDiff from
(select locID, locName, locDesc, lat, lon, 
 sqrt((lat - $LAT)*(lat - $LAT) + (lon - $LON)*(lon - $LON)) as locDiff
 from locationTable
 where locID <> $ID) a
order by locDiff

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

0 голосов
/ 16 июля 2010

Если вы используете Postgresql, добавьте расширение PostGIS и проверьте ST_Distance_Sphere

ST_Distance_Sphere - возвращает минимальное расстояние в метрах между двумя lon/ лат геометрии.Использует сферическую землю и радиус 6370986 метров.Быстрее, чем ST_Distance_Spheroid, но менее точно.Версии PostGIS до 1.5 реализованы только для баллов.

SELECT round(CAST(ST_Distance_Sphere(ST_Centroid(the_geom), ST_GeomFromText('POINT(-118 38)',4326)) As numeric),2) As dist_meter ...
0 голосов
/ 16 июля 2010

Если вам не нужно иметь дело с большими расстояниями (см. Ответ Адама), вы можете рассмотреть возможность использования геометрических типов PostgreSQL и связанных с ними функций .

0 голосов
/ 16 июля 2010

Предполагая, что вы запросили начальное местоположение lat / lon и ID местоположения ... Я использую $ LAT, $ LON и $ ID в качестве заполнителей:

select locID, locName, locDesc, lat, lon, locDiff
from (
    select locID, locName, locDesc, lat, lon, ABS(lat - $LAT) + ABS(lon - $LON) as locDiff
      from locationTable
    where locID <> $ID
) a
order by locDiff

Надеюсь, это поможет ..Возможно, не самый оптимизированный метод, но он должен быть довольно близок.

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