Задача: існує svg-файл (що містить географічну карту світу в еквіректангулярній проекції — тобто, x та у відповідають широті й довготі), який треба перетворити в іншу проекцію (скажімо, карти материкової й океанічної півкуль, чи ще якусь). Всі елементи зображення задаються тегами path.
Перетворення координат задається функцією.
▼мій індусокод на поточній стадії розробки
import re
def svgtransform(inf, outf, transform):
'''
Замінити всі координати в svg path, використовуючи
ф-ю transform(old_x, old_y)->(new_x, new_y)
Всі відносні координати конвертуються в абсолютні.
TODO: transform=translate....
'''
lastxy=[0,0]
def re_transform(m):
c, x, y=m.groups()
# if relative, convert to absolute:
if 'a'<c<'z':
x+=lastxy[0]
y+=lastxy[1]
c=c.upper()
new_x, new_y = transform(x, y)
res="%s %s,%s"%(c, new_x, new_y)
lastxy[:]=(x,y)
return res
if isinstance(inf, str):
inf=open(inf)
if isinstance(outf, str):
outf=open(outf, 'w')
in_quot=False
for s in inf:
ss=re.split(r'(^| d=")([^"]*)' if in_quot else r'( d=")([^"]*)', s)
for i in range(2, len(ss), 3):
lastxy[:]=(0,0)
ss[i]=re.sub(r'([a-zA-Z])\s*([0-9.e\-+]+)\s*([0-9.e\-+]+)', re_transform, ss[i])
in_quot=not ss[-1]
outf.write(''.join(ss))
outf.close()
inf.close()
В чому складність: по-перше, окрім відносних координат в svg path, зміщення координат також може задаватися атрибутом transform — його теж треба позбутися, а всі координати перетворити на абсолютні. По-друге, для багатьох проекцій карту треба кроїти на частини (тобто, лінія розрізу може проходити через окремий path-об'єкт).
Питання: чи існують пітонівські бібліотеки, призначені для подібних маніпуляцій з svg?