![]() |
Оптимальное решение для привязки координат к географическим объектам на MS SQL Server
Добрый день.
В организации проводятся некоторые измерения по различным районам. К данным по измерениям привязываются координаты с GPS. Данные агрегируются по долготам/широтам (с точностью до 4го знака) и храняться в таблицах на SQL Server. Далее для ведения статистики (отчетности) необходимо разбивать все позиции на различные группы (н-р, районы, округа, города, поселки, основные трассы). И тут встает вопрос, каким способом производить такое разбиение? Изначально, когда разбивалось только на районы, алгоритм был такой: в таблице на сервере создавались географические полигоны, и принадлежавшие полиганам позиции помечались идентификатором района. Данных по измерениям очень большое количество, и поэтому такой способ занимал длительное время обработки. Более того, так как сейчас необходимо разбиение на большее количество групп, очень сложно будет создать такие полигоны на сервере, и время обработки увеличится. (Изначально было всего 30-35 районов.) На данный момент была мысль создать таблицу, содержащую весь список возможных координат (с шагом 0.0001) и привязать к каждой позиции информацию о принадлежности к группе. Записей в таблице получается около 1500000000, поэтому теперь сомневаюсь, что такой способ является "хорошим". Подскажите, как реализовать такую задачу. Буду рад любой информации. Спасибо. |
я немного далек от sql, но пять копеек вставлю (-
Цитата:
|
Вложений: 1
freese, спасибо.
Можно немного поподробнее. Не совсем понял, ваше представление - структуры всего этого. Я думал что - то наподобие (см. вложение). Ну и соответственно, ко всем необходимым таблицам по измерениям добавлять столбец PosId, которая берется из Position по совпадения Longitude, Latitude. |
LilLoco, что за группы 1…N?
|
Iska, как бы уровни вложенности. Например: 1 группа- Москва, московская область; 2 группа - цао, вао, Ногинский район, Шатурский район; 3 группа - деревни, поселки; ну и так далее... То есть каждая группа будет отвечать за определенное разбиение на уровни.
|
LilLoco, с точки зрения теории это явно избыточно. Необходимо и достаточно держать в таблице только нижний уровень.
Мне не очень алгоритм понятен. Полигоны — это что суть, физически? |
Цитата:
Полигонометрия http://ru.wikipedia.org/wiki/Полигонометрия ЗЫ Раньше узлами сетки служили тригопункты, а теперь ко всему можно привязаться... |
Цитата:
Цитата:
Хотелось бы услышать автора темы. |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Вложений: 1
Цитата:
Для наглядности, прикладываю картинку. Есть 4 группы - таблицы, на которые мы делим данные (Podrazd - подразделения, Oblast - области, Region - районы, City - города). Есть таблица Geo, которая содержит список всех возможных координат, где мы можем снимать измерения, с шагом 0.0001. Таких записей получается порядка 2 миллиардов. Далее к таблицам измерений присоединять колонку PosId, которая будет идентификатором принадлежности измерения к "группе разбиения". Идея лезет в голову только такая пока что. P.S. Чтобы немного уменьшить объем таблицы Geo, вложенность можно определять не в ней, а в таблицах-группах. Т.е. в таблице Oblast создать колонку Podrazd.podrazdid, в Region - Oblast.OblastId и так далее. Но это на данный момент не так сильно волнует. Основным вопросом для меня является правильно ли я мыслю, или этот вариант лучше вообще не использовать? Спасибо. |
LilLoco, скажи, а измерение до 4ого порядка, это сколько в метрах?
|
lxa85, я думаю порядка 4-5 метров. Это в московской области по широте.
Я думал о том, чтобы хранить координаты с шагом не 0.0001, а 0.001. Думаю погрешность будет невелика. |
Цитата:
Цитата:
|
Iska, ну то есть, ход мыслей у меня более менее правильный?
|
LilLoco, в части проциированного мною в предыдущем посте — да. По остальному сказать не могу, поскольку для меня так и осталась непонятной предметная область целиком. В частности, непонятно Ваше решение с «создать таблицу, содержащую весь список возможных координат».
Расскажите об задаче наиболее подробным образом, чтобы было понятно человеку, впервые об этом узнавшем. |
Цитата:
Цитата:
С оборудования снимаются файлы с данными, которые вносятся в базу данных SQL Server. По полученным данным, формируются таблицы (Измерения) для ведения статистики вида: id, longitude, latitude, столбцы с измерениями. То есть, для каждой точки проезда/прохода, существует ряд измерений. Точка имеет свои координаты долготы/широты. Есть задача, чтобы можно было просмотреть статистику лишь для определенных мест, например, только на шоссе, либо только в деревнях. Для этого нам необходимо связать координаты из полученной таблицы (Измерения) с реальными географическими объектами. Для этого и было предположение создать таблицу со всеми возможными координатами, в которой будет содержаться географическая информация по этим координатам. После чего сводить координаты из этой таблицы с координатами из таблицы (Измерения), тем самым получая измерения для определенных географических объектов. Вот в принципе и вся задача. |
Цитата:
Цитата:
Цитата:
|
Дополню Iska и разовью свою мысль. Допустим идет процесс пешей и автомобильной гамма съемки. Автомобиль, равно как и человек ходит по дорогам,иногд по лесам,полям,болотам. Вам доступны только его координаты,без описания окружения. Iska поднимает вопрос топопривязки полученных координат к реальной местности. С приборов можно получить трассу маршрута(удобно в плане дорог). Но для практического использования необходимо привязать полученные значения к карте. Возможно для вас целесообразние будет получить картографические сведения из специальных баз(если разработка официальная и поддерживается руководством) возможно они подскажут свое API для работы с картами.
|
Цитата:
Цитата:
|
lxa85, некоторые сами «рисуют» карты: Waze: нам по пути, или История маленького, но очень гордого стартапа.
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
LilLoco, почему бы не делать привязку к нижнеуровневому объекту не в момент выборки, а в момент добавления строки с измерением в таблицу? |
Цитата:
Плюс, могу сказать, что добавление производится не всегда в одни и те же базы данных. Поэтому, например, использование триггеров, срабатывающих на добавление записей, является невозможным. Цитата:
|
Цитата:
А как насчёт делать привязку в момент пересчёта? Есть же технологические перерывы какие-нибудь? Цитата:
Схема базы данных: ![]() (вторая таблица «Объекты» на схеме — фиктивная, только для того, чтобы показать связь, ссылку с одной записи таблицы на другую запись той же таблицы). Так вот, в этой схеме поле «Принадлежность» (к объекту нижнего уровня) можно заполнять позже. Пожалуй, таблицу Полигоны также стоит разбить на две подтаблицы: собственно Объект[Id, Наименование (что-то я забыл про это на схеме), Подчинение] и ТочкиПолигона[Id точки, координата точки полигона, порядковый номер точки, Id Полигона]. |
Цитата:
Iska, Спасибо большое за разъяснения. Буду пробовать. Спасибо всем за помощь в этом, нелегком для меня, деле. Тему пока отмечу решенной |
LilLoco, я сейчас ещё подумал (да, бывает и такое — я думаю ;)) — таблицу Полигоны, что на схеме, надо обязательно разбить на две таблицы: один объект может состоять из нескольких полигонов, тогда как раз логично держать отдельно сами полигоны (как сущность) и отдельно, так же — как сущность, точки конкретного полигона.
|
Время: 21:37. |
Время: 21:37.
© OSzone.net 2001-