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

Откуда:
Сообщений: 450
Добрый день!
имеется список точек с геокоординатами , который необходимо выводить на карту. Для разных масштабов решено сделать заранее рассчитанные списки точек, группируя (уменьшая) количество точек при увеличении масштаба.
Вопрос в том, что следующий пример группирует жестко по значениям Lat, Long
select Lat, Long, avg(Lat), avg(Long), count(*) from [dbo].[Points] 
group by Lat, Long


что нужно добавить/изменить в запрос, чтобы сгруппировать точки в диапазоне Lat плюс минус 0.0005 и также для Long в одну запись в результате?
20 ноя 15, 10:05    [18445344]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
чтобы сгруппировать точки в диапазоне Lat плюс минус 0.0005 и также для Long в одну запись в результате?

И кто задаст начальные Lat/Long ?
Вот у вас, например, 4 точки и все последовательно находятся на+-0.0005 друг от друга
Для простоты вот так
Т1-----Т2-----Т3-----Т4
Вопрос - сколько тут групп ?
20 ноя 15, 10:08    [18445373]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
эти точки должны попасть в одну группу и выводится на карту в виде одной точки с координатами средними по группе
20 ноя 15, 10:11    [18445396]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
то есть, на карте мы увидим только точку ЕЕ
Т1-----Т2--ЕЕ--Т3-----Т4
20 ноя 15, 10:13    [18445405]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
то есть, на карте мы увидим только точку ЕЕ

Откуда мы ее "увидим" то ?
Т4 от Т1/Т2 отстоит больше чем на 0.0005
Т3 от Т1 отстоит больше чем на 0.0005
Что будет началом координат то ?
20 ноя 15, 10:15    [18445418]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
И от точки ЕЕ кстатит Т1 и Т4 тоже отстоят больше, чем на 0.0005
20 ноя 15, 10:24    [18445482]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
да, поторопился с ответом, затупил (
видимо, правильно будет на текущем шаге масштабирования найти пару для Т1 и Т3
Т1--ЕЕ--Т2-----Т3--ЕЕ--Т4
20 ноя 15, 10:27    [18445501]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
да, поторопился с ответом, затупил (
видимо, правильно будет на текущем шаге масштабирования найти пару для Т1 и Т3
Т1--ЕЕ--Т2-----Т3--ЕЕ--Т4

А почему не Т1----Т2/Т3-----Т4 ?

Сообщение было отредактировано: 20 ноя 15, 10:41
20 ноя 15, 10:29    [18445517]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
я не понял вопрос, не могу ответить ...
но вот как может выглядеть запрос на такую группировку Т1--ЕЕ--Т2-----Т3--ЕЕ--Т4 ?
20 ноя 15, 11:09    [18445852]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
но вот как может выглядеть запрос на такую группировку Т1--ЕЕ--Т2-----Т3--ЕЕ--Т4 ?

Все просто
Создаете вспомогательную таблицу с полигонами типа квадрат. Эти полигоны должны покрыть всю вашу карту.
Дальше просто джойните таблицу точек с таблицей квадратов по условию попадания точки в квадрат.
20 ноя 15, 11:17    [18445937]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Artny
Guest
Volodya,

А не поможет группировка по загрубленным координатам?
Ну например

select 
     round(Lat, n) Lat
    ,round(Long, n) Long
    ,count(*) 
from [dbo].[Points] 
group by round(Lat, n), round(Long, n)


где n подберете сами, в зависимости от масштаба объектов на вашей карте ?
20 ноя 15, 11:24    [18445991]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
Спасибо.

Artny, поразрядно слишком большое "загрубление" - мне нужно иметь около 20 вариантов масштаба - шаг группировки примерно 0.0005
20 ноя 15, 11:34    [18446070]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Artny
Guest
Volodya,
ну по делению нацело на 5 сгруппировать можно

select
	 (cast(round(latitude * 10000, 0) as int)  - (cast(round(latitude * 10000, 0) as int) % 5)) / 10000.0
	,(cast(round(longitude * 10000, 0) as int)  - (cast(round(longitude * 10000, 0) as int) % 5)) / 10000.0
        ,count(*)
from from [dbo].[Points] 
group by (cast(round(latitude * 10000, 0) as int)  - (cast(round(latitude * 10000, 0) as int) % 5)) 
	,(cast(round(longitude * 10000, 0) as int)  - (cast(round(longitude * 10000, 0) as int) % 5)) 
20 ноя 15, 12:03    [18446354]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
Glory
Создаете вспомогательную таблицу с полигонами типа квадрат. Эти полигоны должны покрыть всю вашу карту.
Дальше просто джойните таблицу точек с таблицей квадратов по условию попадания точки в квадрат.


может у кого есть пример кода по разбиению пространства карты на полигоны ?
20 ноя 15, 14:44    [18447762]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
Добрый день!
в продолжении темы следующий вопрос:
что нужно добавить в запрос на вставку записей в таблицу Points_new, чтобы потом можно было идентифицировать записи из
Points_old, входящие в конкретную группу? то есть по ID из Points_new найти список в Points_old

insert Points_new
select 
     round(Lat, n) Lat
    ,round(Long, n) Long
    ,count(*) 
from [dbo].[Points_old] 
group by round(Lat, n), round(Long, n)
25 ноя 15, 11:35    [18469727]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
чтобы потом можно было идентифицировать записи из
Points_old, входящие в конкретную группу?

Вы понимаете, что спрашиваете ?
Вы вставляете группировку записей как _одну_ запись, но хотите в ней различать каждую из группированных записей.
25 ноя 15, 11:39    [18469776]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
да уж, такое взаимоисключающее требование заказчика, но я , видимо, неправильно сформулировал...

нужно предоставить сгруппированные записи, чтобы пользователь произвел выбор группы
затем по ид группы, выбрать все записи, входящие в данную группу

вопрос, как группировать, но сохранять списки групп, естественно, в разных таблицах?
25 ноя 15, 11:43    [18469822]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
вопрос, как группировать, но сохранять списки групп, естественно, в разных таблицах?

Наверное нужно где-то хранить список групп с попавшими в них точками.
25 ноя 15, 11:48    [18469872]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Volodya
Member

Откуда:
Сообщений: 450
да, точно так )

можно ли в указанном мной выше запросе, получаемый id для группы в Points_new проставлять для записей в Points_old, входящих в эту группу?
25 ноя 15, 11:58    [18469955]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
Volodya
можно ли в указанном мной выше запросе, получаемый id для группы в Points_new проставлять для записей в Points_old, входящих в эту группу?

Вы издеваетесь ?
Как вы себе это представляете при наличии GROUP BY ?
Все id точек должны просуммироваться в один "большой ID"?
25 ноя 15, 12:00    [18469971]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
Glory
Member

Откуда:
Сообщений: 104751
select * from Points_new t1
inner join [dbo].[Points_old] t2 on t1.Lat = round(t2.Lat, n) and t1.Long = round(t2.Long, n) 
25 ноя 15, 12:14    [18470086]     Ответить | Цитировать Сообщить модератору
 Re: группировка точек на карте  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6383
Volodya,

в большинстве баз данных есть специальные индексы для 2-мерных координат Подскажи по оптимизации индексирования при построении квадродерева
25 ноя 15, 15:53    [18471641]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить