Возникла задача отдавать карты используя static api яндекс.карт.
Как известно, координаты можно закодировать в base64, алгоритм приведен по ссылке: http://api.yandex.ru/maps
Так как сайт разрабатывается для мобильников, то на javascript не рассчитываю. Поэтому конвертирую координаты в base64 на сервере.
Сайт строится на Django, следовательно, написал метод на Python для конвертации. Метод привожу ниже, если есть какие-то замечания по улучшению, то милости просим.
#Метод для кодирования вершин ломаной
#аргумент: строка с координатами разделенными запятой (пример: 37.593578,55.735094,37.592159,55.732469,37.589374, 55.734162)
def encodeToBase64(aPoints):
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw xyz0123456789-_="
coordTuple = eval(aPoints)
coordList = []
diffList = []
reverseString = ""
encodedString = ""
for i in range(len(coordTuple)):
coordList.append(int(coordTuple[i] * 1000000))
diffList.append(toBin(coordList[0]))
diffList.append(toBin(coordList[1]))
for index in range(len(coordList)):
if index+2 < len(coordList):
diffList.append(toBin(coordList[index+2] - coordList[index]))
binString = "".join(diffList)
for i in range(len(binString)/32):
fourByteString = binString[i*32:(i+1)*32]
byte1 = fourByteString[0:8]
byte2 = fourByteString[8:16]
byte3 = fourByteString[16:24]
byte4 = fourByteString[24:32]
reverseFourByteString = byte4 + byte3 + byte2 + byte1
reverseString += reverseFourByteString
for i in range(len(reverseString)/6):
encodedString += keyStr[int(reverseString[i*6:(i+1)*6], 2)]
remainder = len(binString)%6
if remainder:
lastString = reverseString[-1*remainder:]
for i in range(6 - remainder):
lastString += "0"
encodedString += keyStr[int(lastString, 2)]
for j in range(0, 6-remainder, 2):
encodedString += "="
return encodedString
#Метод для пробразования целого в 32-х битное двоичное предстваление
#аргументы: целое, count - количество битов
def toBin(x, count=32):
return "".join(map(lambda y:str((x>>y)&1), range(count-1, -1, -1)))