Вопрос

Я пытаюсь выяснить, знает ли кто-нибудь, как кластеризовать некоторые результаты Lat / Long с использованием базы данных, чтобы уменьшить количество результатов, отправляемых по проводам в приложение.

Существует множество ресурсов о том, как кластеризовать, либо на стороне клиента, либо на стороне сервера (приложения) ... но не на стороне базы данных: (

Это похожий вопрос , заданный коллегой С.О. член. Решения основаны на стороне сервера (т.е. код C # позади).

Кто-нибудь имел удачу или опыт решения этой проблемы, но в базе данных? Есть ли какие-нибудь гуру баз данных, которые после агрессивного и сексуального вызова БД?

, пожалуйста, помогите:)

РЕДАКТИРОВАТЬ 1: Уточнение - путем кластеризации я надеюсь сгруппировать x количество точек в одну точку для области. Итак, если я скажу кластеризовать все в квадрате 1 миля / 1 км, то все результаты в этом «квадрате» будут GROUP'D в один результат (скажем ... в середине квадрата).

РЕДАКТИРОВАТЬ 2: Я использую MS Sql 2008, но я открыт, чтобы узнать, есть ли другие решения в других БД.

Это было полезно?

Решение

Я бы, вероятно, использовал измененную * версию k -средств кластеризация с использованием декартовых (например, WGS-84 ECF) координат для ваших точек. Это легко реализовать & amp; быстро сходится и адаптируется к вашим данным, независимо от того, как они выглядят. Кроме того, вы можете выбрать k в соответствии с вашими требованиями к пропускной способности, и у каждого кластера будет одинаковое количество связанных точек (mod k).

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

* «Модификация» будет регулировать длину вычисленных векторов центроидов так, чтобы они были на поверхности земли. В противном случае вы получите кучу точек с отрицательной высотой (при конвертации обратно в LLH).

Другие советы

Если вы кластеризуетесь по географическому расположению, и я не могу представить, что это что-то еще :-), вы можете сохранить " идентификатор кластера " в базе данных вместе с координатами широты и долготы.

Под этим я подразумеваю разделение карты мира на (например) матрицу 100x100 (10 000 кластеров), и каждая координата присваивается одному из этих кластеров.

Затем вы можете обнаружить очень близкие координаты, выбрав их в одном и том же квадрате, и умеренно близкие, выбрав их в соседних квадратах.

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

Yo всегда будет иметь граничные случаи, такие как две точки близко друг к другу, но в разных кластерах (один северный в своем кластере, другой самый южный в своем), но вы можете настроить размер кластера ИЛИ после обработать результаты на стороне клиента.

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

def compute_chunk(latitude, longitude)
  (floor_lon(longitude) * 0x1000) | floor_lat(latitude)
end

def floor_lon(longitude)
  ((longitude + 180) * 10).to_i
end

def floor_lat(latitude)
  ((latitude + 90) * 10).to_i
end

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

Для movielandmarks.com я использовал код кластеризации с Майк Пурвис , один из авторов Запуск приложений Google Maps с PHP и AJAX . Он строит деревья кластеров / точек для разных уровней масштабирования, используя PHP и MySQL, сохраняя их в базе данных, так что отзыв происходит очень быстро. Некоторые из них могут быть вам полезны, даже если вы используете другую базу данных.

Почему бы не протестировать несколько подходов?

<Ол>
  • переведите weka библиотеку .NET CLI с помощью IKVM.NET
  • добавить сборку, полученную из вашего кода и weka.dll (используйте ilmerge) в вашу базу данных
  • Сделайте несколько тестов. Никакая конкретная кластеризация не работает лучше, чем кто-либо другой.

    scroll top