我对这段代码进行了一些更新,使其能在Swift3中运行(主要使用 .truncatingRemainder(dividingBy: )
而不是 %
),并且还扩展了它的输出为DMM,并包括将DMM和DMS转换为DD的函数!
extension CLLocationCoordinate2D {
var latitudeMinutes: Double { return (latitude * 3600).truncatingRemainder(dividingBy: 3600) / 60 }
var latitudeSeconds: Double { return ((latitude * 3600).truncatingRemainder(dividingBy: 3600)).truncatingRemainder(dividingBy: 60) }
var longitudeMinutes: Double { return (longitude * 3600).truncatingRemainder(dividingBy: 3600) / 60 }
var longitudeSeconds: Double { return ((longitude * 3600).truncatingRemainder(dividingBy: 3600)).truncatingRemainder(dividingBy: 60) }
var dms:(latitude: String, longitude: String) {
return (String(format:"%d°%d'%.1f\"%@",
Int(abs(latitude)),
Int(abs(latitudeMinutes)),
abs(latitudeSeconds),
latitude >= 0 ? "N" : "S"),
String(format:"%d°%d'%.1f\"%@",
Int(abs(longitude)),
Int(abs(longitudeMinutes)),
abs(longitudeSeconds),
longitude >= 0 ? "E" : "W"))
}
var dmm: (latitude: String, longitude: String) {
return (String(format:"%d°%.4f'%@",
Int(abs(latitude)),
abs(latitudeMinutes),
latitude >= 0 ? "N" : "S"),
String(format:"%d°%.4f'%@",
Int(abs(longitude)),
abs(longitudeMinutes),
longitude >= 0 ? "E" : "W"))
}
}
var coord = CLLocationCoordinate2D(latitude: 41.40338, longitude: 2.17403)
coord.latitude
coord.longitude
coord.latitudeMinutes
coord.latitudeSeconds
coord.longitudeMinutes
coord.longitudeSeconds
coord.dms.latitude
coord.dms.longitude
coord.dmm.latitude
coord.dmm.longitude
这些转换函数也允许输入时不指定方向,而只提供正数或负数:
func DMStoDD(latDeg: Double, latMin: Double, latSec: Double, latDir: String?, longDeg: Double, longMin: Double, longSec: Double, longDir: String?) -> CLLocationCoordinate2D {
var latitude = CLLocationDegrees()
if latDeg > 0 {
latitude = CLLocationDegrees(latDeg + ((latMin*60)/3600) + (latSec/3600))
if latDir == "S" {latitude *= -1}
}
else{
latitude = CLLocationDegrees((latDeg * -1) + ((latMin*60)/3600) + (latSec/3600))
latitude *= -1
}
var longitude = CLLocationDegrees()
if longDeg > 0 {
longitude = CLLocationDegrees(longDeg + ((longMin*60)/3600) + (longSec/3600))
if longDir == "W" {longitude *= -1}
}
else{
longitude = CLLocationDegrees((longDeg * -1) + ((longMin*60)/3600) + (longSec/3600))
longitude *= -1
}
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
coord = DMStoDD(latDeg: 41, latMin: 24, latSec: 12.2, latDir: "", longDeg: 2, longMin: 10, longSec: 26.5, longDir: "")
coord.latitude
coord.longitude
将DMM转换为DD
func DMMtoDD(latDeg: Double, latMin: Double, latDir: String?, longDeg: Double, longMin: Double, longDir: String?) -> CLLocationCoordinate2D {
var latitude = CLLocationDegrees()
if latDeg > 0 {
latitude = CLLocationDegrees(latDeg + ((latMin*60)/3600))
if latDir == "S" {latitude *= -1}
}
else{
latitude = CLLocationDegrees((latDeg * -1) + ((latMin*60)/3600))
latitude *= -1
}
var longitude = CLLocationDegrees()
if longDeg > 0 {
longitude = CLLocationDegrees(longDeg + ((longMin*60)/3600))
if longDir == "W" {longitude *= -1}
}
else{
longitude = CLLocationDegrees((longDeg * -1) + ((longMin*60)/3600))
longitude *= -1
}
return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
coord = DMMtoDD(latDeg: 41, latMin: 24.2028, latDir: "N", longDeg: 2, longMin: 10.4418, longDir: "E")
coord.latitude
coord.longitude