2017-01-22 24 views
1

所以我有一些座標看起來像更好的方法來分析和String轉換DMS座標翻一番斯威夫特

N47° 15' 36.75",E011° 20' 38.28",+001906.00

和我創建了一個類來解析並將它們轉換成翻倍

struct PLNWaypointCoordinate { 
    var latitude: Double = 0.0 
    var longitude: Double = 0.0 

    init(coordinateString: String) { 
     self.latitude = convertCoordinate(string: coordinateString.components(separatedBy: ",")[0]) 
     self.longitude = convertCoordinate(string: coordinateString.components(separatedBy: ",")[1]) 
    } 

    private func convertCoordinate(string: String) -> Double { 
     var separatedCoordinate = string.characters.split(separator: " ").map(String.init) 

     let direction = separatedCoordinate[0].components(separatedBy: CharacterSet.letters.inverted).first 
     let degrees = Double(separatedCoordinate[0].components(separatedBy: CharacterSet.decimalDigits.inverted)[1]) 
     let minutes = Double(separatedCoordinate[1].components(separatedBy: CharacterSet.decimalDigits.inverted)[0]) 
     let seconds = Double(separatedCoordinate[2].components(separatedBy: CharacterSet.decimalDigits.inverted)[0]) 

     return convert(degrees: degrees!, minutes: minutes!, seconds: seconds!, direction: direction!) 
} 

    private func convert(degrees: Double, minutes: Double, seconds: Double, direction: String) -> Double { 
     let sign = (direction == "W" || direction == "S") ? -1.0 : 1.0 
     return (degrees + (minutes + seconds/60.0)/60.0) * sign 
    } 

} 

我的問題是,正如標題所說,是有進行這種轉換一個更好,更安全的方式?

末方法我已經在這裏撿到。對不起,但我找不到引用它的鏈接。

+3

我投票結束這個問題作爲題外話,因爲我認爲它可能會更好地問http://codereview.stackexchange.com。好問題,但! –

+0

發表於CR現在:http://codereview.stackexchange.com/questions/153291/parsing-and-converting-dms-coordinates-from-string-to-double。 –

回答

0

當與前面的答覆從https://codereview.stackexchange.com/questions/153291/parsing-and-converting-dms-coordinates-from-string-to-double

struct PLNWaypointCoordinate { 
    var latitude: Double 
    var longitude: Double 

    init(latitude: Double, longitude: Double) { 
     self.latitude = latitude 
     self.longitude = longitude 
    } 

    init?(coordinateString: String) { 
     let components = coordinateString.components(separatedBy: ",") 
     guard components.count >= 2, 
      let latitude = PLNWaypointCoordinate.convertCoordinate(coordinate: components[0], 
                    positiveDirection: "N", 
                    negativeDirection: "S"), 
      let longitude = PLNWaypointCoordinate.convertCoordinate(coordinate: components[1], 
                    positiveDirection: "E", 
                    negativeDirection: "W") 
      else { 
       return nil 
     } 
     self.init(latitude: latitude, longitude: longitude) 
    } 

    private static func convertCoordinate(coordinate: String, 
              positiveDirection: String, 
              negativeDirection: String) -> Double? { 
     // Determine the sign from the first character: 
     let sign: Double 
     let scanner = Scanner(string: coordinate) 
     if scanner.scanString(positiveDirection, into: nil) { 
      sign = 1.0 
     } else if scanner.scanString(negativeDirection, into: nil) { 
      sign = -1.0 
     } else { 
      return nil 
     } 

     // Parse degrees, minutes, seconds: 
     var degrees = 0 
     var minutes = 0 
     var seconds = 0.0 
     guard scanner.scanInt(&degrees),   // Degrees (integer), 
      scanner.scanString("°", into: nil), // followed by °, 
      scanner.scanInt(&minutes),   // minutes (integer) 
      scanner.scanString("'", into: nil), // followed by ' 
      scanner.scanDouble(&seconds),  // seconds (floating point), 
      scanner.scanString("\"", into: nil), // followed by ", 
      scanner.isAtEnd      // and nothing else. 
      else { return nil } 

     return sign * (Double(degrees) + Double(minutes)/60.0 + seconds/3600.0) 
    } 
} 

感謝您的幫助大家!