#javascript #maps #latitude-longitude #map-projections
Вопрос:
Я хотел бы преобразовать позиции пикселей X, Y на карте Robinson projected в значения lat longs.
Я нашел функцию JavaScript, которая может преобразовывать длину широты в пиксели — https://github.com/afar/robinson_projection — но я не могу разработать (или найти реализацию) пикселей для lat longs.
Я нашел различные статьи о том, как работает проекция Robinson, например https://simplemaps.com/flash/robinson-projection-in-as3-gpl /
Я в основном застрял на этом этапе — математика, необходимая для вычисления длины широты из пикселя X, Y, выходит далеко за рамки моих ужасных математических способностей — и, несмотря на то, что я читал эти вещи довольно много раз, логика мне тоже не ясна.
Я предположил, что логика находится где-то в исходном коде d3-geo или d3-geo-projection, но ничего не смог найти при поиске по нему.
Глядя на Википедию, есть это:
Координаты точек на карте вычисляются следующим образом:
..но я действительно не понимаю, как поместить это в Javascript или определить «центральный меридиан, выбранный для карты», и даже тогда совпадают ли эти «координаты» со значениями пикселей?
Справочная информация:
Я пытаюсь создать очень легкую, простую функцию javascript, которая может выполнять lat long для пикселей X, Y и наоборот, как для проекций Меркатора, так и для проекций Робинсона — без использования d3 и т.д.. Я хочу, чтобы он был меньше, чем 2 КБ, уменьшенный и сжатый, без ограничений.
У меня Меркатор работает нормально — есть много примеров. Но все еще борется с проекцией Robinson.
Полный код, если это поможет, находится здесь: https://github.com/sc0ttj/component/pull/53
(Примечание, которое может повлиять на решение, которое мне нужно:
По какой-то причине мне пришлось изменить latSign = getSign(lat)
latSign = 0-getSign(lat)
, чтобы карта показывала правильный путь вверх, по вертикали — см. https://github.com/sc0ttj/component/pull/53/files#diff-dc34d0b1b3b6f92f7c3e71af717cf56a5f98923980b859c128d793991690ebdcR64.)
Я бесстыдно стою на плечах этих двух проектов: