首页 > 解决方案 > 从一个 UTM 区域到另一个 UTM 区域的投影点

问题描述

我目前正在做一个项目,我们必须根据两个(用户输入)点的已知位置来计算一个点的位置。

现在的问题是用户可以在不同的 UTM 区域中提供两个点,因此我们必须将其中一个点投影到另一个系统(至少我们是这样做的。)

我用 Python 编写了一个参考实现来测试它,现在我们想在 iOS 的生产环境中使用这个特性。好像这里唯一的 swift proj 库已经过时了,不能用了。

我们环顾了一圈,但没有找到关于如何在没有额外软件的情况下将一个点从一个区域投影到另一个区域的描述。

您知道这是否可行,或者是否有最新的 swift 项目库?

标签: swiftgisproj

解决方案


从一个 UTM 区域到另一个 UTM 区域的投影点

您可能很清楚,由于您已经在 Python 中编写了参考实现,因此分两步完成:

1.将UTM中的一个点Unproject到Geographic Coordinates,即从[E, N, Zone, Hemisphere]到纬度、经度(φ, λ);

接着,

2.将得到的地理坐标投影到UTM(另一个Zone,不同于1),即从纬度、经度(φ,λ)到UTM坐标(E,N)。

由于您没有提到任何基准转换,因此 PROJ 库对于完成此任务变得过大了。此外,问题不在于如何从 Swift 调用C。

更重要的是,对于大多数主流语言(Java、Javascript、Python、C#),甚至在 SO 上都有很多 UTM 实现,或者至少是可以轻松适应 UTM 的 Transverse Mercator 实现(UTM 系统使用 Transverse墨卡托作为制图投影)。

对于 Swift,我在 SO 上找不到任何东西,但在 GitHub 上我可以。

https://github.com/wtw-software/UTMConversion

转换发生在自定义结构 UTMCoordinate 和 CoreLocation 的 CLLocationCoordinate2D 和 CLLocation 之间。

如果您不使用WGS84库使用的默认值,甚至可以指定自定义基准。

import CoreLocation
import UTMConversion

let utmCoordinate = UTMCoordinate(northing: 7034313, easting: 569612, zone: 32, hemisphere: .northern)
let datum = UTMDatum(equitorialRadius: 6378137, polarRadius: 6356752.3142)
let coordinate = utmCoordinate.coordinate(datum: datum)

可以通过将库输出与 Python 实现的结果进行比较来访问准确性。

如果您对结果不满意,您可以随时修改源代码,特别是横轴墨卡托投影(硬数学)所在的以下文件:

https://github.com/wtw-software/UTMConversion/blob/master/UTMConversion/TMCoordinate.swift


推荐阅读