在maptile-gl生成的地图上将纬度,经度转换为图像x / y

时间:2019-12-16 19:09:37

标签: cartography geodesic-sphere tileserver-gl

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”的其他值吗?

0 个答案:

没有答案