只要您可以假设您的纬度/经度坐标形成一个矩形网格(这应该是城市规模的合理近似值,尽管对于更大的区域或非常精确的数据会失败),您可以假设坐标之间的转换为射影变换。有关如何计算相应的变换矩阵并使用它来转换坐标的详细信息,请参阅这篇文章(或者如果您愿意继续使用 SO,请参阅这篇文章)。
基于这篇文章,我用sage做了一些计算:
def pm1(a, b, c, d):
M = Matrix([a , b, c]).transpose()
f = M.adjoint() * d
return M*diagonal_matrix(f)
def pm(a1, a2, b1, b2, c1, c2, d1, d2):
return pm1(a2, b2, c2, d2)*(pm1(a1, b1, c1, d1).adjoint())
P1 = vector(QQ, [0, 0, 1])
P2 = vector(QQ, [0, 1, 1])
P3 = vector(QQ, [1, 1, 1])
P4 = vector(QQ, [1, 0, 1])
Q1 = vector(QQ, [40698291, -74079051, 1000000]) # Upper left
Q2 = vector(QQ, [40659855, -73979638, 1000000]) # Lower left
Q3 = vector(QQ, [40855232, -73835582, 1000000]) # Lower right
Q4 = vector(QQ, [40882919, -73940263, 1000000]) # Upper right
M = pm(Q1, P1, Q2, P2, Q3, P3, Q4, P4)
M.change_ring(RDF)/1e40
结果公式如下所示:
z = 559.910562534*lat - 539.510073656*lon - 64123.7576703
x = (-5629.59680416*lat - 2176.56828347*lon + 67876.8560722)/z
y = ( 8466.61769096*lat - 11263.0392472*lon - 1178932.12938)/z
结果坐标x
和y
从零到一测量,其中零分别表示左侧。上边缘,一个在右边。下边缘。
如果矩形网格的假设还不够,您需要了解有关用于创建地图的投影的详细信息,以便将地图位置与球坐标相关联。