воскресенье, 10 января 2010 г.

Offilne maps indexer for rmaps

Захотелось залить офлановые карты на свой андроид...
Слил уже готовые карты с android.com.ua aka g-phone.in.ua, за что отдельное спасибо. Но при первом использовании tar-а приложение (rmaps) должно проиндексировать архив, и когда это происходило, приложение висло, помогало только извлечение аккумулятора. Систематики не было. Меньший, менее детальны архив, с картой Украины, удалось с н-го раза проиндексировать. Но Киев нет. Так родился скрипт на питоне для индексации данных карт на ПК и с последующей заливкой на моблу...



http://pastebin.com/f52f1de6b


from optparse import OptionParser
import os
import shutil
import tarfile
import time
import sqlite3

def main():
    usage = "usage: %prog [options] rmapsDir mapTarFile"
    parser = OptionParser(usage)
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose")
    
    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    

    (rmapsDir, mapTarFile) = args

    tmpFolder = "/tmp/rmaps_index_upader/";

    indexDbFile = rmapsDir + '/data/index.db'
    indexDbFileTmp = tmpFolder + "/index.db"

    (mapTarPath, mapTarName) = os.path.split(mapTarFile)
    mapTarFileTmp = tmpFolder + mapTarName

    zooms = []

    if not os.path.exists(indexDbFile):
        print "Index file not found. Exiting..."
        return
    
    if not options.quiet :
        print "Copying files to /tmp folder..."
        
    if not os.path.exists(tmpFolder):
        os.makedirs(tmpFolder)
    shutil.copyfile(indexDbFile, indexDbFileTmp)
    shutil.copyfile(mapTarFile, mapTarFileTmp)

    dbTableName = "cahs_" + mapTarName.replace('.', '_'); #cahs!!! idk if it will work with correct name

    if not options.quiet :
        print "Opening db..."
    
    con = sqlite3.connect(indexDbFileTmp)
    cur = con.cursor()
    

    cur.execute("DROP TABLE '"+dbTableName+"';")
    con.commit()
    cur.execute("CREATE TABLE '"+dbTableName+"' (name VARCHAR(100), offset INTEGER NOT NULL, size INTEGER NOT NULL, PRIMARY KEY(name) );")
    con.commit()

    if not options.quiet :
        print "Parsing tar file and filling db..."

    tar = tarfile.open(mapTarFileTmp, "r")
    mapTarFileSize = os.path.getsize(mapTarFileTmp);
    for tarinfo in tar:
        
        
        if tarinfo.isreg():
            cur.execute("INSERT INTO '" + dbTableName + "' VALUES ('" + tarinfo.name + "', " + str(tarinfo.offset_data) + ", " + str(tarinfo.size) + ");")

        elif tarinfo.isdir():
            zooms.append(int(tarinfo.name[:-1]))

        else:
            print "unknow file founded."
    tar.close()
    
    minZoom = min(zooms)
    maxZoom = max(zooms)

    cur.execute("INSERT OR REPLACE INTO ListCashTables VALUES('" + dbTableName + "',"+ str(time.time()).replace(".","") +"0,"+ str(mapTarFileSize) +", "+str(minZoom)+","+str(maxZoom)+")");

    if not options.quiet :
        print "Commiting..."

    con.commit()

    if not options.quiet :
        print "Uploading index back to rmaps dir..."

    indexDbFileBkup = indexDbFile + "_bkup_" + time.strftime("%y%m%d%H%M%S")
    shutil.copyfile(indexDbFile, indexDbFileBkup)
    shutil.copyfile(indexDbFileTmp, indexDbFile)

    if not options.quiet :
        print "Done."
        print "You have a backup file ", indexDbFile + "_bkup_" + time.strftime("%y%m%d%H%M%S") , " in case of problems you can restore it."
        print "Thank you, have a nice day!"


def dump(obj):
    for attr in dir(obj):
        print "obj.%s = %s" % (attr, getattr(obj, attr))

if __name__ == "__main__":
    main()



пример использования:

>python rmaps_index_update.py /media/NO_NAME/rmaps/  /media/NO_NAME/rmaps/maps/Kiev.tar
Copying files to /tmp folder... Opening db... Parsing tar file and filling db... Commiting... Uploading index back to rmaps dir... Done. You have a backup file /media/NO_NAME/rmaps//data/index.db_bkup_100110182159 in case of problems you can restore it. Thank you, have a nice day!


UPD: Tested only on Samsung Galaxy

3 комментария:

  1. приветствую!
    дык может дадите (выложить) готовый для "залития" файл (переделаный) для Киева?

    ОтветитьУдалить
  2. Офигеть просто! Все, блин, всё знают, кроме меня

    ОтветитьУдалить
  3. За статью премного благодарен, все по делу, достаточно много кто это использует

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.