我用Google搜索了自己的死讯。 我试图在Mercator和平面非投影(网格)地图中编写2个PHP函数,它们将从Lat和Long返回X和Y. 我遇到的每个计算都存在问题,假设您的地图在拐角处有相同的纬度和经度,然后结果以米为单位。啊
这就是我所拥有的......不同大小的地图,不同的纬度,4角的长度。 我下载了Proj4 php端口,但是没有文档和更多代码,我需要的,我已经过了...
帮助!!
答案 0 :(得分:0)
这假设您的纬度/长坐标是十进制值,并且不会在地图的可见范围内从北/南或东/西改变方向。如果他们这样做,这些值应该保持为单一格式,并且为负值(例如: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
或者某种形式应该可以解决问题。
答案 1 :(得分:0)
上一个答案中的比例方法不起作用。墨卡托投影是非线性的。
以下是我如何将生成的图片叠加到Google或Bing地图上。在我的例子中,我创建了一个多边形的GD图像,它将成为叠加层。在GD库中执行多边形比使用地图提供程序API快得多。
首先,设置从标准纬度经度到WGS84投影的缩放比例。度数为墨卡托x-y坐标,单位为米。
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;
然后,对于每个纬度/经度,我想计算图像上的实际X-Y坐标。
// $ 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