将lat / lon转换为像素坐标?

时间:2013-09-16 23:19:43

标签: javascript geometry trigonometry projection

我正在尝试将lat / lon对转换为像素坐标。我找到了这个墨卡托投影,但我不明白代码。 x_adj,y_adj变量的因素是什么? 当我运行没有这些常量的代码时,我的lat / lon对不在我的地图上,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] Covert latitude/longitude point to a pixels (x,y) on mercator projection

2 个答案:

答案 0 :(得分:3)

这些变量来自哪里

选择这些变量以使计算的坐标与地图的背景图像相匹配。如果已知地图的投影参数,则可以计算它们。但我相信它们更有可能通过反复试验获得。

如何计算墨卡托投影

如果您想要更通用的方法来描述给定(非横向)Mercator map的世界部分,您可以使用此代码:

// 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。但由于省略的选择有点随意,我觉得上面的代码是描述事物最对称的方式。

答案 1 :(得分:-4)

以下是如何从您找到的函数中获取返回的变量X和Y ...

var xy=get_xy(56,34);

var X=xy.x;

var Y=xy.y;

现在X和Y包含坐标。

相关问题