I forked tileserver-gl并修改了静态端点,以返回中心纬度/经度,并放大图像的响应标题。我的应用程序始终将此端点称为styles / klokantech-basic / static / auto / ...?path = ...
然后根据我的应用程序要求,使用这些参数在选定的经/纬度坐标上在图像上绘制新标记。
为了将lat / lng坐标投影到距左上角的像素(x,y)偏移处,我使用了Pythonic伪代码中给出的以下转换:
Let (h, w) be the height and width of the image returned by tileserver-gl.
px_radius = (256 * (2 ** zoom)) / (2 * PI) # pixels
dy_rad = radians(lat - center_lat) # angle from center on y-axis
x = w/2 + px_radius * radians(lng - center_lng)
y = h/2 - px_radius * 1/2 * ln[(1 + sin(dy_rad)) / (1 - sin(dy_rad))]
为了测试这一点,我使用犹他州的轮廓作为路径来调用静态端点。然后,我的代码使用上述变换在状态边界的左上角和右下角绘制一个标记。就像在image中一样,每个点的x坐标都与东西边界线对齐,但是y坐标的两端均不足。
由于比例尺比仅在y方向上要小,我怀疑这种差异可能是由于tileserver-gl和墨卡托使用基于地球的椭球体(赤道周围的震荡)而产生的)。请不要抱抱我-我现在正在吸管。
我花了几个小时研究tileserver-gl中的代码和mapbox/sphericalmercator中的代码。看来球墨镜使用以下代码在将(lat,lng)坐标转换为像素之前将其转换:
var to3857 = proj4('EPSG:3857');
var toDataProj = proj4(info.proj4);
dataProjWGStoInternalWGS = function(xy) {
return to3857.inverse(toDataProj.forward(xy));
};
要对此进行测试,我尝试使用Python库pyproj(用于“ Python投影”),如下所示:
proj = Proj(proj='merc', ellps='WSG84', lat_ts=lat_ctr)
(x_center, y_center) = proj(lng_center, lat_center) # meters
(x, y) = proj(lng, lat) # meters
x = w/2 + (x - x_center) * px_radius / 6378137.0
y = h/2 - (y - y_center) * px_radius / 6378137.0
这一次,x和y生成的像素坐标均未达到路径坐标。
很明显,我不知道如何使用pyproj库来模仿tileserver-gl在做什么。我还可以使用“ ellps”的其他值吗?