Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Таблица расстояний между точками  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
В БД хранится список точек с географическими координатами. Необходимо часто решать следующие задачи:

1. Добавлять новые точки.
2. Находить список точек в радиусе X от заданной.

Первым в голову пришло такое решение. Пожалуйста покритикуйте, если может быть придет в голову что-то лучшее.

Имеется функция которая вычисляет расстояние по паре координат:
F_dist(Lat1,Long1,Lat2,Long2)

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

CREATE TABLE  Points (
PointId INT PRIMARY KEY,
Lat DECIMAL(20,10),
Long DECIMAL(20,10))

CREATE TABLE Distances (
A INT NULL REFERENCES Points(PointId),
B INT NULL REFERENCES Points(PointId),
Dist FLOAT)


В таблице Distances хранятся расстояния между точками. Строки не дублируются: т.е. если есть запись A - B, то записи B - A быть не должно.

Чтобы добавить точку механизм следующий:
Добавляем точку в таблицу Points и запоминаем ее PointId и координаты во временную таблицу #NewPoints.
Т.е. в #NewPoints после вставки будет одна строка.

CREATE TABLE #NewPoints (
PointId INT,
Lat DECIMAL(20,10),
Long DECIMAL(20,10))


строки для вставки в Distances получаем так:

INSERT INTO Distances (A,B,Dist)
SELECT n.PointId,old.PointId, F_dist(Old.Lat,OldLong,n.Lat,n.Long)
FROM #NewPoints n
CROSS JOIN (
SELECT PointId = A FROM Distances 
UNION
SELECT PointId = B FROM Distances) old
JOIN Points coord_old ON old.PointId = coord_old.old.PointId 


Механизм для поиска точек в радиусе такой:

Пусть надо найти точки в радиусе R от точки X.
SELECT PointId
FROM
(SELECT A PointId
FROM Distances 
WHERE Dist < R AND (A=X OR B=X) 
UNION
SELECT B PointId
FROM Distances 
WHERE Dist < R AND (A=X OR B=X))


Меня как-то смущает обилие UNION. Может быть можно как-то по-другому?
22 сен 12, 09:36    [13205837]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
design21,

а не хотите посмотреть в сторону пространственных типов?
22 сен 12, 10:44    [13205910]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Посетитель,
Не факт что решение будет реализовано на MS SQL Server. Поэтому ищу универсальные варианты.
22 сен 12, 19:52    [13207199]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
design21
Не факт что решение будет реализовано на MS SQL Server.

А функцию Вы смело используете. Уже не универсально.

По Вашему варианту.
Зачем для получения списка точек вы используете таблицу Distances?

Для поиска расстояния тоже можно обойтись одним проходом
select case @X when A then B else A end PointID
  from Distances d
 where @X in (A,B)
    and Dist<@R
22 сен 12, 20:38    [13207357]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Функция вычисления расстояния приведена для наглядности. Я для этих целей думаю применить что-то из Google maps API.

Пока что вопрос именно по схеме хранилища.

За запрос спасибо!
22 сен 12, 21:40    [13207644]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
design21
Посетитель,
Не факт что решение будет реализовано на MS SQL Server. Поэтому ищу универсальные варианты.
Когда Вам говорят о пространственных типах данных, вовсе необязательно имеют в виду MSSQL.
В MSSQL реализованы стандарты OGC
22 сен 12, 21:56    [13207712]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
AnaceH
Member

Откуда:
Сообщений: 109
design21
2. Находить список точек в радиусе X от заданной.

используйте STDistance и не изобрейта велосипед.
design21
Не факт что решение будет реализовано на MS SQL Server. Поэтому ищу универсальные варианты.

Общие варианты зачастую неэффективны. Так что сначала определитесь с выбором СУБД.
22 сен 12, 22:03    [13207742]     Ответить | Цитировать Сообщить модератору
 Re: Таблица расстояний между точками  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
Все понял. Думаю информации пока что достаточно.
Буду читать про пространственные типы.
Всем большое спасибо!
22 сен 12, 22:43    [13207868]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить