본문 바로가기
#모바일 [Mobile]/iOS

[iOS] 기상청 (Korea Meteorological Administration) Grid XY

by cy_mos 2019. 6. 27.
반응형

📄 기상청 Grid XY란?

한반도와 서해 5도를 포함한 우리나라와 인근 해역으로 남쪽으로는 이어도, 동쪽으로는 독도, 서쪽 끝으로는 백령도 까지 포함하고 있다. 이 영역은 5km×5km의 격자 간격으로 총 37,697개의 격자를 포함한다. (동서 149개 ×남북 253개).

 

기상청 (Korea Meteorological Administration) Grid XY


📄 기상청 Grid XY Swift Source Code

fileprivate struct lamc_parameter
{
    var Re:Float    /* 사용할 지구반경 [Km]    */
    var grid:Float  /* 격자간격 [Km]        */
    var slat1:Float /* 표준위도 [Degree] */
    var slat2:Float /* 표준위도 [Degree] */
    var olon:Float  /* 기준점의 경도 [Degree] */
    var olat:Float  /* 기준점의 위도 [Degree] */
    var xo:Float    /* 기준점의 X좌표 [격자거리] */
    var yo:Float    /* 기준점의 Y좌표 [격자거리] */
    
    init()
    {
        self.Re    = 6371.00877         // 지도반경
        self.grid  = 5.0                // 격자간격 (km)
        self.slat1 = 30.0               // 표준위도 1
        self.slat2 = 60.0               // 표준위도 2
        self.olon  = 126.0              // 기준점 경도
        self.olat  = 38.0               // 기준점 위도
        self.xo    = 210/self.grid      // 기준점 X좌표
        self.yo    = 675/self.grid      // 기준점 Y좌표
    }
}

class ConvertXY
{
    fileprivate var x:Float = 0.0, y:Float = 0.0
    fileprivate var map:lamc_parameter = lamc_parameter()
    
    final func convertMap(lon:Double, lat:Double) -> (mapX:Int, mapY:Int)
    {
        var PI:Double, DEGRAD:Double
        var re:Double, olon:Double, olat:Double, sn:Double, sf:Double, ro:Double
        var slat1:Double, slat2:Double, ra:Double, theta:Double
        
        PI = asin(1.0) * 2.0
        DEGRAD = PI / 180.0
        
        re = Double(self.map.Re / self.map.grid)
        slat1 = Double(self.map.slat1) * DEGRAD
        slat2 = Double(self.map.slat2) * DEGRAD
        olon = Double(self.map.olon) * DEGRAD
        olat = Double(self.map.olat) * DEGRAD

        sn = tan(PI * 0.25 + slat2 * 0.5) / tan(PI * 0.25 + slat1 * 0.5)
        sn = log(cos(slat1) / cos(slat2)) / log(sn)
        sf = tan(PI * 0.25 + slat1 * 0.5)
        sf = pow(sf, sn) * cos(slat1) / sn
        ro = tan(PI * 0.25 + olat * 0.5)
        ro = re * sf / pow(ro, sn)
        
        ra = tan(PI * 0.25 + lat * DEGRAD * 0.5)
        ra = re * sf / pow(ra, sn)
        theta = lon * DEGRAD - olon
        
        if theta > PI   { theta -= 2.0 * PI }
        if theta < -PI  { theta += 2.0 * PI }
        theta *= sn
        
        self.x = Float(ra * sin(theta)) + self.map.xo
        self.y = Float(ro - ra * cos(theta)) + self.map.yo
        
        return (mapX:Int(self.x + 1.5), mapY:Int(self.y + 1.5))
    }
}

🚀 REFERENCE

 

기상청 격자정보 - 위경도 변환 : Grid XY - Lat, Lon

데이터형식 : 위도, 경도 37.579871128849334, 126.98935225645432 35.101148844565955, 129.02478725562108 33.500946412305076, 126.54663058817043

fronteer.kr

반응형

댓글