swift - 从一个 UTM 区域到另一个 UTM 区域的投影点
问题描述
我目前正在做一个项目,我们必须根据两个(用户输入)点的已知位置来计算一个点的位置。
现在的问题是用户可以在不同的 UTM 区域中提供两个点,因此我们必须将其中一个点投影到另一个系统(至少我们是这样做的。)
我用 Python 编写了一个参考实现来测试它,现在我们想在 iOS 的生产环境中使用这个特性。好像这里唯一的 swift proj 库已经过时了,不能用了。
我们环顾了一圈,但没有找到关于如何在没有额外软件的情况下将一个点从一个区域投影到另一个区域的描述。
您知道这是否可行,或者是否有最新的 swift 项目库?
解决方案
从一个 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
推荐阅读
- .net - SignalR 的响应中的 C 值是什么意思?
- sql - 分母中的Count(*) -1 - sql
- javascript - BrowserStack Options App:执行期间的键值对错误
- amazon-web-services - 修复 Amazon EKS 集群中的 DataDog 代理拥塞问题
- sql - 将数据转换为带有编号字段的 JSON
- javascript - 为什么 Paper.js 的 `smooth: Continuous` 函数没有按预期工作?
- wordpress - 带有 pod 和 elementor 的 WordPress 目录
- python - 有条件地更新/插入字典的替代方法
- c++ - 如何正确解决 Windows API 和 DirectX API 以及微软开发的其他 API 之间的宏冲突 (GetMessage)
- java - 使用 @Value 注释的构造函数调用如何工作?