Цель
Я пытаюсь создать приложение, в котором вся карта мира разбивается на большое количество шестиугольников. Эти шестиугольники, однажды созданные, всегда будут покрывать одну и ту же область на карте. Затем, учитывая определенные географические координаты, шестиугольник будет отображаться на карте, если эти координаты будут расположены в его границах. Эти шестиугольники должны быть очень маленькими, каждая сторона должна быть прибл. 50 м - вот и главная проблема.
Первая попытка
Моя первая идея заключалась в том, чтобы предварительно сгенерировать шестиугольную сетку, в которой каждый шестиугольник был бы невидимым, и после выяснения, находится ли координата в границах, просто измените стиль шестиугольника. Это работает, если длина стороны шестиугольника действительно велика (сотни километров). Однако в моем случае приложению не хватит памяти при попытке нарисовать очень маленькие шестиугольники даже для меньшей части карты.
// Attempting to cover the whole map in small hexagons
turf.hexGrid([-179.99, -89.99, 179.99, 89.99], 0.2);
Первая попытка, но с изюминкой
Моя вторая идея состояла в том, чтобы использовать параметр mask
для hexGrid()
, чтобы я по-прежнему генерировал шестигранную сетку с неизменными координатами шестиугольника, но пытался бы визуализировать шестиугольники только в пределах небольшой области карты (например, области, видимой на карте). Это тоже не представляется возможным, поскольку даже создание такой сетки (без отрисовки ее на карте) оказывается слишком большим потреблением ресурсов.
// Attempting to cover the whole map in small hexagons only within a given area (mask)
turf.hexGrid([-179.99, -89.90, 178.99, 88.90], 30, {
mask: polygon([[[20, 60], [21, 60], [22, 62], [22, 63], [20, 60]]]),
});
Однако это приведет к очень перекошенным шестиугольникам, что заставляет меня думать, что попытка создать сетку шестиугольников для всего мира, как правило, является плохой идеей.
Оптимистические расчеты
Моей последней попыткой было создать один шестиугольник в верхнем левом углу карты и использовать его координаты, чтобы вычислить, сколько шестиугольников поместится между этим первым шестиугольником и любыми заданными координатами.
Эти вычисления почти работают, но из-за округления в большую сторону или, возможно, из-за ошибки в том, как я вычисляю расстояния (вручную), позиционирование отключается на все большее число, чем дальше координаты от первого шестиугольника.
Пример из реальной жизни. Самый близкий пример того, чего я хочу достичь, - это запущенная игра под названием «Run an Empire». Кажется, что шестигранная сетка загружается по запросу и только вокруг области, в которой он находится. Судя по всему, эта сетка не имеет зазоров, которые мешали бы шестиугольникам идеально соединяться.
Еще один интересный момент: рисование шестиугольников на карте мира будет искажать их по мере продвижения на север. Похоже, этого не происходит в вышеупомянутой игре (снимок экрана ниже). Означает ли это, что размеры шестиугольника жестко запрограммированы, возможно, они нарисованы на другой проекции карты, в которой перекоса не происходит?
Главный вопрос
Учитывая географические координаты, такие как местоположение GPS, как можно надежно создать гексагональную сетку, чтобы при создании другой гексагональной сетки на основе другого набора координат эти две сетки идеально перекрывались? Я открыт для решения этой проблемы любыми инструментами, не обязательно Turf или Mapbox.