2016-08-17 7 views
0

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

Оригинальная карта является квадрат 2048 * 2048 пикс

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

координаты Карта устанавливаются с топором, у нотации от 0 до 100. 0, 0 наверху слева угловой и 100, 100 - внизу справа уголок карты. x = 50, y = 50 - lat = 0 °, lng = 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 
     } 

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

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

+0

Hi Ayantir, и добро пожаловать в переполнение стека. Когда вы говорите, что «эти двигатели используют проекцию Меркатора», что вы имеете в виду? Эти * двигатели * не упоминаются в остальной части вашего вопроса. –

+0

Вы уже ознакомились с этим примером Google? https://developers.google.com/maps/documentation/javascript/examples/map-coordinates –

+0

Спасибо, и извините, я использовал первый API Google Maps JS V3, а затем перешел в листок. Я видел эту страницу да, но ничего не нашел (она существует?), Чтобы изменить прогноз на GMaps. (поэтому я перешел в Лифлет, который казался более гибким). – Ayantir

ответ

1

Добро пожаловать на SO

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

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

Это позволит избежать 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. 
} 
+0

Хорошо, моя карта действительно не была установлена, как вы цитировали, но она работает! – Ayantir

+1

я плиточный мою карту, так что я делаю это: \t \t уаг = L.latLng ЮГО-ЗАПАД (-256, 0), \t \t северо-восток = L.latLng (0, 256), \t \t границы = L.latLngBounds (southWest, northEast); \t \t вар tamrielMap = L.map ('карта', { \t \t \t центр: [-128, 128], \t \t \t maxBounds: границы, \t \t \t увеличение: 3, \t \t \t minZoom: 3, \t \t \t MaxZoom: 3, \t \t \t CRS: L.CRS.Simple \t \t}); \t \t L.tileLayer ('../ source/png_SOH/alikr/alikr_base_ {z}/{x}/{y} .png'). AddTo (tamrielMap); \t \t функция долготы (х) { \t \t \t возвращение х/100 * 256; // Размер плитки \t \t} \t \t функция широты (у) { \t \t \t возврата (0 - г/100 * 256); \t \t} (извините за изменение уценки) – Ayantir