+  HandyCache форум
|-+  Главная категория» Дополнения, плагины» GE.lua - расширение HC для кэширование Google Earth
Имя пользователя:
Пароль:
Страниц: 1 ... 6 7 [8] 9   Вниз
  Отправить эту тему    Печать  
Автор Тема: GE.lua - расширение HC для кэширование Google Earth  (Прочитано 82377 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #140 : 06 Июль 2009, 07:29:43 »

Вот пример как реализовать разбрасывание по папкам кэша, который можно подправить под свой вкус.
Вот спасибо!! Сегодня будем опять поковырять. Улыбка

hc.cache_file_name в этом контексте только для чтения, поэтому присваивание ничего не делает.
Хм. Хотелось бы понять - а в каком контексте переменная таки становится доступной для записи? Я пробовал по-разному - а результат всегда был один: невозможность перекрытия пути в кэше, подготовленного HC стандартными средствами. Хотя, исходя из примера данного автором HC:
Код:
function conv()
    local s= hc.prepare_url(hc.url)

    local server= re.find(s, [[([^\\]+)\\?.*$]], 1)
    local domen= re.find(server, [[([^\.]*)\.[^\.]*$]], 1)
    local prefix=''
    if domen then prefix= domen:sub(1,1)..'\\' end

    hc.cache_file_name= prefix..s
    hc.monitor_string = hc.monitor_string.."Cache "
end
это таки должно работать даже при прямом указании нового статического пути ручками (насколько я понимаю из кода). Просьба ткнуть носом, где я неправ и почему у меня не получается? В чем заключается секрет окрытия hc.cache_file_name на запись, чего я не сделал в моем случае выше и у меня оно не работает?  Смущен
Сообщить модератору   Записан
DenZzz
Модератор
*****

Репутация: +179/-11
Offline Offline

Сообщений: 5589



« Ответ #141 : 06 Июль 2009, 08:32:14 »

Просьба ткнуть носом, где я неправ и почему у меня не получается? В чем заключается секрет окрытия hc.cache_file_name на запись, чего я не сделал в моем случае выше и у меня оно не работает?

HCExtensions.html читал? Запись в переменную hc.cache_file_name возможна только из события URLToFileNameConverting. А ты из какого события писать пытаешься?
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #142 : 06 Июль 2009, 09:21:18 »

HCExtensions.html читал? Запись в переменную hc.cache_file_name возможна только из события URLToFileNameConverting. А ты из какого события писать пытаешься?
Упс...Слона-то я и не приметил...Пасиб.
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #143 : 07 Июль 2009, 22:34:47 »

Вот пример как реализовать разбрасывание по папкам кэша, который можно подправить под свой вкус.
Только не помню, начиная с какой сборки НС это будет работать.
Модифицировал. Всё почти работает и уже раскидывает по папкам как надо - конвейер по скачке кэша заработал в прежнем порядке, спасибо всем присутствующим.
Осталось только два мелких вопроса сугубо косметического свойства, на которые знатокам не составит труда ответить - а у меня не хватает ума додумать самостоятельно ввиду поверхностного знакомства с LUA.

Итак, имеем:
Код:
function conv()
if hc.url:find('+', 1, true) then
return
end
local url = re.replace(hc.url, [[http://kh(mdb)?\.google\.com/(flatfile|dbRoot\.v\d+)\?]], '_GE_/')
url = re.replace(url, [[_/\K(?!db=)]], 'Earth/')
url = re.replace(url, [[_/\Kdb=tm&]], 'History/')
url = re.replace(url, [[_/\Kdb=sky&]], 'Sky/')
url = re.replace(url, [[_/\Kdb=mars&]], 'Mars/')
url = re.replace(url, [[_/\lf-0-icons]], 'Icons/')
url = re.replace(url, [[_/\hl=(..|..-..)\&gl=..]], 'dbRoot.v5/dbRoot')
url = re.replace(url, [[/(?=f1-\d+-i\.(\d+))]], '/Images/\\1\\0')
url = re.replace(url, [[/(?=f1-\d+-d\.(\d+)\.(\d+))]], '/Textures/\\1/\\2/')
url = re.replace(url, [[/(?=f1c-\d+-t\.(\d+))]], '/Terrains/\\1\\0')
url = re.replace(url, [[/(?=f1c-\d+-d\.(\d+)\.(\d+))]], '/Layers/\\1/\\2/')
url = re.replace(url, [[/(?=q2-\d+-q\.(\d+))]], '/Queries/\\1\\0')
local digits = re.find(url, [[/\w+-(\d+)-]], 1)
if digits then
NameToXY(digits)
local Xi=math.floor(X/1024)
local Yi=math.floor(Y/1024)
hc.monitor_string = 'GE: Z=' .. #digits .. ', X=' .. X .. ', Y=' .. Y .. ' (Xi=' .. Xi .. ',Yi=' .. Yi ..')'
url = re.replace(nil, nil, '/z' .. #digits .. '/' .. Xi .. '/x' .. X .. '/' .. Yi .. '\\0')
end
hc.cache_file_name = hc.prepare_url(url)
end

function NameToXY(digits)
     -- переменная digits - строка с цифро-именем: digits='01230123'

local level = #digits -- переменная level - число знаков в digits
X = 0  -- инициализация X,Y и если Level=1 то и
Y = 0  -- ответ функции
for i=2,level do -- цикл от 2 до Level
          X = X*2      -- ответ увеличиваем в 2 раза
          Y = Y*2
          local ch = digits:sub(i,i)
          if ch == '0' then
               Y = Y+1     -- к Y прибавляем 1 если символ '0'
          elseif ch == '1' then
               X = X+1     -- если символ '1' и к X и к Y прибавляем 1
               Y = Y+1
          elseif ch == '2' then
               X = X+1
          end
end
     return X, Y
end

Вопросы:
1. Дбрут в настоящее время кладется в ./Earth/hl=ru-RU&gl=ru. Как заставить его жить в ./Earth/dbRoot.v5/dbroot (<-- это файл без расширения, а не папка)
2. Иконки в настоящее время кладутся в ./Earth/z1/0/x0/0/lf-0-icons/*.png. Как заставить их жить в ./Earth/Icons/*.png? Насколько я понимаю, так как в "lf-0-icons" есть цифра - то на нее и срабатывает "if digits then"...?
Я опять что-то намудрил с условиями в скрипте? Грустный

Всё остальное работает и раскладывается просто изумительно. Спасибо.
Сообщить модератору   Записан
Михаил
Модератор
*****

Репутация: +303/-14
Offline Offline

Сообщений: 5397



« Ответ #144 : 08 Июль 2009, 07:59:20 »

Можно попробовать так (сам не проверял).

* 12.rar (0.78 Кб - загружено 36 раз.)
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #145 : 13 Июль 2009, 21:05:11 »

Можно попробовать так (сам не проверял).
Спасибо, заработало. Вопрос с сортировкой тайлов можно считать закрытым.

Михаил, не подскажете, как средствами LUA прочитать байт из (существующего на диске) файла по определенному смещению? Нужно для организации "складирования" дбрутов.
Спасибо.
Сообщить модератору   Записан
Михаил
Модератор
*****

Репутация: +303/-14
Offline Offline

Сообщений: 5397



« Ответ #146 : 14 Июль 2009, 22:32:59 »

Можно попробовать так (смещение offset считаем от нуля, вместо 'c:\\tt.txt' пишем свой путь к файлу):
Цитировать
   local ff=io.open('c:\\tt.txt', 'rb')
   ff:seek('set', offset)
   value = string.byte(ff:read(1))
   ff:close()
В value искомый байт.
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #147 : 16 Июль 2009, 21:36:41 »

Можно попробовать так (смещение offset считаем от нуля, вместо 'c:\\tt.txt' пишем свой путь к файлу):
Цитировать
   local ff=io.open('c:\\tt.txt', 'rb')
В value искомый байт.
Спасибо. Уже сделал раскладку дбрутов, но есть маленькая, но последняя проблемка: io.open() работает только с абсолютными путями, насколько я понимаю? При указании абсолютного пути ручками в io.open - всё работает. Но это не очень красиво, хотелось бы полного автоматизма. Как мне получить абсолютный путь до файла в кэше в функции conv() Вашего скрипта? Это событие URLToFileNameConverting, в котором я к сожалению не могу читать hc.cache_file_name... Максимум, что добился - это нашел доступный hc.prepare_url(url), но это относительный путь уже в кэше, а не абсолютный - и его io.open() не жрет... Грустный

Также надо будет решить вопрос с двойными слэшами в абсолютном пути у Вас в примере в предыдущей мессаге, но с одиночными - в выходе hc.prepare_url(url).

Вот кусок кода. Помогите, пожалуйста.
Код:

        ...Ваш код...
        url = re.replace(url, [[_/\Kdb=sky&]], 'Sky/')
url = re.replace(url, [[_/\Kdb=mars&]], 'Mars/')

if url:find('hl=', 1, true) then    -- Обработка dbRoot
        url = re.replace(url, [[/hl=]], '/dbRoot.v5/hl=')

-- local source = hc.prepare_url(url)                                  <-- относительный путь '_GE_\dbroots.v5\hl=ru-RU&gl=ru'. Не работает!
local source='C:\\cache\\_GE_\\dbroots.v5\\hl=ru-RU&gl=ru'         <-- прописанный ручками абсолютный путь. Работает.

local file = io.open(source, 'rb')
file:seek('set', 5)
local value1 = string.byte(file:read(1))
file:seek('set', 6)
local value2 = string.byte(file:read(1))
file:close()
local version = 256*value1 + value2     -- версия дбрута

local destination = source .. "." .. version
local file = io.open(destination, 'rb')
if file then
file:close() -- проверяем на наличие в кэше, если есть - закругляемся
  hc.monitor_string = 'GE: dbRoot версии ' .. version .. ', есть в архиве'
else
local file1 = io.open(source, 'rb') -- копируем файл в архив
local data = file1:read("*all")
file1:close()
local file2 = io.open(destination, 'wb')
file2:write(data)
file2:close()
hc.monitor_string = 'GE: dbRoot версии ' .. version .. ', помещено в архив'
end
end

        url = re.replace(url, [[/lf-0-icons]], '/Icons')
url = re.replace(url, [[/(?=f1-\d+-i\.(\d+))]], '/Images/\\1\\0')
        ... итд далее Ваш код

Спасибо.
« Последнее редактирование: 16 Июль 2009, 21:42:54 от Parasite » Сообщить модератору   Записан
Михаил
Модератор
*****

Репутация: +303/-14
Offline Offline

Сообщений: 5397



« Ответ #148 : 16 Июль 2009, 22:17:13 »

Почему эти действия выполняются в процедуре определения имени файла (обработчике URLToFileNameConverting)? Так будет ошибка.
Надо их выполнять в обработчике поступающего тела файла:
- начали получать из сети файл дбрут
- прочли его 6 и 7 байты, по ним определили version
- если файл dbroot.version уже есть в кэше, то прерываем скачивание файла и отдаем из кэша
- если файла нет в кэше, то пишем его туда под именем dbroot.version

А все-таки, как применить накопленные дбруты предыдущих версий?
« Последнее редактирование: 16 Июль 2009, 22:46:12 от Михаил » Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #149 : 16 Июль 2009, 22:41:19 »

Почему эти действия выполняются в процедуре определения имени файла (обработчике URLToFileNameConverting)? Так будет ошибка.
Надо их выполнять в обработчике поступающего тела файла
Разве не красивее иметь логику раскладки дбрутов именно там же, где и логику раскладки всего остального? Ведь вопрос-то всего-то в пути до файла, и всё заработает. Я бы хотел по возможности получить абс.путь до файла в кэше именно в рамках conv(), если это технически возможно. Но вот не знаю, возможно ли... Давайте все-таки рассмотрим этот вариант, если возможно. Улыбка

А все-таки, что дает накопление дбрутов разных версий?
Так ведь отвечалось же уже... http://handycache.ru/component/option,com_smf/Itemid,10/topic,2364.msg19035/#msg19035
Сообщить модератору   Записан
Михаил
Модератор
*****

Репутация: +303/-14
Offline Offline

Сообщений: 5397



« Ответ #150 : 16 Июль 2009, 23:03:25 »

Цитировать
Так ведь отвечалось же уже...
Сорри, неправильно вопрос поставил. Изменил. Каков механизм применения накопленных дбрутов предыдущих версий? Этот механизм тоже надо делать в расширении?

Цитировать
Разве не красивее иметь логику раскладки дбрутов именно там же, где и логику раскладки всего остального? Ведь вопрос-то всего-то в пути до файла, и всё заработает. Я бы хотел по возможности получить абс.путь до файла в кэше именно в рамках conv(), если это технически возможно. Но вот не знаю, возможно ли... Давайте все-таки рассмотрим этот вариант, если возможно.
Здесь правильность страдает, поэтому о красоте говорить не приходится. Если не убедил, то:
Цитировать
local source = hc.cache_path .. hc.prepare_url(url)
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #151 : 16 Июль 2009, 23:16:31 »

Цитировать
Так ведь отвечалось же уже...
Сорри, неправильно вопрос поставил. Изменил. Каков механизм применения накопленных дбрутов предыдущих версий? Этот механизм тоже надо делать в расширении?
Нет, слава Аллаху. 99.9% времени накопленные дбруты будут "просто лежать". Улыбка
Они нужны в крайне немногочисленных ситуациях (но таки нужны), кои можно обработать и ручками по необходимости - переименовать один отдельно взятый файл ручками проще простого. Например, для ГЕ-трешки новые дбруты противопоказаны (еррорит и падает), но кое-какие задачи в ГЕ проще делать именно в трешке, для чего оную трешку нужно пустить - для чего и скормить ей дбрут, какой доктор прописал.

Цитировать
Разве не красивее иметь логику раскладки дбрутов именно там же, где и логику раскладки всего остального? Ведь вопрос-то всего-то в пути до файла, и всё заработает. Я бы хотел по возможности получить абс.путь до файла в кэше именно в рамках conv(), если это технически возможно. Но вот не знаю, возможно ли... Давайте все-таки рассмотрим этот вариант, если возможно.
Здесь правильность страдает, поэтому о красоте говорить не приходится. Если не убедил, то:
Цитировать
local source = hc.cache_path .. hc.prepare_url(url)
О. Спасибо, попробую.
« Последнее редактирование: 16 Июль 2009, 23:37:03 от Parasite » Сообщить модератору   Записан
zed
Постоялец
***

Репутация: +4/-0
Offline Offline

Сообщений: 135


WWW
« Ответ #152 : 17 Июль 2009, 12:38:44 »

- начали получать из сети файл дбрут
- прочли его 6 и 7 байты, по ним определили version
- если файл dbroot.version уже есть в кэше, то прерываем скачивание файла и отдаем из кэша
- если файла нет в кэше, то пишем его туда под именем dbroot.version
А мне такая логика нравится. Можете её реализовать в скрипте?
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #153 : 17 Июль 2009, 20:35:06 »

А мне такая логика нравится. Можете её реализовать в скрипте?
Ога. А вот и скрипт, который уже работает - Михаилу, как гуру, в виде полуфабриката. У меня мозгов на вышеуказанный алгоритм уже не хватит.

PS: так как в скрипте присутствует "фича" Улыбка анализа версии дбрута в момент генерации пути в кэше, еще ДО покладания нового скачиваемого дбрута в кэш - то анализируется версия не та, которая качается, а та которая уже присутствует в кэше на данный момент. Задним числом, так сказать. Улыбка
Учитывая то, что дбруты на гугле меняются далеко не раз в минуту - это абсолютно не напрягает. Некрасиво конечно, но уж на сколько хватило моих знаний в LUA... работает, и то хлеб. Авось кто из гуру таки доработает напильником.  Непонимаю

* GE.rar (3.93 Кб - загружено 50 раз.)
Сообщить модератору   Записан
Михаил
Модератор
*****

Репутация: +303/-14
Offline Offline

Сообщений: 5397



« Ответ #154 : 17 Июль 2009, 22:06:20 »

Parasite, zed
Тайлы GoogleMaps соответствуют тайлам GoogleEarth? Если да, то при заходе на maps.google.ru можно, получается, брать из кэша GoogleEarth и наоборот?
Сообщить модератору   Записан
zed
Постоялец
***

Репутация: +4/-0
Offline Offline

Сообщений: 135


WWW
« Ответ #155 : 17 Июль 2009, 22:30:02 »

Тайлы GoogleMaps соответствуют тайлам GoogleEarth?
Э... категорически нет. Мало того, что тайлы GE и GM в разной географической проекции, так GE тайлы ещё и зашифрованы. Но в принципе, все алгоритмы известны, и при желаниии можно написать скрипт приводящий в соответствие GE и GM налету, но вот только это на быстродействии сильно скажется. И уже есть рабочий вариант преобразования налету GE тайлов из кэша, в GM-подобные тайлы: GeoCacher + SAS.Планета.
Сообщить модератору   Записан
zed
Постоялец
***

Репутация: +4/-0
Offline Offline

Сообщений: 135


WWW
« Ответ #156 : 21 Июль 2009, 15:50:05 »

Так-с, у гугла появился ещё один режим - Луна. Идут url вида: http://khmdb.google.com/flatfile?db=moon&f1-0311132-i.3+f1-0311201-i.3&v=1
Для того, чтоб скрипт начал сортировать и этот сервер, в GE.lua добавляем правило:
Код:
url = re.replace(url, [[_/\Kdb=moon&]], 'Moon/')
Сообщить модератору   Записан
Parasite
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 66



« Ответ #157 : 24 Июль 2009, 22:43:26 »

Авось кто из гуру таки доработает напильником.  Непонимаю
Господа, есть ли смысл ожидать "обнапильненного" скрипта в гуру-обработке в скором времени, или довольствоваться тем что есть? Улыбка Благо что работает вроде как...
Сообщить модератору   Записан
crazyyyk
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 1


« Ответ #158 : 13 Декабрь 2009, 14:55:42 »

Подскажите какая на данный момент последняя версия плагина для GE? А то у меня стоит 0.06 и HC 1.0.0.232 и при работе с GE он все берет из интернета, из кеша ничего не берется, может как то настроить нужно?
Сообщить модератору   Записан
Parcher
Постоялец
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #159 : 25 Декабрь 2009, 10:48:27 »

Еще одно наблюдение: при переустановке системы (Vista на 7)  GoogleEarth не может отобразить глобус. В мониторе НС написано, что все грузиться из кэша и так продолжается до тех пор, пока не выйдешь из  GoogleEarth. Так же при работе через НС некоторые ранее просмотренные места не могут отображаться (по той же причине), а как только отключаешь "чтение из кэш", то сразу идет загрузка. Если нужен лог, то скину, но навряд ли он что-нибудь покажет.
Сообщить модератору   Записан
Страниц: 1 ... 6 7 [8] 9   Вверх
  Отправить эту тему    Печать  

 
Перейти в: