1

我正在尝试使用 Proj4 库来转换不同的地图投影以与 Apple Map Kit 一起使用。出于测试目的,我想我将从使用 Proj4 复制 MKMapPointForCoordinate 函数开始。

这些是我正在使用的定义:

+proj=longlat +ellps=WGS84 +datum=WGS84 +nadgrids=@null +no_defs
+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs

当我使用坐标 47.5、-97.3 时,Proj4 转换返回:

6028687.013553943,-10834169.44145535

但是 MKMapPointForCoordinate 返回: 61646948.12444445, 93835627.5941129 相差一个数量级。

Map Kit 的世界尺寸为 268435456 x 268435456

4

1 回答 1

0

具有以下定义:

+proj=longlat +ellps=WGS84 +datum=WGS84 +nadgrids=@null +no_defs

+proj=merc +lon_0=0 +lat_ts=0 +x_0=134217728.0 +y_0=134217728.0 +a=6378137 +b=6378137 + k=1.0 +units=m +nadgrids=@null +no_defs

还有一个步骤可以缩小 Mapkit 和 Proj4 之间的差距:x 中的线性回归和 y 中的线性回归。

let const_x = 114180219.657211
let a1_x    = -0.850708929130513

private func mk_x_forProjX(projX: Double) -> Double {
    return (projX - self.const_x) / (self.a1_x + 1)
}

private func proj_x_forMKX(mkX: Double) -> Double {
    return mkX * (self.a1_x + 1) + self.const_x
}

let const_y = 154255236.342789
let a1_y    = -1.14929107086948

private func mk_y_forProjY(projY: Double) -> Double {
    return (projY - self.const_y) / (self.a1_y + 1)
}

private func proj_y_forMKY(mkY: Double) -> Double {
    return mkY * (self.a1_y + 1) + self.const_y
}

合身并不完美,但精度足以令人满意。

最后一点,在转换度数 <-> 弧度时一定要使用 Double,即:

static func DegreesToRadians (value:Double) -> Double {
    return value * M_PI / 180.0
}

static func RadiansToDegrees (value:Double) -> Double {
    return value * 180.0 / M_PI
}
于 2016-02-22T08:26:41.807 回答