注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

vingo

日月

 
 
 

日志

 
 
 
 

高德偏移  

2016-03-25 23:41:31|  分类: map |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

//

//  MapHelper.swift

//  FeelingClient

//

//  Created by Vincent on 16/3/25.

//  Copyright ? 2016 xecoder. All rights reserved.

//



import Foundation

import MapKit


let a = 6378245.0

let ee = 0.00669342162296594323


// World Geodetic System ==> Mars Geodetic System

func outOfChina(coordinate: CLLocationCoordinate2D) -> Bool {

    if coordinate.longitude < 72.004 || coordinate.longitude > 137.8347 {

        return true

    }

    

    if coordinate.latitude < 0.8293 || coordinate.latitude > 55.8271 {

        return true

    }

    

    return false

}


func transformLat(x: Double, y: Double) -> Double {

    var ret = -100.0 + 2.0 * x + 3.0 * y

    ret += 0.2 * y * y + 0.1 * x * y

    ret += 0.2 * sqrt(abs(x))

    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0

    ret += (20.0 * sin(y * M_PI) + 40.0 * sin(y / 3.0 * M_PI)) * 2.0 / 3.0

    ret += (160.0 * sin(y / 12.0 * M_PI) + 320 * sin(y * M_PI / 30.0)) * 2.0 / 3.0

    return ret;

}


func transformLon(x: Double, y: Double) -> Double {

    var ret = 300.0 + x + 2.0 * y

    ret += 0.1 * x * x + 0.1 * x * y

    ret += 0.1 * sqrt(abs(x))

    ret += (20.0 * sin(6.0 * x * M_PI) + 20.0 * sin(2.0 * x * M_PI)) * 2.0 / 3.0

    ret += (20.0 * sin(x * M_PI) + 40.0 * sin(x / 3.0 * M_PI)) * 2.0 / 3.0

    ret += (150.0 * sin(x / 12.0 * M_PI) + 300.0 * sin(x / 30.0 * M_PI)) * 2.0 / 3.0

    return ret;

}


// 地球坐标系 (WGS-84) -> 火星坐标系 (GCJ-02)

func wgs2gcj(coordinate: CLLocationCoordinate2D) -> CLLocationCoordinate2D {

    if outOfChina(coordinate) == true {

        return coordinate

    }

    let wgLat = coordinate.latitude

    let wgLon = coordinate.longitude

    var dLat = transformLat(wgLon - 105.0, y: wgLat - 35.0)

    var dLon = transformLon(wgLon - 105.0, y: wgLat - 35.0)

    let radLat = wgLat / 180.0 * M_PI

    var magic = sin(radLat)

    magic = 1 - ee * magic * magic

    let sqrtMagic = sqrt(magic)

    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI)

    dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * M_PI)

    return CLLocationCoordinate2DMake(wgLat + dLat, wgLon + dLon)

}


// 地球坐标系 (WGS-84) <- 火星坐标系 (GCJ-02)

func gcj2wgs(coordinate: CLLocationCoordinate2D) -> CLLocationCoordinate2D {

    if outOfChina(coordinate) == true {

        return coordinate

    }

    let c2 = wgs2gcj(coordinate)

    return CLLocationCoordinate2DMake(2 * coordinate.latitude - c2.latitude, 2 * coordinate.longitude - c2.longitude)

}


extension CLLocationCoordinate2D {

    func toMars() -> CLLocationCoordinate2D {

        return wgs2gcj(self)

    }

}

  评论这张
 
阅读(4)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017