Convert MapKit latitude and longitude to DMS format

后端 未结 4 830
清歌不尽
清歌不尽 2021-02-02 04:35

I am able to determine the latitude and longitude of a location in the center of a map with the following:

func TargetGridReference(outletMapView_PrimaryTargetLo         


        
4条回答
  •  广开言路
    2021-02-02 04:56

    Unfortunately there is no automatic conversion but you can easily create one as follow:

    Swift 4 or later

    func coordinateToDMS(latitude: Double, longitude: Double) -> (latitude: String, longitude: String) {
        let latDegrees = abs(Int(latitude))
        let latMinutes = abs(Int((latitude * 3600).truncatingRemainder(dividingBy: 3600) / 60))
        let latSeconds = Double(abs((latitude * 3600).truncatingRemainder(dividingBy: 3600).truncatingRemainder(dividingBy: 60)))
    
        let lonDegrees = abs(Int(longitude))
        let lonMinutes = abs(Int((longitude * 3600).truncatingRemainder(dividingBy: 3600) / 60))
        let lonSeconds = Double(abs((longitude * 3600).truncatingRemainder(dividingBy: 3600).truncatingRemainder(dividingBy: 60) ))
    
        return (String(format:"%d° %d' %.4f\" %@", latDegrees, latMinutes, latSeconds, latitude >= 0 ? "N" : "S"),
                String(format:"%d° %d' %.4f\" %@", lonDegrees, lonMinutes, lonSeconds, longitude >= 0 ? "E" : "W"))
    }
    

    let dms = coordinateToDMS(latitude: 48.8582487759147, longitude: 2.2945180844931)
    
    print(dms.latitude)  // "48° 51' 29.6956" N"
    print(dms.longitude) // "2° 17' 40.2651" E"
    

    You can also extend CLLocationCoordinate2D to get your latitude/longitude DMS description:

    import MapKit
    extension FloatingPoint {
        var minutes:  Self {
            return (self*3600)
                .truncatingRemainder(dividingBy: 3600)/60
        }
        var seconds:  Self {
            return (self*3600)
                .truncatingRemainder(dividingBy: 3600)
                .truncatingRemainder(dividingBy: 60)
        }
    }
    extension CLLocationCoordinate2D {
        var dms: (latitude: String, longitude: String) {
            return (String(format:"%d° %d' %.4f\" %@",
                           Int(abs(latitude)),
                           Int(abs(latitude.minutes)),
                           abs(latitude.seconds),
                           latitude >= 0 ? "N" : "S"),
                    String(format:"%d° %d' %.4f\" %@",
                           Int(abs(longitude)),
                           Int(abs(longitude.minutes)),
                           abs(longitude.seconds),
                           longitude >= 0 ? "E" : "W"))
        }
    }
    

    let coord = CLLocationCoordinate2D(latitude: 48.8582487759147, longitude: 2.2945180844931)
    
    coord.dms.latitude   // "48° 51' 29.6956" N"
    coord.dms.longitude  // "2° 17' 40.2651" E"
    

提交回复
热议问题