Равноугольная карта в Интернете

Я планирую построить онлайн-карту для маркеров (пинов) игры, и мне не удается установить правильную широту моих маркеров.

Исходная карта представляет собой квадрат размером 2048*2048 пикселей.

Затем я получил маркеры (много тысяч)

Координаты карты задаются в виде x, y от 0 до 100. 0, 0 — это левый верхний угол, а 100, 100 — правый нижний угол карты. x=50, y=50 — широта = 0°, долгота = 0° (центр изображения).

Чтобы преобразовать мои обозначения в долготу, я использую эту функцию JS, она работает хорошо:

        function longitude(x)
        {
            var lng = 0
            if (x < 50) // Negative Longitude (West)
            {
                lng = (x - 50) / 50 * 180;
            }
            else // Positive Longitude (East)
            {
                lng = (50 - x) / 50 * 180;
            }
            return lng
        }

Но для широты это не работает, потому что эти двигатели используют проекцию Меркатора, а я нет.

Если у кого-то есть правильная формула, был бы очень признателен :(


person Ayantir    schedule 17.08.2016    source источник
comment
Привет, Аянтир, и добро пожаловать в Stack Overflow. Когда вы говорите, что эти двигатели используют проекцию Меркатора, что вы имеете в виду? Эти двигатели не упоминаются в остальной части вашего вопроса.   -  person Vince Bowdren    schedule 17.08.2016
comment
Спасибо и извините, я сначала использовал Google Maps JS API V3, а затем перешел на листовку. Я видел эту страницу да, но не нашел ничего (существует ли оно?), чтобы изменить проекцию на GMaps. (поэтому я перешел на Leaflet, который показался мне более гибким).   -  person Ayantir    schedule 17.08.2016


Ответы (1)


Добро пожаловать в СО!

Если вы используете Leaflet, вам следует указать параметр карты crs и использовать L.CRS.Simple:

Простой CRS, который напрямую отображает долготу и широту в x и y. Может использоваться для карт плоских поверхностей (например, игровых карт). Обратите внимание, что ось y по-прежнему должна быть инвертирована (идет снизу вверх).

Это позволит избежать проекции Web Mercator, особенно широты, которая, как вы поняли, является специальным вычислением ( см. связанную статью в Википедии для уравнения).

Затем вам остается правильно сопоставить ваши координаты x и y с вашими потребностями, особенно в отношении изображения вашей карты.

Например, предположим, что вы установили изображение карты как:

L.imageOverlay("imageUrl", [[0, 0], [256, 256]]).addTo(map);

(чтобы он соответствовал эквиваленту 1 плитки при уровне масштабирования 0)

Тогда у вас может быть преобразование, например:

function longitude(x) {
  return x / 100 * 256;
}

function latitude(y) {
  return 256 - y / 100 * 256; // Still need to revert y.
}
person ghybs    schedule 17.08.2016
comment
Хорошо, моя карта не была настроена так, как вы цитировали, но она работает! - person Ayantir; 17.08.2016
comment
Я замостил свою карту, поэтому делаю так: var southWest = L.latLng(-256, 0), NorthEast = L.latLng(0, 256), bounds = L.latLngBounds(southWest, NorthEast); var tamrielMap = L.map('map', { center: [-128, 128], maxBounds: границы, масштаб: 3, minZoom: 3, maxZoom: 3, crs: L.CRS.Simple }); L.tileLayer('../source/png_SOH/alikr/alikr_base_{z}/{x}/{y}.png').addTo(tamrielMap); функция долготы (x) { return x / 100 * 256; // Размер плитки } function latitude(y) { return (0 - y / 100 * 256); } (извините за редактирование уценки) - person Ayantir; 17.08.2016