Преобразовать широту / долготу в пиксельные координаты?

Я пытаюсь преобразовать пару широта / долгота в координату пикселя. Я нашел эту проекцию Меркатора, но я не понимаю код. Что такое переменная factor,x_adj, y_adj? Когда я запускаю код без этих констант, моя пара широта / долгота не отображается на моей карте, а координаты пикселей x и y - это не то, что мне нужно.

function get_xy(lat, lng)
{
var mapWidth=2058;
var mapHeight=1746;
var factor=.404;
var x_adj=-391;
var y_adj=37;
var x = (mapWidth*(180+lng)/360)%mapWidth+(mapWidth/2);
var latRad = lat*Math.PI/180;
var mercN = Math.log(Math.tan((Math.PI/4)+(latRad/2)));
var y = (mapHeight/2)-(mapWidth*mercN/(2*Math.PI));
return { x: x*factor+x_adj,y: y*factor+y_adj}
}

Источник: http://webdesignerwall.com/tutorials/interactive-world-javascript-map/comment-page-1?replytocom=103225

[2] Скрывать точку широты / долготы в пикселях (x,y) на проекции меркатора

2 ответа

Решение

Откуда взялись эти переменные

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

Как вычислить проекцию Меркатора

Если вы хотите более общий метод описания раздела мира, который показывает данная (не поперечная) карта Меркатора, вы можете использовать этот код:

// This map would show Germany:
$south = deg2rad(47.2);
$north = deg2rad(55.2);
$west = deg2rad(5.8);
$east = deg2rad(15.2);

// This also controls the aspect ratio of the projection
$width = 1000;
$height = 1500;

// Formula for mercator projection y coordinate:
function mercY($lat) { return log(tan($lat/2 + M_PI/4)); }

// Some constants to relate chosen area to screen coordinates
$ymin = mercY($south);
$ymax = mercY($north);
$xFactor = $width/($east - $west);
$yFactor = $height/($ymax - $ymin);

function mapProject($lat, $lon) { // both in radians, use deg2rad if neccessary
  global $xFactor, $yFactor, $west, $ymax;
  $x = $lon;
  $y = mercY($lat);
  $x = ($x - $west)*$xFactor;
  $y = ($ymax - $y)*$yFactor; // y points south
  return array($x, $y);
}

Демонстрационная версия этого кода доступна по http://ideone.com/05OhG6.

Что касается соотношения сторон

Настройка с $xFactor != $yFactor производит своего рода растянутую проекцию Меркатора. Это больше не является конформным (сохраняющим угол). Если кто-то хочет получить истинную проекцию Меркатора, он может опустить любое из первых шести назначений переменных, то есть тех, которые определяют ограничивающий прямоугольник, или тех, которые описывают размер полученной карты, а затем использовать некоторые вычисления, чтобы выбрать их, удовлетворяющие $xFactor == $yFactor, Но поскольку выбор, который следует опустить, является произвольным, я чувствую, что приведенный выше код является наиболее симметричным способом описания вещей.

Вот как получить возвращенные переменные X и Y из функции, которую вы нашли...

var xy=get_xy(56,34);

var X=xy.x;

var Y=xy.y;

Теперь X и Y содержат координаты.

Другие вопросы по тегам