SASGIS

Веб-картография и навигация

Редактирование тайлов из кеша в berkeley?

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Редактирование тайлов из кеша в berkeley?

Сообщение T_Im » 13 авг 2014, 15:07

Задача: есть уже скачанные кеши, (десятки тысяч тайлов), с которыми необходимо провести цветокоррекцию. Если бы снимки не отправились в небытие на серверах, можно было бы перекачать с использованием перлового прокси отсюда viewtopic.php?f=3&t=2206.

Практически несложно экспортировать кеш из berkeley в файловый кеш САС, обработать скриптом потайлово, и импортировать обратно в berkeley, однако это не есть правильно и, к тому же, сильно затратно.

Поэтому возник вопрос: кто нибудь работал из Perl с кешами berkeley? Есть ли какие примеры на Перле, как потайлово прочитать существующий berkeley-кеш САС?

Если вариант с прямой работой из Перла с berkeley не пройдет, то возникает второй вопрос: как можно поднять сервер, чтобы с него через прокси скачать уже откорректированные тайлы (т.е. построить такую цепочку: berkeley-кеш->сервер на локалхосте->прокси на локалхосте->SAS->откорректированный berkeley-кеш).

В каком направлении проще копать?
T_Im
Постигающий Дао
 
Сообщения: 112
Зарегистрирован: 04 янв 2009, 21:52
Благодарил (а): 15 раз.
Поблагодарили: 23 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение vdemidov » 13 авг 2014, 15:16

Проще всего копать в сторону делфи. То есть или дописать новый функционал в САС, или сделать отдельную утилиту на базе исходников САСа.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение T_Im » 13 авг 2014, 17:18

vdemidov писал(а):Проще всего копать в сторону делфи. То есть или дописать новый функционал в САС, или сделать отдельную утилиту на базе исходников САСа.

Конечно, приделать обработку тайлов в "Управление кешем", или в "Операции с выделенной областью" было бы замечательно.
Теоретически, обработка тайлов довольно проста - в обрабатывающем прокси она занимает от силы полтора десятка однотипных строк.
Но вот стоит посмотреть Дэлфи API - и сразу становится грустно. Я писал обрабатывающий тайлы прокси на PerlMagick API, который хорошо документирован http://www.imagemagick.org/script/perl-magick.php и в сети по нему куча инфы и примеров.
С Дэлфи API все печальнее: с официального сайта ссылка идет сюда http://wiki.freepascal.org/PascalMagick , где сказано, что пакет входит в состав FreePascal и приведен единственный пример использования. Ни документации, ни самого пакета.
При этом, в пакет FreePascal по видимому входит лишь небольшая часть функций ImageMagick, остальные функции надо брать из сишных библиотек ImageMagick вручную http://wiki.freepascal.org/Creating_bin ... _to_Pascal

Для человека, незнакомого с Дэлфи, это все выглядит неподъемным (тут уж проще будет разобраться с работой bdb на перле).
T_Im
Постигающий Дао
 
Сообщения: 112
Зарегистрирован: 04 янв 2009, 21:52
Благодарил (а): 15 раз.
Поблагодарили: 23 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение vdemidov » 13 авг 2014, 18:00

ИМХО воспроизвести на перле работу с тайлохранилищем в беркли будет сложнее, чем реализовать операции с картинками на делфи.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение zed » 14 авг 2014, 22:50

На перле не видел, а на питоне есть: https://github.com/buddebej/ol3-dem/blo ... splanet.py правда там только чтение и только неверсионный кэш, но всё реально, было бы желание ;)

За это сообщение автора zed поблагодарил:
T_Im (16 авг 2014, 10:51)
Рейтинг: 5.26%
 
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение lLan » 29 ноя 2014, 17:21

Пробую подключиться к BerkeleyDB из Perl-a.
Код вот такой:
Код: Выделить всё
#!/usr/bin/perl
use warnings;
use strict;
use BerkeleyDB;

my %hash;
my $key;

tie %hash, 'BerkeleyDB::Hash',
#-Flags => DB_CREATE,
-Filename => "0.0.sdb"
or die "Could not read file '0.0.sdb': $!\n";

foreach $key (keys %hash) {
   print "$key => $hash{$key}\n";
}

untie %hash;

Либо - другой вариант доступа через DB_File:
Код: Выделить всё
#!/usr/bin/perl
use warnings;
use strict;
use DB_File;

my %hash;
my $key;

tie %hash, "DB_File", "0.0.sdb"
  or die "Could not create file '0.0.sdb': $!\n";

foreach $key (keys %hash) {
   print "$key => $hash{$key}\n";
}

untie %hash;

Возвращает ошибку:
Could not create file '0.0.sdb': Нет такого файла или каталога

С самостоятельно созданной базой скрипт работает. Позволяет записать и прочитать пары ключ-значение.
Подозреваю, что причина в особенном формате базы, которая используется SasPlanet.
Может подскажите, какие ключи использовать, чтобы научиться читать эту базу?
lLan
Новичок
 
Сообщения: 8
Зарегистрирован: 29 ноя 2014, 15:36
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение zed » 29 ноя 2014, 18:10

У нас Btree, а не Hash:
Код: Выделить всё
$db  = tie %hash, 'BerkeleyDB::Btree', [OPTIONS] ;

И в опциях нужно указывать на env, который нужно создовать на шаг выше:
Код: Выделить всё
$env = new BerkeleyDB::Env [OPTIONS] ;
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение lLan » 29 ноя 2014, 21:11

Делаю так:
Код: Выделить всё
#!/usr/bin/perl
use warnings;
use strict;
use BerkeleyDB;

my %hash;
my $key;

my $env = new BerkeleyDB::Env
         -ErrFile => "/www/sasplanet/env1/err",
            -Config => { DB_DATA_DIR => "/www/sasplanet/env",
                         DB_LOG_DIR  => "/www/sasplanet/env",
                         DB_TMP_DIR  => "/www/sasplanet/env"
                        } or die "Could not create ENV: $!\n" ;
my $db  = tie %hash, 'BerkeleyDB::Btree',
         -Filename => "/www/sasplanet/z3/0/0/0.0.sdb",
         -Env => $env
         or die "Could not read file '0.0.sdb': $!\n" ;

foreach $key (keys %hash) {
   print "$key => $hash{$key}\n";
}

untie %hash;

Падает на 14 строке - Could not create ENV: Нет такого файла или каталога
Если убрать проверку, проигнорировать эту ошибку, то падает на 18 строке
Could not read file '0.0.sdb': Нет такого файла или каталога
Подскажите, что я делаю не так?
lLan
Новичок
 
Сообщения: 8
Зарегистрирован: 29 ноя 2014, 15:36
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение zed » 29 ноя 2014, 21:22

Как минимум, DB_DATA_DIR указан неверно. Вот дефолтный конфиг для env (файл DB_CONFIG):
Код: Выделить всё
set_flags DB_TXN_NOWAIT on
set_flags DB_TXN_WRITE_NOSYNC off
set_lg_dir .
set_data_dir ..
set_cachesize 0 2097152 1
set_lg_max 10485760
set_lg_bsize 2097152
log_set_config DB_LOG_AUTO_REMOVE on

Не понятно, зачем указывается DB_TMP_DIR. Плюс, почитайте свой ErrFile, раз уж вы его указали, может там что-то дельное написано?

Env можно создавать без опции -Config, поскольку при наличии файла DB_CONFIG настройки подхватываются оттуда, а в кэше Беркли, созданном в SAS, этот файл всегда присутствует. Единственное, что при создании env нужно указать его home, чтобы оно знало откуда брать конфиг и куда всё сохранять. У вас home никак не указан вообще.

И в SAS env создаётся с флагами:
Код: Выделить всё
        DB_CREATE_ or
        DB_RECOVER or
        DB_INIT_LOCK or
        DB_INIT_LOG or
        DB_INIT_MPOOL or
        DB_INIT_TXN or
        DB_REGISTER or
        DB_THREAD
zed
Гуру
 
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз.
Поблагодарили: 568 раз.

Re: Редактирование тайлов из кеша в berkeley?

Сообщение lLan » 29 ноя 2014, 22:56

Создаю ENV так:
Код: Выделить всё
my $env = new BerkeleyDB::Env
         -ErrFile => "/www/sasplanet/sat0/err",
         -Home => "/www/sasplanet/sat0/env",
         -Flags => DB_CREATE or DB_RECOVER or DB_INIT_LOCK or DB_INIT_LOG or DB_INIT_MPOOL or DB_INIT_TXN or DB_REGISTER or DB_THREAD
         #-Config => { DB_DATA_DIR => "/www/sasplanet/sat0",
                        # DB_LOG_DIR  => "/www/sasplanet/sat0/env",
         #}
                  or die "Could not create ENV: $!\n";

Эта часть кода заработала.
В err лежит фраза: "Build signature doesn't match environment"
А вот вторая часть кода не работает:
Код: Выделить всё
my $db  = tie %hash, 'BerkeleyDB::Btree',
         -Filename => "/www/sasplanet/sat0/z3/0/0/0.0.sdb",
         -Env => $env
          or die "Could not read file '0.0.sdb': $!\n" ;

Как альтернативу, я пробую обойтись без ENV. При помощи sdb_util.exe делаю Prepare cache for backup (reset LSN) [cmd: db_load -r lsn]
И после этого пытаюсь просто открыть полученный файл 0.0.sdb
Получаю ошибку Could not read file '0.0.sdb': Нет такого файла или каталога
Рядом создал базу test00.sdb - её читает и записывает отлично. Так что ошибки в пути к файлу быть не может.

О! вот так получилось сделать:
Код: Выделить всё
my $db  = tie %hash, 'BerkeleyDB::Btree',
         -Filename => "/www/sasplanet/sat0/z3/0/0/0.0.sdb",
         -Flags => DB_CREATE or DB_RECOVER or DB_INIT_LOCK or DB_INIT_LOG or DB_INIT_MPOOL or DB_INIT_TXN or DB_REGISTER or DB_THREAD,
         -Env => $env
          or die "Could not read file '0.0.sdb': $!\n" ;

Но не вывело ни одной пары ключ - значение. Копаю дальше.
Оказывается, что открытие базы работает минимально с двумя флагами:
Код: Выделить всё
-Flags => DB_REGISTER or DB_THREAD

Если хоть один убрать - не открывает.
Последний раз редактировалось lLan 29 ноя 2014, 23:23, всего редактировалось 1 раз.
lLan
Новичок
 
Сообщения: 8
Зарегистрирован: 29 ноя 2014, 15:36
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

След.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3