我已经用谷歌搜索了自己。我正在尝试编写 2 个 php 函数,它们将在墨卡托和平面非投影(网格)地图中从纬度和经度返回 X 和 Y。问题是我遇到的每个计算都假设您的地图在拐角处具有相同的纬度和经度,然后结果以米为单位。啊
这就是我所拥有的 .. 4 个角落的不同尺寸、不同纬度、经度的地图。我下载了 Proj4 php 端口,但是由于零文档和我需要的更多代码,我不知所措...
帮助 !!
这假定您的纬度/经度坐标是十进制值,并且不会在地图的可见范围内从北/南或东/西改变方向。如果是这样,这些值应保持为单一格式,并设为负值(例如:1.0 S 将变为 -1.0 N)
首先,您将设置以下变量,或者使用 PHP 查找它们,或者如果您已经在脚本中知道它们:
$width=//width of image
$height=//height of image
$long_at_left=//Longitude of left-hand coordinates
$long_at_right=//Longitude of right-hand coordinates
$lat_at_left=//Latitude of left-hand coordinates
$lat_at_right=//Latitude of right-hand coordinates
$target_long=//Longitude you want to find
$target_lat=//Latitude you want to find
然后使用:
$xtarget=$target_long-$long_at_left;
$ytarget=$target_lat-$lat_at_top;
$xdist=$long_at_left-$long_at_right;
$ydist=$lat_at_top-$lat_at_bottom;
$x=round(($xtarget/$xdist)*$width); //Percentage of distance times width
$y=round(($ytarget/$ydist)*$height); //Percentage of distance times height
或者那种形式的东西应该可以解决问题。
上一个答案中的比例方法不起作用。墨卡托投影是非常非线性的。
以下是我将生成的图像叠加到 Google 或 Bing 地图上的方法。就我而言,我正在创建一个将作为叠加层的多边形的 GD 图像。在 GD 库中处理多边形比地图提供程序 API 快得多。
首先,设置从标准纬度经度到 WGS84 投影的比例。度数以米为单位的墨卡托 xy 坐标。
http://gisgeography.com/wgs84-world-geodetic-system/
// $minlat = 最小图像纬度
// $minlon = 最小图像经度
// $maxlat = 最大图像纬度
// $maxlon = 最大图像经度
// $latbounds = 图像高度(以像素为单位)
// $lonbounds = 图像宽度(以像素为单位)
$lonrange = abs($maxlon - $minlon);
$WGS84min = log(tan((90.+$minlat)*M_PI/360.))/(M_PI/180.);
$WGS84min = (int) ($WGS84min * 2037598.34/180);
$WGS84max = log(tan((90.+$maxlat)*M_PI/360.))/(M_PI/180.);
$WGS84max = (int) ($WGS84max * 2037598.34/180);
$WGS84diff = $WGS84max - $WGS84min;
$WGS84factor = $latbounds/$WGS84diff;
然后对于每个纬度/经度,我想计算图像上的实际 XY 坐标。
// $lon1 = 要转换为图像坐标的点的经度
// $lat1 = 要转换为图像坐标的点的纬度
X 很简单
$x = (int) ((abs($lon1-$minlon)/$lonrange)*$lonbounds);
Y有点难,先计算到WGS84,然后映射到图像。最后一步,反转 Y 坐标,因为显示顺序是倒置的。
$y1 = log(tan((90.+$lat1)*M_PI/360.))/(M_PI/180.);
$y1 = $y1 * 2037598.34/180;
$y1 = (int) (($y1- $WGS84min)*$WGS84factor);
$y = $latbounds - $y1;
图像文件完成后,使用 GD 保存图像,然后使用 API 库中的示例显示您的叠加层。
https://developers.google.com/maps/documentation/javascript/examples/overlay-simple