После того, как все макеты были готовы, пришло время верстать. Коля Маторин, профессионал своего дела, принялся смотреть кастомизацию Яндекс.Карт и разбираться с причудами дизайна от Дани. Все детали пользовательского интерфейса были разработаны собственноручно. Pure jQuery, без использования jQuery UI и готовых элементов управления. Верстка выполнялась с учетом последующих расширений, таких как чат и встроенные руководства. С бэкендом поначалу все было просто — Python+Django, а также авторизация через «ВКонтакте».
Однако уже через три дня, когда PokemonGoMap стал крупнейшим русскоязычным ресурсом данной тематики, мы поняли, что не обойтись без оптимизации на обоих сторонах: как на фронтенде, так и на бэкенде. С пользовательской стороны было добавлено кэширование областями и сокращено число запросов к серверу, также мы не забыли про оптимизацию отрисовки (да здравствуют layout).
Мы также решили сделать запросы к базе более простыми и менее объемными. Тут нам на помощь пришла серверная grid-кластеризация. Осталась только одна маленькая проблема — 20 тысяч маркеров, разбросанных по всему СНГ, которые нужно было объединить в кластеры, причем за приемлемое время. Мы начали с прямого поиска, но результат был удручающим. Бинарный поиск дал лучшие показатели, однако они нас все еще не устраивали.
Спустя пару чашек кофе, решение было найдено — интерполяционный поиск по массиву отрезков. Применение данного метода при тестировании позволило нам распределить 1,4 тысячи меток по миллиону квадратов всего за 76 секунд (с учетом создания объектов в базе).
Последним шагом оптимизации было разделение всей карты мира на квадраты и запуск алгоритма для быстрого вычисления необходимости обработки каждого из квадратов.Таким образом, у нас получилась карта, которая способна выдерживать достаточно большие нагрузки.