Кластеризация Lat/Longs в Базе данных

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

Исходя из структуры данных, у вас есть следующие варианты:

  1. Сортировка таблицы поиска по размеру компании, с размером в порядке убывания. После этого это простое представление, поскольку ваши крупные компании сегрегированы из маленьких.

  2. Создайте новый ключ, состоящий из размера компании, т.е. CONCAT (компания, размер), и выполните vlookup на основе этого ключа.

12
задан Community 23 May 2017 в 11:51
поделиться

6 ответов

Я, вероятно, использовал бы измененный* версия кластеризации k-средств с помощью последователя Декарта (например, WGS-84 ECF) координаты для точек. Это легко реализовать и сходится быстро и адаптирует к Вашим данным на независимо от того, что это похоже. Плюс, можно выбрать k для удовлетворения требованиям пропускной способности, и каждый кластер будет иметь то же число связанных очков (модификация k).

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

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

12
ответ дан 2 December 2019 в 06:27
поделиться

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

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

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

4
ответ дан 2 December 2019 в 06:27
поделиться

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

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

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

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

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

5
ответ дан 2 December 2019 в 06:27
поделиться

Для movielandmarks.com я использовал кластеризирующийся код от Mike Purvis, одного из авторов Начала Приложений Google Maps с PHP и Ajax. Это создает деревья кластеров/точек для различных уровней масштабирования с помощью PHP и MySQL, храня его в базе данных так, чтобы отзыв был очень быстр. Часть его может быть полезна для Вас даже при использовании другой базы данных.

2
ответ дан 2 December 2019 в 06:27
поделиться

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

0
ответ дан 2 December 2019 в 06:27
поделиться

Почему Не тестируя несколько подходов?

  1. Перевод из библиотеки Weka в .NET CLI с IKVM.Net
  2. Добавить сборку в результате вашего кода и Weka.dll (используйте ilmerge) в вашу базу данных

Сделайте некоторые тесты, то есть. Никакой конкретной кластеризации не работает лучше, чем кто-либо другой.

1
ответ дан 2 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: