Pomalé vykreslování se zapnutými POIs: vyřešeno!
Napsal: 30.7.2007, 14:47
Všiml jsem si že TT6 se po zapnutí POIs, které mají pár tisíc položek (CZ-Restaurace, CZ-Geocaching) silně zpomaluje. Koukal jsem se na .OV2 soubory, a obsahují pouze záznamy typu 2, tj nejsou tam žádné bounding boxy (záznam typu 1), takže TT musí vždy procházet celý seznam. Zkusil jsem ze souborů udělat hierarchické s bboxy, kupodivu fungují a je to řádově rychlejší. Podle toho že při downloadu je značná prodleva, úměrná zhruba velikosti souboru, soudím že se OV2 generuje dynamicky. Bylo by možné, aby optimalizované .OV2 soubory generoval přímo server POI.CZ? Já je generuju tímhle kódem- make_tree() vytvoří ze seznamu 3-tuple (N, E, text) strom, a save_tree() ho uloží v .OV2 formátu.
Kód: Vybrat vše
def make_tree(l):
if len(l) <= threshold: # default je 8
return sum([14 + len(x[2]) for x in l]), l
lo = list(l[0][:2])
hi = [lo[0] + 1, lo[1] + 1]
for i in l:
for d in range(2):
lo[d] = min(lo[d], i[d])
hi[d] = max(hi[d], i[d] + 1)
d = int(hi[1] - lo[1] > hi[0] - lo[0])
t = (lo[d] + hi[d]) / 2
t1 = make_tree([x for x in l if x[d] < t])
t2 = make_tree([x for x in l if x[d] >= t])
return 21 + t1[0] + t2[0], lo, hi, t1, t2
def save_tree(t):
if len(t) == 2:
for i in t[1]:
sys.stdout.write(
pack('<BIII', 2, 14 + len(i[2]), i[1], i[0]) + i[2] + '\0')
return
sz, lo, hi, t1, t2 = t
sys.stdout.write(pack('<BIIIII', 1, sz, hi[1], hi[0], lo[1], lo[0]))
save_tree(t1)
save_tree(t2)