powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / карты +
22 сообщений из 47, страница 2 из 2
карты +
    #38783163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто лишнее
Код: sql
1.
 t.zm = z.id


напутал, не лишнее, так хотел написать
Код: sql
1.
2.
z.id = Масштаб
   and  t.zm = Масштаб
...
Рейтинг: 0 / 0
карты +
    #38783214
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок
>ЮИ еще вопрос, если отсюда выкинуть условие "and t.px <= П and (t.px + z.pw ) >= Л", то много выберется записей? т

если карта существенно шире запроса, то много лишних.

потестить надо,
но карты лежат на флопиках, в парадоксе, насколько я помню.
...
Рейтинг: 0 / 0
карты +
    #38783282
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2а)
множество одинаковых квадратов (или прямоугольников) области накрытия,
половинками по вертикали накладывющиеся друг на друга - специальное накрытие карты,
для каждого из масштабов.
вид со стороны оси y
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
     -
     |
     |
     |
     |  -
     |  |
     |  |
     -  |
     -  |
     |  |
     |  |
     |  -
     |  _
     |  |
     |  |
     _  |
     _  |
     |  |
     |  |
     |  |
     |  _
     |
     |
     _
, где размеры областей накрытия совпадают с размерами тайлов на этом масштабе.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table environs(               -- окрестности масштаба
  id     INTEGER PRIMARY KEY,
  zm     INTEGER not null,
  px     INTEGER not null,     --        координата левого 
  py     INTEGER not null,      --       верхнего угла в условных пикселях
  ltt    INTEGER not null,     -          координаты левого верхнего
  lng    INTEGER not null,      --        в единицах на местности
  constraint co1 foreign key (zm) references zoom(id)   -- 

);
create index i_env1 on tile (zm, py, px);





Для текущего масштаба М будем вынимать области из масштаба М-1 и выше до Ласт
(пусть от 0 до 16, 16 масштабов достаточно).
Чем выше номер масштаба, тем больше размер тайлов.


список проекций увеличится в два раза от 6 до 26.
В худшем случае
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
0  - 26 проекций границ областей      P_0
 1    13                               P_1
 2    7                                P_2
 3    4                                P_3
 4    2                                P_4
 5    1                                P_5
 6    1                                P_6
 7    1                                P_7
 8    1                                P_8
 9    1                                P_9
 10   1                                P_10
 11   1                                P_11
 12   1                                P_12
 13   1                                P_13
 14   1                                P_14
 15   1                                P_15
всего 63 точки вполне терпимо

на 15 масштабе
14 26
15 13
из 38 точек.

от 40 до 80 точек.


получаем вместо 1 селекта
объединение до 16 или последовательное выполнение до 16 селектов.
поскольку индекс начинается с масштаба - запросы идут по возрастанию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select  t.id, t.px, t.py, z.pw , z.ph,
  from  zoom as z, environs as t
  where
         z.id = Масштаб_М-1
    and  t.zm = Масштаб_М-1
    and  t.py in (pyO_M-1, py1_M-1, ..., pyN_M-1)           --  P_М-1
    and  t.px <= П and  (t.px + z.pw ) >= Л

union

select  t.id, t.px, t.py, z.pw , z.ph,
  from  zoom as z, environs as t
  where
         z.id = Масштаб_М
    and  t.zm = Масштаб_М
    and  t.py in (pyO_M, py1_M, ..., pyN_M)           --  P_М
    and  t.px <= П and  (t.px + z.pw ) >= Л


union 
....
...
Рейтинг: 0 / 0
карты +
    #38783341
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3)
множество неодинаковых прямоугольников надо рассовать
прямоугольники по областям накрытия, в зависимости
от размера прямоугольника.

таблица областей ниразу не нужна,
нужна таблица обьектов, которые рассортированы по областям накрытия,
в разные масштабы, в зависимости от вхождения объекта.



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table object(               -- окрестности масштаба
  id     INTEGER PRIMARY KEY,
  zm     INTEGER not null,
  px     INTEGER not null,     --        координата левого 
  py     INTEGER not null,      --       верхнего угла в условных пикселях области накрытия
  lngL   INTEGER not null,      --       реальные координаты верхнего и нижнего
  lttU   INTEGER not null,     --        угла для минимального прямоугольника, содержащего
  lngR   INTEGER not null,      --       географический обьект, стороны которого параллельны   
  lttD   INTEGER not null,     --         осям координат                           
  constraint co1 foreign key (zm) references zoom(id)   -- 

);
create index i_obj1 on tile (zm, py, px);






и нужны функции
а) пересчета реальных координат в условные пиксели
LngToX: Int -> Int и AttToY: Int -> Int

б) пересчета реальных координат в координаты областей накрытия
SzToEnv: (Int >< Int) >< (Int >< Int) -> UChar >< (Int >< Int)

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



Грубый отбор прямоугольников == 16 запросов меняются на такие

.f
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select  t.id, LngToX(t.lngL)
              , AttToY(t.lttU)
                 , LngToX(t.lngR) - LngToX(t.lngL)
                    , AttToY(t.lttD) - AttToY(t.lttU)

  from  zoom as z, object as t
  where
         z.id = Масштаб_М-1
    and  t.zm = Масштаб_М-1
    and  t.py in (pyO_M-1, py1_M-1, ..., pyN_M-1)           --  P_М-1
    and  t.px <= П and  (t.px + z.pw ) >= Л




.^
дальше по первому запросу
строим любезно подсказанное Майтоном РдеревоМатьЕгоТак с грубо отобранными прямоугольниками
и их айдями, которое и используется для
окончательного отображения в окне тайлов карты и считанных объектов
в условных координатах.

Если рамка запроса сдвигается и или меняется масштаб - то надо,
в рДеревеМатьЕгоТак, стереть объекты (или не стереть если много памяти) не попадающие
в новый запрос прямоугольники, а затем дочитать новые.

фух
...
Рейтинг: 0 / 0
карты +
    #38783367
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz поскольку индекс начинается с масштаба - запросы идут по возрастанию
Думаю оптимизатору пофиг как они идут - как идут так и будет выполнять (отдельно каждый сам по себе) и склеивать результат.

В данном запросе я бы точно выкинул zoom, т.е. сначала
Код: sql
1.
select id, pw from zoom where id in (Масштаб_М, Масштаб_М-1 ...)


затем сгенерить запрос только из environs с кучей union.
что-то конкретнее сказать не могу, плохо соображаю вечером, утром еще гляну.

Не надо считать индекс панацеей для оптимизации, он хорошо ускоряет запросы если помогает выбрать 3-5% записей, если больше, то индекс может превратится в тормоз, т.к. полный скан таблицы быстрее, чем получить из индекса указатель на запись, проверить соответствие остальным неоптимизируемым критериям, получить из индекса указатель на следующую запись и т.д.
Поэтому не всегда надо максимально подходящий индекс. Возможно менее полный индекс окажется быстрее. я про (zm, py) вместо (zm, py, px)

В любом случае надо тестить на реальных данных, смотри план выполнения запроса, там видно что будет в реале: использован индекс или скан по таблице.
...
Рейтинг: 0 / 0
карты +
    #38785416
qwe123asd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
карты +
    #38785445
qwe123asd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
карты +
    #38785456
qwe123asd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
карты +
    #38785470
qwe123asd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
карты +
    #38842772
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
список прямоугольников, содержащих линии на карте киевской области
http://agp1.hx0.ru/kbd/kr.zip
и УССР
http://agp1.hx0.ru/kbd/USSR.zip

сами точки
http://agp1.hx0.ru/kbd/kievRegion.1.zip

http://agp1.hx0.ru/kbd/UkSSR.1.zip
...
Рейтинг: 0 / 0
карты +
    #38846526
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, вот так выглядела в 1994 году
...
Рейтинг: 0 / 0
карты +
    #38846581
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего кверху ногами?
...
Рейтинг: 0 / 0
карты +
    #38846611
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizну, вот так выглядела в 1994 году
Похоже на телёнка с крыльями.
...
Рейтинг: 0 / 0
карты +
    #38846733
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне медвеженка напоминал.
...
Рейтинг: 0 / 0
карты +
    #38846734
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА чего кверху ногами?
потому что на экране вертикальная координата увеличивается от нуля вниз.

пысы
оно еще пока зеркальное.
...
Рейтинг: 0 / 0
карты +
    #38846741
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прям какой-то тест Роршаха.
...
Рейтинг: 0 / 0
карты +
    #38970080
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нагенерировали первую версию бд на sqlite из этих файлов
на бд удалось протестировать схема спай (schemaSpy_5.0.0.jar )
генератор документации по схеме бд.
в частности получилась такая картинка
...
Рейтинг: 0 / 0
карты +
    #38984163
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLite летает аж свист стоит, с парадоксом из 96 года не сравнить.
тут 25 тыщ линий и полмиллиона точек, может и не надо морочить голову с
ускорением запросов?

--
на sqlite вся бд отображалась за 22 секунды, из файловой системы за 10 мин,
...
Рейтинг: 0 / 0
карты +
    #38984168
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в таблице sgmstr по паре (sgm, sgmPoint) пришлось индекс сделать,
ибо

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
                   sgmNo++;
                   List<Point> sgmPnt = new List<Point>();
                   _sgmStr.CommandText = String.Format(
                                  "select x, y from SgmStr where sgm = {0} order by sgmPoint", sgm); 
                   gbl.log.WriteLine (IMPORTANCELEVEL.Debug
                      ,"{0}.{1}: {2}-th select: '{3}'"
                        , Text, "paint1"
                          , sgmNo,  _sgmStr.CommandText
                       );
                  
                   using (SQLiteDataReader dr = _sgmStr.ExecuteReader()){
                      if (dr.HasRows){
                        while (dr.Read()){
                            sgmPnt.Add(new Point(x.val(dr.GetInt32(0)), y.val(dr.GetInt32(1))));
                        }
                        _virtSgmStr.Add(sgm, sgmPnt.ToArray());
                      } 
                   }
...
Рейтинг: 0 / 0
карты +
    #38997329
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на бд с киевской областью (50к сегментов и 1 млн точек) тестировали скорость выполнения запросов по выбору точек из таблицы SgmStr либо из блоба таблицы Segment
для разного количества точек в запросе
...
Рейтинг: 0 / 0
карты +
    #38997332
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос меряется в секундах
...
Рейтинг: 0 / 0
карты +
    #38997333
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / карты +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]