2010-08-09 3 views
0

У меня есть база данных postgres 8.3 отелей, каждая из которых имеет соответствующую долготу и широту, хранящиеся в виде точки, и курорт, который хранится как идентификатор курорта. Я хотел бы найти центральную или среднюю точку курорта.Найти центр координат в PostgreSQL

я могу сделать это с помощью простого запроса:

select 
avg(lat_long[0]) as latitude, 
avg(lat_long[1]) as longitude, 
resort_id 
from accomm 
group by resort_id 

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

Как рассчитать межквартильное среднее или аналогичный метод для фильтрации этих плохих данных? У меня в настоящее время около 30 000 строк в моей таблице.

ответ

1

Все ваши отели в Соединенных Штатах? Мне кажется, что было бы проще создать ограничительную рамку и просто игнорировать любые лат/длинные комбо, которые находятся за пределами этого диапазона.

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

+0

Отели по всему миру. У нас есть что-то вроде 2000 курортов, и каждому из них понадобятся собственные ограничивающие коробки. Мы можем расширить нашу процедуру импорта с помощью функции ограничивающего прямоугольника (т. Е. Когда он увидит новый отель, проверьте, что его координаты похожи на существующие отели на том же курорте). Самые большие проблемы, которые я вижу с этим, это не помогает нашим существующим данным (хотя мы можем это исправить), и для новых курортов есть проблема с курицей и яйцом - первый добавленный отель может оказаться не самым подходящим, а затем мы 'd потерять данные о местоположении для всех других отелей в этом курорте! – thelem

+0

У вас есть адресная информация для каждого отеля? У меня была аналогичная проблема, когда-то, и я смог ее исправить, запустив только один раз сценарий, который передавал каждый адрес в сопоставление api (google, yahoo, microsoft, что угодно), а затем обновлял long longs, если они были слишком далеко выкл. Это поможет вашим существующим данным. Идея ограничивающей коробки не кажется реалистичной, если все ваши местоположения не были в одной стране, поэтому это может быть лучшим способом ... –

+0

Лучшее решение, которое я придумал на этом, запускает его как двухпроходный скрипт : Пасс 1 - Получите среднее значение лат/долго для всех отелей на курорте, возможно, также стандартное отклонение (курорт может быть городом или континентом!) Перевал 2 - пересчитать лат/долго на основе среднего для всех отелей в пределах определенного радиус лата/длинный от прохода 1. – thelem

0

Я бы рекомендовал разделить вашу карту в сетке квадратов разумного размера (например, google на картах Google, вам нужно увеличить уровень около 7-9, я думаю) и вычислить позицию сетки для каждой точки (вы получите простое целое число X и Y). Вы можете получить количество очков в каждом квадрате и игнорировать квадраты с 1-2 очками. Или вы можете использовать центр квадрата с большинством точек в качестве тестового центра и рассчитать расстояние до каждой точки в группе (это будет очень быстро в координатах XY сетки), игнорируя точки, которые не находятся на разумном расстоянии от него.

Смежные вопросы