MySQL: выбор мест с почти одинаковым местоположением (дубликаты) по широте / долготе - PullRequest
1 голос
/ 13 сентября 2011

Допустим, у меня есть таблица venues со следующими столбцами:

id
user_id
name
latitude
longitude

Широта и долгота сохраняются как значения FLOAT (10,6).Поскольку разные пользователи добавляют места, появляются дубликаты мест.Как я могу выбрать все дубликаты из таблицы в диапазоне, скажем, до 50 метров (что может быть трудно сделать, так как продольные метры в разных широтах разные, поэтому это абсолютно приблизительно)?Запрос должен выбрать все объекты: VenueA и VenueB (могут быть VenueC, VenueD и т. Д.), Чтобы я мог их сравнить.Он должен отфильтровывать места, которые фактически являются по одному на каждое место в диапазоне (мне нужны только дубликаты).

Ответы [ 3 ]

1 голос
/ 12 августа 2013

Я искал ответ, но должен был согласиться с ответом сам.Это мой первый вклад, пожалуйста, держись со мной; -)

SELECT s1.id, s1.name, s2.id, s2.name FROM venues s1, venues s2
WHERE s2.id > s1.id AND 
(POW(s1.latitude - s2.latitude, 2) + POW(s1.longitude - s2.longitude, 2) < 0.001)

Первое условие - выбрать только половину матрицы, так как порядок подобных мест не важен.Второй - это упрощенный калькулятор расстояний.Как предложил пользователь 185631, формула haversine должна сработать, если вам нужна большая точность, но она мне не нужна, так как я искал дубликаты с теми же координатами, но не смог рассчитаться с s1.latitude = s2.latitude AND s1.longitude = s2.longitude из-за повреждения с плавающей запятой / десятичного числа в моей БД.

Конечно, проверка этого при вставке была бы лучше, но если вы получили поврежденную БД, вам нужно как-то ее очистить.Также обратите внимание, что этот запрос слишком тяжел на сервере, если ваши таблицы большие.

0 голосов
/ 13 сентября 2011

Создать функцию, которая вычисляет расстояния между широтами и долями.Для небольшого / менее точного расстояния (как в данном случае) вы можете использовать равностороннее приближение (см. Раздел здесь: http://www.movable -type.co.uk / scripts / latlong.html ).Если расстояние меньше выбранного вами порогового значения (50 м), это дубликат.

0 голосов
/ 13 сентября 2011

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

SELECT id FROM venues WHERE latitude < (your max latitude) AND latitude > (your min latitude) AND longitude < (your max longitude) AND longitude > (your min longitude);

Преобразовать метры в широты / долготы очень сложно, так как это зависит от того, где находится начальная точка на земном шаре. Смотрите средний раздел страницы здесь: http://www.uwgb.edu/dutchs/usefuldata/utmformulas.htm

...