|
|
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
В БД хранится список точек с географическими координатами. Необходимо часто решать следующие задачи: 1. Добавлять новые точки. 2. Находить список точек в радиусе X от заданной. Первым в голову пришло такое решение. Пожалуйста покритикуйте, если может быть придет в голову что-то лучшее. Имеется функция которая вычисляет расстояние по паре координат: F_dist(Lat1,Long1,Lat2,Long2) Мне прило в голову что логично будет не выислять на лету расстяония между каждой парой точек, а создать таблицу расстояний между ними. Вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. В таблице Distances хранятся расстояния между точками. Строки не дублируются: т.е. если есть запись A - B, то записи B - A быть не должно. Чтобы добавить точку механизм следующий: Добавляем точку в таблицу Points и запоминаем ее PointId и координаты во временную таблицу #NewPoints. Т.е. в #NewPoints после вставки будет одна строка. Код: sql 1. 2. 3. 4. строки для вставки в Distances получаем так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Механизм для поиска точек в радиусе такой: Пусть надо найти точки в радиусе R от точки X. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Меня как-то смущает обилие UNION. Может быть можно как-то по-другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 20:00 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
design21, ваша СУБД не умеет работать с геометрическими типами данных (point, box, line и т.п.) напрямую? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 20:29 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
я пока не выбрал базу, но скорее всего это будет MySQL 5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 20:53 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
design21, Почитайте теорию графов. Все эти задачи ей покрываются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 22:08 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
Полный граф получается, если хранить расстояние для каждой пары. Количество не смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 23:37 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
Какое кол-во точек планируете хранить? Как часто будут добавляться новые / изменяться старые? Как часто будут запрашивать точки в радиусе от? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 23:43 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
> я пока не выбрал базу, но скорее всего это будет MySQL 5 Лучше замени на Postgres, он поддерживает GEO, и там ещё кажется есть специальные индексы пространственные. Так что решение этой задачи лежит не в выдумывании структур и запросов к ним, которые никогда не будут работать, а в правильном выборе СУБД, которая это умеет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2012, 23:55 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
думаю что добавляться точки будут штук по 10 в день, может и больше в перспективе, сложно сказать - это веб-сайт для поиска попутчиков. при добавлении поездки добавляются точки, в самом начале я точек сам добавлять не планирую - будут добавляться пользователями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2012, 02:01 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
MasterZivЛучше замени на Postgres+1 Хотя и в 5-м мускле есть геомтипы. Правда, только для (уже превращающихся в окаменелость) MyISAM-таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2012, 07:36 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
смотря для каких задач. для транспортных задач эффективное "расстояние" не исчисляется [только] из координат, и более того - анизотропно Код: sql 1. т.е. хранить граф "расстояний" - естественно для геометрических же - смотря от того, что вы хотите нагрузить. есть свободные вычислительные мощности - нагружайте процессор (не храните расстояния). туго с ними - тормозите с дисковыми операциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2012, 11:07 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
design21, привяжитесь к гуглемапсу и не мучайтесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2012, 16:08 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
design21 , При N точках, количество расстояний будет N*(N-1), ну или N*(N-1)/2, если не дублировать расстояния A-B и B-A. Квадратичная зависимость имеет свойство быстро нарастать ;) так что сам оцените, как у вас будет с кол-вом данных. Конечно, это ускорит поиск, но (имхо), надо поэкспериментировать на данных, близких к реальньм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2012, 19:54 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
Не стал бы хранить рассчитанные расстояния 1. Как уже сказали, зависимость квадратичная, для 10 тыс. точек будет около 50 миллионов расстояний 2. точки в радиусе R от заданной (x, y) - это те, которые попадают в круг радиусом R с центром в (x, y). Отобрать точки, которые попадают в квадрат, описанный вокруг этого круга - тривиально просто по координатам. А для этих (немногих) точек не так уж дорого и рассчитать функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2012, 15:41 |
|
||
|
Таблица расстояний между точками
|
|||
|---|---|---|---|
|
#18+
S.G.design21 , При N точках, количество расстояний будет N*(N-1), ну или N*(N-1)/2, если не дублировать расстояния A-B и B-A. Квадратичная зависимость имеет свойство быстро нарастать ;) так что сам оцените, как у вас будет с кол-вом данных. Конечно, это ускорит поиск, но (имхо), надо поэкспериментировать на данных, близких к реальньм. Первый же знак одностороннее движение и расстояния A-B уже не равно B-A. А таких "знаков" бывает много, и реки и круговые и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2012, 06:02 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37970487&tid=1541537]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
138ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 400ms |

| 0 / 0 |
