Картография в PoGO: OSM и s2
@uselesspogoЧто такое OSM
OSM — редкий пример карты, которая разрабатывается и поддерживается не крупной компанией, а сообществом, которое самостоятельно размечает, исправляет и дополняет картографические сведения. В Pokemon Go разметка OSM применяется практически везде: в отрисовке игровой карты; определении, какие покемоны появляются в округе (несты и биомы); распределении EX-рейдов и так далее.
Если же вы захотите как-либо менять данные OSM, у меня для вас есть очень важная просьба.
Не портьте карты. Не рисуйте огромных несуществующих парков. Не отмечайте тропинку автострадой только потому, что от этого покемоны вокруг станут лучше. OSM — сервис, подобный википедии, и может предоставить уникальное качество информации, если каждый участник сообщества будет предельно честен.
Если вы плохо понимаете, что вообще происходит в OSM, прочитайте Руководство новичка. Это важно, потому что если вы нарушите принципы тегирования полигонов, у вас ничего не выйдет. Тег water=lake ничем вам не поможет, если перед ним вы не обозначили тег natural=water.
Несты
Несты образовываются в основном на полигонах со следующими тегами:
leisure=park
leisure=recreation_ground
landuse=recreation_ground
leisure=pitch
leisure=garden
leisure=playground
leisure=golf_course
landuse=meadow
landuse=vineyard
landuse=orchard
landuse=nature_reserve
natural=heath
boundary=national_park
Есть мнение, что на полигонах со следующими тегами несты появляются реже:
natural=plateau
natural=heath
natural=moor
natural=scrub
landuse=farmland
landuse=grass
landuse=greenfield
Если вы обозначили какой-то полигон одним из вышеобозначенных тегов, это не гарантия, что во время следующей синхронизации серверов Ниа и OSM там появится нест, и это абсолютно нормально. Но существует мнение, что эту вероятность можно повысить следующими способами.
1) Никакого тега wood, forest, woodland и т.д. При наличии любого тега, обозначающего необлагороженную человеком территорию или водоём, этот полигон гарантированно не будет нестом. Вы можете сделать вообще всё для того, чтобы здесь был нест, но если в списке тегов обнаружился wood — ваши усилия напрасны. Похоже работают теги construction, school и wetlands с любым ключом, только они убирают вообще все спавны внутри полигона. Тег school может не блокировать спавны при взаимодействии с другими тегами, как именно это работает, точно не установлено. Примерно так же работает ключ «rail=».
2) Дайте название. Если у полигона есть название (если это парк, то ЦПКиО им. Горького), то вероятность того, что здесь будет нест, повышается. Конечно, если вы отметили этот полигон одним из указанных выше тегов и тут нет тегов, обозначающих необлагороженную человеком территорию. Если названия у парка нет ни в Google Maps, ни в OSM, то неста здесь не будет. Да-да, Ниа берут информацию одновременно из нескольких источников.
3) Дайте подробности. Проложите внутри тропинки (вы же помните, что всё должно соответствовать реальности?), обозначьте скамейки и т.д. Более подробные полигоны имеют тенденцию чаще становится нестами. Но нестом может стать и просто полигон с тегом «парк» и вообще без всего внутри.
Биомы и влияние на спавны
Не нестами едиными. Это набор теорий и наблюдений, связанных с тегами OSM, но не ведущих к появлению нестов. Это и к лучшему — лучше жить в электрическом биоме, чем каждый раз бегать в сквер неподалёку, где эти магниты в эту миграцию соизволили появиться.
Более-менее точная информация
1) industrial (building=, landuse=), а также всевозможные места отдыха рядом с большими водоёмами зачастую дают вместе электрические биомы. Магнемайты, волторбы и прочее счастье.
2) Население WaterBiome1 (сейчас принято разделять водные биомы на несколько видов, где интерес представляет только один из них), а именно Магикарпы, Фибасы и Вейлмеры спавнятся рядом с water=lake водоёмами. Если вы забыли отметить тег natural=water или отметили только его, то чуда не будет и Фибасов вы, скорее всего, не половите.
3) К дорогам, отмеченным как primary, secondary и tetriary, привязаны свои покемоны. Также пересечения дорог дают учащённые спавны. Полный список сказать сложно, требует дальнейшего изучения.
4) Тропинки «стягивают» к себе спавны, делая их более концентрированными. Это создаёт иллюзию увеличения количества спавнов, однако они всего лишь перемещаются.
Неточная информация, гипотезы
1) River также увеличивает спавн покемонов из WaterBiome1 — Магикарпов, Фибасов и Фейлмеров, даже при наличии тега tunnel=yes. Тег Stream таким свойством не обладает.
2) Тег man_made=breakwater значительно увеличивает спавн ледяных покемонов, включая Силов, Шеллдеров и Лапрасов.
3) Помимо своего участия в электрических биомах Поригоны также замечены в landuse=commercial.
Есть определённые теги, о которых мы знаем только то, что они как-то участвуют в формировании спавнов, но не знаем как именно. Аккуратно, некоторые из них могут блокировать спавны вовсе! Все нижеуказанные теги принадлежат ключу landuse=:
Basin, canal, cemetery, cinema, college, common, dam, ditch, dock, drain, farm, farmland, farmyard, garden, glacier, hospital, hotel, land, library, major_road, minor_road, ocean, parking_path, pitch, place_of_worship, playa, quarry, railway, reservoir, retail, riverbank, runway, sports_center, stadium, debug_tile_outline, debug_rile_surface, other, any.
S2 и что это такое
Когда-то давно для создания Google Maps была придумана система s2 ячеек, которая значительно упростила хранение и обработку информации. Ниа изначально были дочкой Google, так что они логично переняли у них эту технологию и активно используют её в Ingress и Pokemon Go. Как это работает? Представьте, что нашу планету, Землю, вписали в куб. Проекция каждой грани этого планетарного куба на Землю будет ячейкой s2 1 уровня. Теперь разделите каждую грань на 4 равные части — это будут ячейки s2 2 уровня. И так далее, каждая итерация разделения ячейки на 4 равных фрагмента увеличивает уровень ячейки.
Это интересно: CEO Ниантика Джон Хэнке некогда был руководителем команды, которая разрабатывала бэкенд Google Maps, в том числе и систему s2-ячеек. Достаточно забавно, что за лучшей в мире картой планеты с идеальным функционированием и забагованной насмерть игрой, где элементарные баги не чинят годами, стоит один и тот же человек.
Подробнее про кривую Гилберта (аккуратно, математика на английском!) можно почитать тут.
Но зачем это всё знать? Во-первых, практически все, связанное с геолокацией, в Pokemon Go определяется ячейками s2. А, во-вторых, границы ячеек любого уровня можно посмотреть. То есть мы можем узнать, где точно находятся границы разделения мира на региональные зоны, несты, какие арены Ниа всё же считает парковыми, а какие — нет. Итак, что нам уже известно?
- 6 уровень — геолок (когда в какой-то зоне нет никаких игровых объектов: ни покестопов, ни арен, ни покемонов).
- 6 уровень — распределение легендарных зверей (Суикун, Энтей и Райку осенью 2017).
- 9 уровень — распределение региональных покемонов.
- 10 уровень — определение места поимки покемона (подпись, например, Одинцово, Московская область, Россия).
- 10 уровень — определение погоды.
- 12 уровень — распределение EX-рейдов до 6 февраля
- 13 уровень — распределение EX-рейдов после 11 февраля.
- 14 уровень — назначение биомов (+ ещё пруф, + опровержение).
- 14 уровень — распределение неспонсорких арен. 1 покестоп — 0 арен. 2-5 покестопов — 1 арена. 6-19 покестопов — 2 арены. 20-34 покестопа — 3 арены.
- 15 уровень — «стёртые» на игровой карте территории из-за присутствия в ячейке военного объекта (Ниа уже перестали так делать).
- 16 уровень — объекты, видимые на игровой карте (покестопы, арены). От вашего местоположения строится круг с радиусом 500 метров. На игровой карте будут видны только те объекты, которые находятся в попавших в радиус ячейках. То есть вы можете увидеть арену в 700 метрах от вас, но не увидеть покестоп в 550 метрах — просто потому что он находится в другой ячейке. Таким образом, у игровой карты нет точной дальности прорисовки — всё зависит от того, где вы стоите.
- 17 уровень — распределение неспонсорских покестопов.
- 20 уровень — распределение спавнов.
- 20 уровень — определение тега арены (является ли она «парковой» или нет).
- 20 уровень — определение места получения яйца (не доказано).
Это интересно! Игроки, которым было интересно покопаться в механиках Pokemon Go, знают, что у каждого спавна существует свой собственный уникальный id. Так вот, все spawnpoint_id соответствуют id s2 ячеек в форме токенов. Серваки Ниа не хранят spawnpoint_id и их координаты одновременно, spawnpoint_id уже содержит в себе координаты (поскольку одновременно является токеном ячейки s2) и точное время спавна с точностью до миллисекунды (число от 0 до 3600000). Несколько месяцев после релиза эти spawnpoint_id даже присылались на клиент, что позволяло мгновенно собирать всю интересующую информацию о точках спавнов. Сама игра тоже показывала эти точки спавнов в виде шелестящих листочков, но вот времени появления покемона на них не говорила.
Сейчас же сканеры вынуждены определять точки спавнов эмпирическим путём. Где есть покемон — там точка спавна, а за минуту до деспавна игра убирает его из Nearby, позволяя определить примерное время исчезновения и появления покемонов на этой точке.
С этим же связан и один забавный баг. При смене погоды и перегенерации погодных покемонов сканер может подумать, что перед ним абсолютно новый покемон и "запутаться" в собственных таймингах, называя новое и неверное время исчезновения покемона. Верным же будет то время, которое сканер называл до смены погоды.
P.S. Не стоит путать spawnpoint_id со spawn_id, который может быть неуникальным и никак не связан с определением времени и места появления покемона.
Также ячейки применяются в Ingress. Там они отображаются на глобусе загрузочного экрана, в Интеле, в самом геймплее и даже имеют уникальные названия. Везде используются ячейки 6 уровня. Примеры таких ячеек: AF09-SIERRA-11 (Монпелье, Франция), NR04-DELTA-08 (Нижний Новгород, Россия), AM02-ECHO-01 (Альбукерке, Нью-Мексико, США).
Ресурсы для работы с OSM и s2:
- Разметка ячеек s2 от 1 до 20 уровня поверх Google Maps.
- Скрипт для проверки, является ли данная зона подходящей для EX-рейда.
- Ресурс с данными о покестопах и аренах, который умеет накладывать сетку s2 ячеек.
- Ресурс для объединения всей этой информации (вот англоязычный гайд как им пользоваться, пункт 4.2).
- JS-скрипт для экспорта координат арен.
Полезные ссылки:
Индекс Покелекций
Гайд по наградам на рейдах
Гайд по рейдам
Поддержать нас рублём:
• Через Яндекс.Деньги
• Через PayPal
• Через Patreon