SASGIS - SAS.Планета
View Issue Details
0000375SAS.Планета[All Projects] Хотелкаpublic16-01-2011 14:5110-10-2012 11:49
AlexWhiter 
zed 
noneminorhave not tried
closedfixed 
110418 
120808120808 
0000375: Экспорт в формат Garmin JNX
Хотелось бы иметь возможность экспорта в файлы формата JNX (формат карт службы BirdsEye от Garmin).
Описание формата тут: http://whiter.brinkster.net/JNX.shtml
garmin, jnx, навигатор, плагины, экспорт
related to 0000538resolved zed Многослойные карты *.rmp для приборов Magellan (Triton, Explorist) и программы VantagePoint 
zip mobat2jnxsource.zip (9,807) 18-01-2011 03:37
http://www.sasgis.org/mantis/file_download.php?file_id=134&type=bug
? sample3.dpr (947) 15-01-2012 16:03
http://www.sasgis.org/mantis/file_download.php?file_id=590&type=bug
jpg sample3.jpg (23,233) 15-01-2012 16:04
http://www.sasgis.org/mantis/file_download.php?file_id=591&type=bug
jpg

jpg 68.jpg (31,006) 18-01-2012 13:57
http://www.sasgis.org/mantis/file_download.php?file_id=608&type=bug
jpg

jpg 59.jpg (53,817) 19-01-2012 04:46
http://www.sasgis.org/mantis/file_download.php?file_id=610&type=bug
jpg
Issue History
16-01-2011 14:51AlexWhiterNew Issue
17-01-2011 19:00PapazolNote Added: 0000924
18-01-2011 03:37AlexWhiterFile Added: mobat2jnxsource.zip
18-01-2011 03:37AlexWhiterNote Added: 0000925
17-03-2011 20:37vdemidovTag Attached: экспорт
19-03-2011 23:25gpsMaxTag Attached: garmin
07-04-2011 07:15vdemidovTag Attached: плагины
07-04-2011 11:13gpsMaxTag Attached: навигатор
30-05-2011 19:17vdemidovNote Added: 0002769
30-05-2011 19:17vdemidovStatusnew => confirmed
30-05-2011 19:17vdemidovProduct Version => 110418
30-05-2011 19:17vdemidovTarget Version => 40xxxx
30-05-2011 19:51gpsMaxRelationship addedrelated to 0000538
31-05-2011 14:26AlexWhiterNote Added: 0002793
31-05-2011 18:59vdemidovNote Added: 0002798
31-05-2011 23:39AlexWhiterNote Added: 0002802
01-06-2011 03:47vdemidovNote Added: 0002803
01-06-2011 08:30gpsMaxNote Added: 0002809
01-06-2011 12:23AlexWhiterNote Added: 0002818
01-06-2011 12:24AlexWhiterNote Edited: 0002818bug_revision_view_page.php?bugnote_id=2818#r1388
01-06-2011 12:35AlexWhiterNote Added: 0002819
01-06-2011 13:18vdemidovNote Added: 0002820
01-06-2011 14:21zedNote Added: 0002821
01-06-2011 14:41AlexWhiterNote Added: 0002822
01-06-2011 15:01vdemidovNote Added: 0002823
01-06-2011 15:01zedNote Added: 0002824
01-06-2011 15:41AlexWhiterNote Added: 0002825
01-06-2011 16:22vdemidovNote Added: 0002826
01-06-2011 16:27zedNote Added: 0002827
06-06-2011 21:55gpsMaxPrioritynormal => none
31-08-2011 11:51GarlTag Attached: jnx
10-09-2011 12:41bogiNote Added: 0003852
14-12-2011 02:53gpsMaxNote Added: 0004522
14-12-2011 02:57gpsMaxNote Edited: 0004522bug_revision_view_page.php?bugnote_id=4522#r2244
14-12-2011 03:06gpsMaxNote Edited: 0004522bug_revision_view_page.php?bugnote_id=4522#r2245
14-12-2011 03:10gpsMaxNote Edited: 0004522bug_revision_view_page.php?bugnote_id=4522#r2246
29-12-2011 12:15GarlNote Added: 0004717
29-12-2011 12:15GarlDescription Updatedbug_revision_view_page.php?rev_id=2327#r2327
12-01-2012 12:53AlexWhiterNote Added: 0004887
12-01-2012 12:54AlexWhiterNote Edited: 0004887bug_revision_view_page.php?bugnote_id=4887#r2427
12-01-2012 13:47zedNote Added: 0004889
12-01-2012 14:03GarlNote Added: 0004890
12-01-2012 15:02AlexWhiterNote Added: 0004891
15-01-2012 11:11zedNote Added: 0004952
15-01-2012 14:48AlexWhiterNote Added: 0004964
15-01-2012 14:55zedNote Added: 0004965
15-01-2012 14:55zedNote Edited: 0004965bug_revision_view_page.php?bugnote_id=4965#r2469
15-01-2012 15:04AlexWhiterNote Added: 0004966
15-01-2012 15:07AlexWhiterNote Edited: 0004966bug_revision_view_page.php?bugnote_id=4966#r2471
15-01-2012 16:03AlexWhiterNote Added: 0004971
15-01-2012 16:03AlexWhiterFile Added: sample3.dpr
15-01-2012 16:04AlexWhiterFile Added: sample3.jpg
15-01-2012 16:42zedNote Added: 0004972
15-01-2012 23:32AlexWhiterNote Added: 0004993
18-01-2012 10:29zedFile Added: SASPlanet.7z
18-01-2012 10:30zedNote Added: 0005093
18-01-2012 10:37zedNote Edited: 0005093bug_revision_view_page.php?bugnote_id=5093#r2548
18-01-2012 11:03GarlNote Added: 0005094
18-01-2012 11:04zedNote Added: 0005095
18-01-2012 11:15GarlFile Added: 251.bmp
18-01-2012 11:15GarlFile Added: 257.jpg
18-01-2012 11:16GarlNote Added: 0005096
18-01-2012 11:29GarlFile Added: 92.jpg
18-01-2012 11:29GarlFile Added: 75.jpg
18-01-2012 13:55zedNote Added: 0005101
18-01-2012 13:57GarlFile Deleted: 75.jpg
18-01-2012 13:57GarlFile Deleted: 92.jpg
18-01-2012 13:57GarlFile Deleted: 257.jpg
18-01-2012 13:57GarlFile Added: 68.jpg
18-01-2012 13:58GarlFile Added: 95.jpg
18-01-2012 14:05zedFile Deleted: SASPlanet.7z
18-01-2012 14:05zedFile Deleted: 251.bmp
19-01-2012 04:46GarlFile Added: 59.jpg
19-01-2012 05:07zedNote Added: 0005105
19-01-2012 05:10zedNote Edited: 0005105bug_revision_view_page.php?bugnote_id=5105#r2554
19-01-2012 05:15zedStatusconfirmed => resolved
19-01-2012 05:15zedFixed in Version => 24xxxx
19-01-2012 05:15zedResolutionopen => fixed
19-01-2012 05:15zedAssigned To => zed
20-01-2012 15:58GarlFile Deleted: 95.jpg
20-01-2012 19:40gpsMaxNote Added: 0005143
20-01-2012 19:43gpsMaxNote Edited: 0005143bug_revision_view_page.php?bugnote_id=5143#r2568
20-01-2012 19:45GarlNote Added: 0005144
20-01-2012 19:46gpsMaxNote Edited: 0005143bug_revision_view_page.php?bugnote_id=5143#r2569
23-01-2012 08:18vdemidovFixed in Version24xxxx => 120808
23-01-2012 08:18vdemidovTarget Version40xxxx => 120808
10-10-2012 11:49TolikStatusresolved => closed

Notes
(0000924)
Papazol   
17-01-2011 19:00   
На форуме появилось интересное сообщение по сабжу.
(0000925)
AlexWhiter   
18-01-2011 03:37   
С учетом того, что автор упомянутой в сообщении программы mobat2jnx раздает исходники (на форуме gpsunderground), думается, что добавить аналогичную функцию в SAS не составит большого труда.
Прилагаю вчерашнюю версию исходников.
(0002769)
vdemidov   
30-05-2011 19:17   
Может когда руки и дойдут. Но больше шансов реализовать в виде плагина. Так что, если кого интересует, то изучайте формат и начинайте писать свою экспортилку, потом ее можно будет переделать в плагин к САС.Планете.
(0002793)
AlexWhiter   
31-05-2011 14:26   
Меня интересует. Формат изучил.
Зачем писать экспортилку, если уже есть минимум три готовых с исходниками?
Может быть, сразу делать плагин?
(0002798)
vdemidov   
31-05-2011 18:59   
Ну они вряд ли написаны на Делфи, а плагин с 90% вероятностью придется писать на Делфи. И еще опишите кратенько что от внешней программы понадобиться плагину? Просто экспорты разные бывают. Для некоторых нужно почти что клеить тайлы, тоесть перебирать строго в определенном порядке, например по строкам. Для других можно просто брать любой тайл входящий в выбранную область и запихивать в результирующий файл или папку.
(0002802)
AlexWhiter   
31-05-2011 23:39   
Могу переписать нужный код на Делфи, не большая проблема.

В начале экспорта плагину нужно будет знать количество уровней детализации, которые будут сохраняться, и количество тайлов на каждом из этих уровней.
Далее, уже непосредственно в процессе экспорта, потребуются сами тайлы, желательно в формате JPG (но можно сделать и конвертацию из GIF/PNG). Порядок тайлов на каждом из уровней роли не играет, главное, чтобы все тайлы, относящиеся к одному уровню, шли одним блоком.

В общем, всё.

У формата карт JNX есть ряд настраиваемых пользователем параметров. Возможно сделать у плагина диалог настройки?
(0002803)
vdemidov   
01-06-2011 03:47   
>В начале экспорта плагину нужно будет знать количество уровней детализации, которые будут сохраняться, и количество тайлов на каждом из этих уровней.
А зачем это ему и насколько точные это должны быть числа?
И еще, можно ли сделать несколько экспортов в один файл? Должны ли области экспорта быть связными?

Диалог настройки пока сложный вопрос. Для начала давайте исходить из того что его нету.
(0002809)
gpsMax   
01-06-2011 08:30   
> главное, чтобы все тайлы, относящиеся к одному уровню, шли одним блоком.

Надо как-то подогнать эту идею под передачу параметров плагину.
(0002818)
AlexWhiter   
01-06-2011 12:23   
(edited on: 01-06-2011 12:24)
> А зачем это ему и насколько точные это должны быть числа?

Если не вдаваться в детали, файл JNX состоит из двух основных кусков - заголовка и собственно JPEGовых картинок. В заголовке, кроме всего прочего, хранится список координат всех тайлов и смещения до картинок.
Если в начале записи файла не известно, сколько будет тайлов, то нужно
а) либо делать дву-проходную запись - сначала писать картинки во временный файл, а потом уже делать окончательный JNX, формируя заголовок и дописывая все картинки из временного файла; "веселый" будет способ, особенно если тайлов достаточно много, скажем, полгига;
б) либо резервировать место под максимально возможное количество тайлов (а это 50 000 на самом детальном из 5 поддерживаемых уровней), то есть примерно 3 мегабайта потенциально пустого места.

Поэтому знание хотя бы верхней границы числа тайлов было бы весьма и весьма желательным.
Я понимаю, что некоторые тайлы могу отсутствовать на сервере, но когда пользователь выбирает некоторую область, разве нельзя сказать, сколько в неё в принципе попадает тайлов?

Еще один момент, связанный с предварительным знанием числа тайлов.
Хотя на самом детальном уровне карты JNX может размещаться не более 50000 тайлов, формат поддерживает, так сказать, "многотомные" карты - когда тайлы одного уровня детализации раскидываются по нескольким файлам при достижении ограничения.


> И еще, можно ли сделать несколько экспортов в один файл?

Если можно, поясните подробнее, что значит несколько экспортов в один файл? Я не совсем понимаю. Имеется в виду, что сначала в файл сохраняется одна выделенная область, а через некоторое время туда же сохраняется другая?


> Должны ли области экспорта быть связными?

Нет. Карты JNX не накладывают каких-либо ограничений на связность или порядок следования тайлов.
Сможет ли GPS быстро работать с подобными картами - не проверялось.


> Диалог настройки пока сложный вопрос. Для начала давайте исходить из того что его нету.

Это грустно.
Хотя бы INIшник или ключи реестра использовать можно?

(0002819)
AlexWhiter   
01-06-2011 12:35   
Кстати говоря, описанный выше вариант "а" - это то же самое, что скопировать относящийся к выделенной области кусок кэша в формате Google Maps в какой-либо временный каталог, а затем обработать этот каталог программой mobat2jnx.

Может быть, самым простым способом реализации сабжа было бы добавление настроек пост-обработки в диалог загрузки карт.
(0002820)
vdemidov   
01-06-2011 13:18   
Ясно. Тоесть под вот этот тип оно не подойдет.
http://sasgis.org/wikisasiya/doku.php/pluginapi:plugintype:простой_экспорт_в_файл
(0002821)
zed   
01-06-2011 14:21   
Если добавить метод GetMaxTilesCount - то подойдёт.
(0002822)
AlexWhiter   
01-06-2011 14:41   
Я бы сказал, подойдет, если добавить три метода
procedure StartExport(Levels: integer; MaxTiles: array of integer);
procedure StartLevel(Index: integer);
procedure EndExport;

Без финализации вообще никак.
Или финализация предполагается неявная - при разрушении объекта?

На уровни можно не заморачиваться, если предполагать, что осуществляется экспорт только одного уровня.
(0002823)
vdemidov   
01-06-2011 15:01   
Да, финализация предполагается при разрушении, хотя может и стоит подумать о явной.
(0002824)
zed   
01-06-2011 15:01   
>б) либо резервировать место под максимально возможное количество тайлов
3Mb ведь можно и зарезервировать? Не так уж это много для тайлохранилища.

>procedure StartLevel(Index: integer);
Принципиально, чтобы зумы шли в какой-то последовательности?
 
>Или финализация предполагается неявная - при разрушении объекта?
Да.

А почему бы не сделать это не в качестве плагина, а внутрях SAS? С плагинами оно весьма туманно пока что, а так, если вы напишите модуль (в виде класса) реализующий экспорт - подцепить его к сасу не составит труда. Главное, чтобы класс был максимально автономен.
(0002825)
AlexWhiter   
01-06-2011 15:41   
> 3Mb ведь можно и зарезервировать? Не так уж это много для тайлохранилища.
Смотря какого объема само хранилище :)
Если предполагается, скажем, 100 метров картинок, то 3 действительно ровным счетом никуда не стучат.

> Принципиально, чтобы зумы шли в какой-то последовательности?
Нет. И если резервировать место под описания тайлов по максимуму, то даже и не требуется, чтобы все тайлы одного уровня шли последовательно.

Класс написать могу.
Есть ряд вопросов:
1. Можно ли предполагать, что все входные тайлы будут в формате JPEG?
2. Что означает "максимальная автономность"?
3. Под рукой есть Делфи версий 5, 6 и 7. Какую из них лучше использовать?
4. И всё же как насчет использования INIшника для параметризации?
5. Формат JNX работает в проекции Lat/Lon и датуме WGS84. Можно ли ожидать, что входные координаты тайлов будут в этих проекции и датуме? Если нет, имеются ли в SAS функции для преобразования?
(0002826)
vdemidov   
01-06-2011 16:22   
1. Пока нельзя, точнее можно будет поставить совместимость только с JPEG.
2. То и значит, что никаие функции основной программы вам не будут доступны
3. Любую. САС разрабатывается в 2007-ой
4. Пользуйтесь.
5. Пока нельзя. Функция есть, но вашему классу они не доступны.
(0002827)
zed   
01-06-2011 16:27   
Как вариант - свяжитесь с feya и попросите доступ к исходникам. Всем будет проще.

>И всё же как насчет использования INIшника для параметризации?
Если экспорт будет не из плагина, а из самого саса, то все параметры можно брать из фрейма экспорта (добавить свои поля/переделать стандартный при необходимости).
(0003852)
bogi   
10-09-2011 12:41   
Just now I found this change request.
I have an idea how to easily integrate JNX file generation into SAS.Planet. It would be based on external command line tool execution, therefore the solution would be simple to implement within SAS.Planet.
Please see here: http://sasgis.org/forum/viewtopic.php?f=2&t=1373&p=22799#p22799
(0004522)
gpsMax   
14-12-2011 02:53   
(edited on: 14-12-2011 03:10)
Я понимаю, что с плагинами, как обычно, всё завязло на этапе планирования интерфейсов. А вот что мешает подключить mobat2jnx через командную строку по предложению bogi?

Единственно что, mobat2jnx работает на текущий момент только с кэшем типа GlobalMapper Tiles. Но зато работает отлично, и даже есть спецключ -sas, что меня радостно удивило.

Примерная схема передачи задания:
- В экспорте пользователь выбирает пункт "Создать JNX с помощью mobat2jnx".
- Экспортилка проверяет, что тип кэша экспортируемой карты GlobalMapper Tiles (пока остальные не поддерживаются) и тип jpg
- Проверяет, что поле пути к mobat2jnx непустое и экзешник существует
- Составляет список тайлов и скидывает их в kml. Эта процедура уже есть в САС, только нужно разобраться с уровнями, я еще до этого слегка не дошел. С одним зумом, в любом случае, точно работает.
- Запускает mobat2jnx с параметрами -tilelist - sas и именем временного kml

(0004717)
Garl   
29-12-2011 12:15   
ну что поднимем хотелку.
ввиду того, что доступ к исходникам то открыт: можно пробовать реализовывать...
1. либо в качестве диалога к mobat2jnx
2. или пытаться разбираться в тонкостях структуры файла. (что более предпочтительно)
(0004887)
AlexWhiter   
12-01-2012 12:53   
(edited on: 12-01-2012 12:54)
Сделал модуль на Делфи для чтения и записи карт JNX.
Скачать можно тут: http://whiter.brinkster.net/JNXLib.rar

(0004889)
zed   
12-01-2012 13:47   
>Сделал модуль на Делфи
Так может уже и экспорт сами сделаете? Посмотрите как реализован, к примеру, экспорт в *.tar: https://bitbucket.org/azya/sasplanet/src/991090386b50/RegionProcess/u_ThreadExportToTar.pas и по аналогии забомбите свой.

Когда будет готово, можете просто приаттачить здесь изменённые файлы, я добавлю их в репо. Или, можете сделать форк репо с исходниками, а потом отправить пул-реквест. Но это если вообще понятно о чём говорю и имеется опыт работы с репозиториями.

Вопросы по компиляции САС: http://sasgis.org/forum/viewtopic.php?f=47&t=1716&start=0
(0004890)
Garl   
12-01-2012 14:03   
там насколько я понял из быстрого взгляда нужна проекция lat\lon
(0004891)
AlexWhiter   
12-01-2012 15:02   
Да, проекция должна быть Geographic Lat/Lon.
Из-за этого могут быть какие-либо проблемы?


Думаю, что проще и быстрее будет прикрутить экспорт тем, кто уже более-менее разобрался с внутренностями SAS.
(0004952)
zed   
15-01-2012 11:11   
>>проекция должна быть Geographic Lat/Lon
>Из-за этого могут быть какие-либо проблемы
Проблем по-идее быть не должно, но придётся конвертировать проекцию перед экспортом. Это немного усложняет задачу.

>Думаю, что проще и быстрее
Проще - возможно, быстрее - не факт. Может оказаться быстрее разобраться в исходниках и прикрутить что-то самому, чем ждать пока у кого-то до этого дойдут руки. Тем более, что тому у кого дойдут руки, тоже ведь придётся со своей стороны разбираться с форматом JNX, чтобы сделать нормальный экспорт.
(0004964)
AlexWhiter   
15-01-2012 14:48   
> Тем более, что тому у кого дойдут руки, тоже ведь придётся со своей стороны разбираться с форматом JNX, чтобы сделать нормальный экспорт.
Я постарался сделать классы как можно более простыми для использвания. Знание формата JNX не требуется для нормального экспорта.

На вход достаточно скормить количество уровней, предполагаемое количество тайлов на каждом из уровней и собственно тайлы в виде координат и JPEGов.
(0004965)
zed   
15-01-2012 14:55   
Т.е. оно будет ругаться, если захотим сохранить более 50000 тайлов на более чем 5-ти зумах? Или нужно заботится об этом отдельно?

Примеры использования у вас довольно оригинальные: writer'у назначили все свойства ридера и делов-то. А как, не имея JNX создать его с нуля, со стороны в общем-то и не понятно.

(0004966)
AlexWhiter   
15-01-2012 15:04   
(edited on: 15-01-2012 15:07)
Да, вывалит исключение с объяснением о превышении количества.

В sample1 присваивается необходимый минимум полей :)

Единственное не вполне понятное место - это установка масштабов уровней (свойство-массив LevelScale), для их получения есть функция DigitalGlobeZoomToScale, на вход которой уходят номера уровней DigitalGlobe или GoogleEarth.

Раз уж так сильно пугает наличие Reader'а и входного файла JNX, сейчас сделаю еще один пример, который будет принимать на вход один JPEG, координаты тайла и номер уровня GE, из которого этот тайл получен.

(0004971)
AlexWhiter   
15-01-2012 16:03   
Добавил третий пример - создание карты с нуля.
Перезалил архив.

Также добавил исходник и картинку во вложения к обращению.
(0004972)
zed   
15-01-2012 16:42   
Так гораздо понятней, спасибо)

Интересно, получается, что тайлы могут быть любого разрешения, а не только 256*256?

По поводу либы: зависимость от юнитов utf8.pas и ComObj излишняя - компилится и без них, по крайней мере на Delphi 2007.
(0004993)
AlexWhiter   
15-01-2012 23:32   
> Интересно, получается, что тайлы могут быть любого разрешения, а не только 256*256?

Да.
В картах, получаемых по подписке BirdsEye размер тайла ограничен 256 на 256 (и отличается от квадрата только по краям карты), но в принципе никто не запрещает использовать бОльшие или меньшие изображения.
Пользователи, однако, сообщали о замедлении устройств, в которых использовались тайлы 1024 на 1024.


> По поводу либы: зависимость от юнитов utf8.pas и ComObj излишняя - компилится и без них, по крайней мере на Delphi 2007.

Вполне может быть. У меня под рукой есть только Delphi 5 и 7, с ними и проверял.
Уже в седьмой версии не нужны ни UTF8, ни ComObj. Но вот пятая версия без них не компилирует.
В принципе можно разрулить ifdef'ами, но я пока решил не заморачиваться :)
(0005093)
zed   
18-01-2012 10:30   
(edited on: 18-01-2012 10:37)
Приаттачил exe, протестируйте. Что-то экспортируется, но что...

Код в репах: https://bitbucket.org/azya/sasplanet/changeset/63552e9e1ae5
может я там чё и накосячил, проверьте.

(0005094)
Garl   
18-01-2012 11:03   
Прибор не ругается, карту не показывает
не показывает что это birds eye.
код можно пробовать ковырять?
(0005095)
zed   
18-01-2012 11:04   
конечно. мне тестировать не на чем.
(0005096)
Garl   
18-01-2012 11:16   
загружался краснодарский край , получилось картинка в аттаче.
(0005101)
zed   
18-01-2012 13:55   
Вроде всё исправил.
(0005105)
zed   
19-01-2012 05:07   
(edited on: 19-01-2012 05:10)
Garl, а что не так с последним скриншотом?

А, понял, всё-таки с определением координат путаница вышла.

(0005143)
gpsMax   
20-01-2012 19:40   
(edited on: 20-01-2012 19:46)
Дошли руки попробовать. Ух, как удобно-то, намного лучше, чем с mobat2jnx возиться.

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

Железо: Etrex 30, microSD 32 Гб Class 6. JNX: 2.2 Гб, пять уровней z14-z18, около 60000 тайлов (если верить сообщению SAS). Здесь какие-то непонятки, поскольку реально по обработанной области более ста тысяч тайлов в кэше.

(0005144)
Garl   
20-01-2012 19:45   
я ещё доп.поля щас прикручиваю. будет что обкатать.