Anonymous | Login | Signup for a new account | 21-11-24 12:51 UTC |
All Projects | SAS.Планета | Домен, сайт, форум, багтрекер | Доработка карты (ZMP) | Переводы и локализации | Прочее |
My View | View Issues | Change Log | Roadmap | Search |
View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | ||||
0003756 | SAS.Планета | [All Projects] Хотелка | public | 02-04-2021 11:26 | 09-04-2021 14:42 | ||||
Reporter | VadimK | ||||||||
Assigned To | zed | ||||||||
Priority | normal | Severity | minor | Reproducibility | always | ||||
Status | resolved | Resolution | fixed | ||||||
Platform | OS | OS Version | |||||||
Product Version | 201212 | ||||||||
Target Version | 211230 | Fixed in Version | 211230 | ||||||
Summary | 0003756: PascalScript: Добавить итерфейс для работы с тайлохранилищем (чтение, запись, инф. о тайле) | ||||||||
Description | Если скрипт скачивает тайл и сохраняет его в кэш на диск, то этот тайл не отображается на карте. Чтобы он отобразился, необходимо при просмотре карты изменить зум в ту или иную сторону и вернуть обратно. Тогда тайл отобразится (кстати, даже в случае, если переключалка "Кэш-Интернет" стоит в режиме "Интернет" (Alt-I)) Уже упоминал об этом на форуме (подробности http://www.sasgis.org/forum/viewtopic.php?p=49956#p49956) | ||||||||
Steps To Reproduce | Собственно, просьба: ЕСЛИ в params.txt установлено IsUseDownloaderInScript=1 И скрипт возвращает ResultURL='' ТО проверять наличие тайла на диске, и если он присутствует -- отображать тайл на карте | ||||||||
Additional Information | Конечно, из этой ситуации можно выйти другими способами. Но у них есть недостатки. Например, повторная перекачка тайла посредством указания ссылки в ResultURL увеличивает нагрузку на сервер. А указание в ResultURL локального пути до сохранённого тайла приводит к лишней файловой операции копирования. | ||||||||
Tags | No tags attached. | ||||||||
Attached Files | GarminQD_.zmp.zip [^] (4,467 bytes) 02-04-2021 11:26 AccessViolation.png [^] (274,344 bytes) 09-04-2021 09:38 AssertionFailure.png [^] (127,663 bytes) 09-04-2021 12:52 статистика_не_обновляется.png [^] (45,816 bytes) 09-04-2021 14:34 | ||||||||
Notes | |
(0020083) zed (manager) 02-04-2021 12:36 |
Вы как-то очень странно решили использовать скрипт, формирующий ссылку для загрузки тайла. Зачем вы качаете руками, то что SAS и так прекрасно может скачать? Кроме того, из скрипта вы ведь в SQLite/Беркли тайлы сохранить не сможете, так что это очень сомнительная хотелка. Возможно, вашу задачу можно решить другим способом, добавив, например, в скрипты вызовы OnBeforeDownload и OnAfterDownload. Или ещё как-то? Т.е. не вкорячивать абы что абы куда, а сделать по человечески? |
(0020084) VadimK (reporter) 02-04-2021 13:15 |
Тайлы предварительно закачиваются руками, чтобы узнать их размер и при необходимости пополнить список/БД пустых тайлов. А раз уж тайл скачан, зачем его перекачивать повторно? Учитывая, что тайлов сотни тысяч а операция скачивания из интернета самая длительная, то получится неплохая экономия времени и снижение нагрузки на сервер, если повторного скачивания удастся избежать. Касательно других типов кэша, в которых тайлы не хранятся пофайлово. Да, я думал об этом и мне это тоже не нравится. Но я до сих пор использую только второй тип. Если задачу удастся решить другими способами, я буду только рад. :) Надеюсь, там будет присутствовать функция добавления тайла в кэш _любого_ типа (это должна была быть моя следующая хотелка). А уж использование такой функции в скрипте было бы неплохим поводом для программы отобразить сохраняемый тайл на карте. |
(0020085) vdemidov (manager) 02-04-2021 13:33 |
Я бы вообще запретил из скрипта любые операции с файловой системой. Пока только малая распространенность САС.Планеты спасает нас от ситуации: "Ой, я скачал с какого-то сайта zmp, попробовал посмотреть в САС, а все мои документы удалились" Так что думайте как решить свои проблемы без прямого доступа к файлам и соответственно формулируйте хотелки. Эта хотелка, в том виде как она сейчас есть,с вероятностью 99% будет закрыта. |
(0020086) VadimK (reporter) 02-04-2021 14:08 edited on: 02-04-2021 14:25 |
Благодаря вашим замечаниям хотелка приобретает следующий вид. Добавить для использования в скриптах функцию: Function SaveTileToCache(X,Y,Z:integer; Tile:ansistring):boolean; Она сохранит тайл именно в кэш того типа, который указан в params.txt Эта функция безопасна для остальных пользовательских файлов на диске. В режиме просмотра карты: если в скрипте задействуется эта функция (SaveTileToCache), то основная программа оповещается, что (не смотря на ResultURL='') тайл сохранён и его можно отобразить. ЗЫ: Почему Tile:AnsiString ? Потому что сюда пойдёт VResponseData, которая объявлена именно как AnsiString. |
(0020087) zed (manager) 02-04-2021 15:04 |
Одной функции тут будет мало, тут уже речь про целый интерфейс - вам же наверняка ещё захочется проверить наличие тайла или .tne в кэше. И для записи в кэш ещё нужно указывать версию, content-type и т.д. > Я бы вообще запретил из скрипта любые операции с файловой системой Для этого придётся запретить вызывать dll в скриптах. |
(0020088) zed (manager) 02-04-2021 15:09 |
> В режиме просмотра карты: если в скрипте задействуется эта функция (SaveTileToCache), то основная программа оповещается, что (не смотря на ResultURL='') тайл сохранён и его можно отобразить. С этим как раз проблем нет - если запись в кэш происходит через интерфейс, то там есть оповещение об изменениях и гуй перерисовывается автоматически. |
(0020089) vdemidov (manager) 02-04-2021 15:45 |
>Для этого придётся запретить вызывать dll в скриптах. Ну, это еще большая дыра в безопасности. Спасает только то, что очень уж мало людей пользуется САС.Планетой - соответственно атака через эти дырки невыгодна. Но это не значит, что не стоит думать как прикрыть совсем уж вопиющие дырки или хотя бы не плодить новых. |
(0020090) zed (manager) 02-04-2021 16:19 |
Считаешь ли ты интерфейс для взаимодействия с тайлохранилищем дырой? |
(0020091) vdemidov (manager) 02-04-2021 16:25 |
> Считаешь ли ты интерфейс для взаимодействия с тайлохранилищем дырой? Конечно нет. Другое дело, что ИМХО было бы полезней развить скриптовый движек другими типами скриптов (получение акутальной версии, предзапрос, пост обработка скачанного и тд.), вместо того что бы костылить все это внутри скрипта получения урла. Но я, увы, понимаю насколько сложнее это сделать качественно, удобно, безопасно, логично и без ухудшения хотя бы обратной совместимости. Поэтому я, в принципе, за такой интерфейс. |
(0020097) zed (manager) 06-04-2021 16:42 edited on: 06-04-2021 16:42 |
Появился вопрос: а что делать если скрипт запускается из IDE? Может, от греха подальше, создавать хранилище в памяти и подставлять его? |
(0020098) vdemidov (manager) 06-04-2021 17:25 |
> Появился вопрос: а что делать если скрипт запускается из IDE? Да, думаю это правильно будет. Другое дело, что для отладки было бы хорошо видеть что там вышло в результате работы скрипта. А как это сделать удобно я не знаю. |
(0020099) zed (manager) 06-04-2021 18:46 |
Да, сделаю наверное RAM кэш + сохранение дампа (в виде архива) на диск. |
(0020100) vdemidov (manager) 07-04-2021 12:09 |
> Да, сделаю наверное RAM кэш + сохранение дампа (в виде архива) на диск. ИМХО оптимальное решение. Я что-то про экспорт в виде архива не додумался. |
(0020101) zed (manager) 07-04-2021 12:39 |
Можно тестировать использование интерфейса и из IDE. Единственное, что не доделано так это сохранение на диск, но в DebugOutput выводится вся информация о содержимом TileCache по окончании работы скрипта.
Пример использования: |
(0020102) zed (manager) 08-04-2021 07:26 edited on: 08-04-2021 07:26 |
Доделал, тестируйте. Дамп из IDE будет сохраняться в файл TileCacheDump.zip в корне с программой. Пара советов по поводу вашего скрипта: - не используйте ScriptBuffer для хранения информации об отсутствующих/пустых тайлах, а вместо этого записывайте tne в кэш (TileCache.WriteTne(...)) - надо задавать MaxConnectToServerCount=1 если вы не хотите, чтобы с сервера качалось несколько раз одно и то же разными экземплярами скрипта. Либо, весь свой код поместите в блокировку:
|
(0020104) VadimK (reporter) 09-04-2021 09:47 edited on: 09-04-2021 09:48 |
Спасибо большое за быстрое добавление новой фичи в программу! Только сегодня смог протестировать. Но к сожалению вышеприведённый пример не заработал. :( Добавил скриншот в инцидент: Если уменьшить скрипт до:
То работает. Если раскомментировать первую строку, то тоже продолжает работать. Но если расскоментировать последнюю строку, то снова ошибка, пока не закомментишь _обе_ строки обратно. |
(0020106) VadimK (reporter) 09-04-2021 10:35 edited on: 09-04-2021 11:08 |
"zed" wrote Пара советов по поводу вашего скрипта: - не используйте ScriptBuffer для хранения информации об отсутствующих/пустых тайлах, а вместо этого записывайте tne в кэш (TileCache.WriteTne(...)) ScriptBuffer содержит координаты в гарминовском формате, более удобном для сравнения, чем XYZ. В гарминовском формате, чтобы узнать координаты (точнее, координатУ) вышележащего тайла, достаточно удалить одну цифру в координате текущего тайла. При работе же с кэшем (XYZ), как мне кажется, всё сильно усложнится и замедлится. "zed" wrote Сразу после публикации скрипта на форуме (месяц назад) в личке мне подробно рассказали про Global.Lock|Unlock (с ссылками на примеры). И я собираюсь применить это в своём скрипте. Жаль, что в описании скриптов на сайте про эту полезную возможность не упоминается. :(надо задавать MaxConnectToServerCount=1 если вы не хотите, чтобы с сервера качалось несколько раз одно и то же разными экземплярами скрипта. Либо, весь свой код поместите в блокировку: |
(0020109) zed (manager) 09-04-2021 12:02 |
> Добавил скриншот в инцидент: Скриншот это хорошо, но ещё лучше - запустить SASPlanet.Debug.exe и приложить лог с ошибкой (появится файл с расширением .elf в корне с программой). > ScriptBuffer содержит координаты Этот буфер не переживёт перезапуска программы, а tne переживут. Чтобы определить координаты вышележащего тайла, достаточно сделать целочисленное деление координат текущего тайла на 2: X := GetX div 2; Y := GetY div 2; |
(0020110) zed (manager) 09-04-2021 12:06 |
У меня ошибка не воспроизводится. Приложите, в дополнение к логу, ещё и params.txt из IDE. |
(0020111) VadimK (reporter) 09-04-2021 12:58 edited on: 09-04-2021 13:04 |
Запустил SASPlanet.Debug.exe После закрытия окошка с ошибкой программа продолжает работать. Файл .elf ни после возникновения ошибки, ни после закрытия программы не появился. Возможно потому, что ошибка возникла в PascalScript IDE. В дебажной версии текст ошибки, кстати, изменился Было Access Violation, стало Assertion Failure: PARAMS.TXT: --- [PARAMS] GUID={CBA03063-23D9-F11F-C22C-9182B98644B1} asLayer=1 name_ru=Test CacheType=2 projection=1 sradiusa=6378137 sradiusb=6378137 NameInCache=Test Ext=.png ContentType=image/png UseDwn=1 --- Заархивировал всю папку с программой как есть: https://disk.yandex.ru/d/hjS0L21U6fqkpw (18Mb) |
(0020112) zed (manager) 09-04-2021 13:32 |
Вроде починил, тестируйте новую сборку. |
(0020113) VadimK (reporter) 09-04-2021 14:38 edited on: 09-04-2021 14:39 |
Ошибка ушла. Ваш скрипт нормально работает. Попробовал его упростить и разнообразить одновременно: --- var VResult: Boolean; begin VResult := TileCache.Write(GetX, GetY, GetZ, '', 'image/png', inttostr(GetX)+'-'+inttostr(GetY)+'-'+inttostr(GetZ), False); writeln(IntToStr(Integer(VResult))); end. --- Отработал этот скрипт нормально. В режиме скачивания области по окончании процесса в статистике скачанных файлов/байт стоит 0. Похоже, статистика подсчитывает только файлы, полученные через ResultURL. PS: Попозже попробую интегрировать новые фишки в свой скрипт. Ещё раз, спасибо вам огромное за быструю реакцию на мои "хотелки" !!! |
Users who viewed this issue | |
User List | Anonymous (1403x), vdemidov (36x), Snake (1x), VadimK (51x), ygorigor (3x), SilentJim (1x), TiRaToRe (1x), Periz (1x), zed (44x) |
Total Views | 1541 |
Last View | 21-11-2024 12:51 |
Issue History | |||
Date Modified | Username | Field | Change |
02-04-2021 11:26 | VadimK | New Issue | |
02-04-2021 11:26 | VadimK | File Added: GarminQD_.zmp.zip | |
02-04-2021 12:36 | zed | Note Added: 0020083 | |
02-04-2021 12:36 | zed | Assigned To | => zed |
02-04-2021 12:36 | zed | Status | new => feedback |
02-04-2021 13:15 | VadimK | Note Added: 0020084 | |
02-04-2021 13:15 | VadimK | Status | feedback => assigned |
02-04-2021 13:33 | vdemidov | Note Added: 0020085 | |
02-04-2021 14:08 | VadimK | Note Added: 0020086 | |
02-04-2021 14:25 | VadimK | Note Edited: 0020086 | View Revisions |
02-04-2021 14:58 | zed | Assigned To | zed => |
02-04-2021 14:58 | zed | Status | assigned => new |
02-04-2021 14:58 | zed | Summary | сразу не отображаются тайлы, скачанные и сохранённые скриптом => PascalScript: Добавить итерфейс для работы с тайлохранилищем (чтение, запись, инф. о тайле) |
02-04-2021 15:04 | zed | Note Added: 0020087 | |
02-04-2021 15:09 | zed | Note Added: 0020088 | |
02-04-2021 15:45 | vdemidov | Note Added: 0020089 | |
02-04-2021 16:19 | zed | Note Added: 0020090 | |
02-04-2021 16:25 | vdemidov | Note Added: 0020091 | |
05-04-2021 08:33 | zed | Status | new => confirmed |
05-04-2021 08:33 | zed | Target Version | => 211230 |
06-04-2021 16:42 | zed | Note Added: 0020097 | |
06-04-2021 16:42 | zed | Note Edited: 0020097 | View Revisions |
06-04-2021 17:25 | vdemidov | Note Added: 0020098 | |
06-04-2021 18:46 | zed | Note Added: 0020099 | |
07-04-2021 12:09 | vdemidov | Note Added: 0020100 | |
07-04-2021 12:39 | zed | Note Added: 0020101 | |
08-04-2021 07:26 | zed | Note Added: 0020102 | |
08-04-2021 07:26 | zed | Assigned To | => zed |
08-04-2021 07:26 | zed | Status | confirmed => feedback |
08-04-2021 07:26 | zed | Note Edited: 0020102 | View Revisions |
09-04-2021 09:38 | VadimK | File Added: AccessViolation.png | |
09-04-2021 09:47 | VadimK | Note Added: 0020104 | |
09-04-2021 09:47 | VadimK | Status | feedback => assigned |
09-04-2021 09:48 | VadimK | Note Edited: 0020104 | View Revisions |
09-04-2021 10:35 | VadimK | Note Added: 0020106 | |
09-04-2021 10:36 | VadimK | Note Edited: 0020106 | View Revisions |
09-04-2021 11:08 | VadimK | Note Edited: 0020106 | View Revisions |
09-04-2021 12:02 | zed | Note Added: 0020109 | |
09-04-2021 12:06 | zed | Note Added: 0020110 | |
09-04-2021 12:07 | zed | Status | assigned => feedback |
09-04-2021 12:52 | VadimK | File Added: AssertionFailure.png | |
09-04-2021 12:58 | VadimK | Note Added: 0020111 | |
09-04-2021 12:58 | VadimK | Status | feedback => assigned |
09-04-2021 13:00 | VadimK | Note Edited: 0020111 | View Revisions |
09-04-2021 13:04 | VadimK | Note Edited: 0020111 | View Revisions |
09-04-2021 13:32 | zed | Note Added: 0020112 | |
09-04-2021 13:32 | zed | Status | assigned => feedback |
09-04-2021 14:34 | VadimK | File Added: статистика_не_обновляется.png | |
09-04-2021 14:38 | VadimK | Note Added: 0020113 | |
09-04-2021 14:38 | VadimK | Status | feedback => assigned |
09-04-2021 14:39 | VadimK | Note Edited: 0020113 | View Revisions |
09-04-2021 14:42 | zed | Status | assigned => resolved |
09-04-2021 14:42 | zed | Fixed in Version | => 211230 |
09-04-2021 14:42 | zed | Resolution | open => fixed |
My View | View Issues | Change Log | Roadmap | Search |
Copyright © 2007 - 2024 SAS.Planet Team |