SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0002463 | SAS.Планета | Рефакторинг | public | 16-07-2014 18:33 | 14-06-2015 11:14 |
|
Reporter | zed | |
Assigned To | | |
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | confirmed | Resolution | open | |
Platform | | OS | | OS Version | |
Product Version | 140505 | |
Target Version | 24xxxx | Fixed in Version | | |
|
Summary | 0002463: В подсистеме sml меток оптимизировать поиск вхождения элементов в прямоугольник |
Description | Сейчас производится полный перебор всех меток и сравнивается входит метка в заданный прямоугольник или нет TMarkDbSml._AddMarksToListByRect. Для такого рода операций поиска, придуман R-tree индекс. Нужно использовать его или что-то похожее. |
Steps To Reproduce | |
Additional Information | Реализация на Delphi есть вот тут: R*-tree или индексация геопространственных данных, правда, там нету метода удаления элементов из индекса. Возможно, можно доработать.
Есть крохотная сишная библиотека: R-Tree Library (но с год не обновлялась и вроде как beta).
Так же, этот индекс есть в SQLite (внезапно). Чтобы не зависеть от наличия/отсутствия либы, можно воспользоваться компонентом Synopse, где есть готовые *.obj и соответствующие высокоуровнивые обёртки:
TSQLRecordRTree to implement R-Tree virtual tables. |
Tags | No tags attached. |
Relationships | related to | 0002462 | confirmed | | В подсистеме sml меток оптимизировать чтение геометрии |
|
Attached Files | |
|
Issue History |
Date Modified | Username | Field | Change |
16-07-2014 18:33 | zed | New Issue | |
16-07-2014 18:33 | zed | Additional Information Updated | bug_revision_view_page.php?rev_id=6165#r6165 |
16-07-2014 18:40 | zed | Note Added: 0014434 | |
16-07-2014 18:40 | zed | Relationship added | related to 0002462 |
16-07-2014 19:04 | zed | Note Added: 0014437 | |
24-10-2014 14:29 | vdemidov | Status | new => confirmed |
24-10-2014 14:29 | vdemidov | Target Version | => 24xxxx |
07-05-2015 18:41 | vasketsov | Note Added: 0015862 | |
07-05-2015 18:53 | zed | Note Added: 0015863 | |
07-05-2015 18:54 | zed | Note Edited: 0015863 | bug_revision_view_page.php?bugnote_id=15863#r6582 |
07-05-2015 18:54 | zed | Note Edited: 0015863 | bug_revision_view_page.php?bugnote_id=15863#r6583 |
14-06-2015 11:08 | vasketsov | Note Added: 0016014 | |
14-06-2015 11:14 | zed | Note Added: 0016015 | |
Notes |
|
(0014434)
|
zed
|
16-07-2014 18:40
|
|
Замечу, что для операции поиска меток, нам нужен только ограничивающий прямоугольник, а не целиком вся геометрия метки. Чисто случайно, этот прямоугольник у нас хранится в sml отдельно от геометрии, так что эта оптимизация не нарушит другую: 0002462. Ну, т.е. надо делать так, чтобы не нарушила. Эти две оптимизации можно применить одновременно. |
|
|
(0014437)
|
zed
|
16-07-2014 19:04
|
|
|
|
|
>этот индекс есть в SQLite (внезапно)
http://sqlite.org/rtree.html
The source code to the SQLite R*Tree module is included as part of the amalgamation but is disabled by default. To enable the R*Tree module, simply compile with the SQLITE_ENABLE_RTREE C-preprocessor macro defined. With many compilers, this is accomplished by adding the option "-DSQLITE_ENABLE_RTREE=1" to the compiler command-line.
Так что собирать надо SQLite3 для R-tree руками. |
|
|
(0015863)
|
zed
|
07-05-2015 18:53
(edited on: 07-05-2015 18:54) |
|
Вообще, да, но можно взять готовый obj из фреймворка mORMot:
http://synopse.info/files/sqlite3obj.7z (постоянная ссылка, сам obj регулярно обновляется до текущей актуальной версии).
Из архива брать файлик sqlite3fts3.obj (включены FTS3 и RTree) и обёртку SynSQLite3Static.pas из репо. Оно, конечно, потянет ещё чутка юнитов из фреймворка, зато "из коропки" будут нужные фичи и статическая линковка.
|
|
|
|
>Вообще, да, но можно взять готовый
>sqlite3fts3.obj (включены FTS3 и RTree)
Я несколько удивлён, но проверил на всех последних официальных билдах - там это есть "из коропки":
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> PRAGMA compile_options;
ENABLE_FTS3
ENABLE_RTREE
SYSTEM_MALLOC
THREADSAFE=0
sqlite> |
|
|
(0016015)
|
zed
|
14-06-2015 11:14
|
|
О, вообще круто. Но в случае в прилинкованным объктником можно быть на 100% увернным, что эти опции доступны. А в dll сегодня есть, а завтра нет. Ну или внимательно проверять перед каждым обновлением либы, что там всё включено. |
|