2017-01-22 1 views
1
에 두 배로 문자열에서 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) 
    } 
} 

에서 감사합니다!