
火星坐标
-
2023年3月19日发(作者:91卫星助手)swiftLocationManager坐标偏移WGS-84转GCJ-02(⽕星坐标)
importFoundation
importMapKit
classLocationUtils{
classfuncisCoordinateOutOfChina(coordinate:CLLocationCoordinate2D)->Bool{
ude137.8347||de55.8271
}
classfunctransformToGCJ(fromWGSwgsLoc:CLLocationCoordinate2D)->CLLocationCoordinate2D{
leta=6378245.0;
letee=0.96594323;
letpi=3.979324;
functransformLat(x:CLLocationDegrees,y:CLLocationDegrees)->CLLocationDegrees{
varlat:CLLocationDegrees=-100.0+2.0*x+3.0*y
lat+=0.2*y*y
lat+=0.1*x*y+0.2*sqrt(abs(x))
lat+=(20.0*sin(6.0*x*pi)+20.0*sin(2.0*x*pi))*2.0/3.0
lat+=(20.0*sin(y*pi)+40.0*sin(y/3.0*pi))*2.0/3.0
lat+=(160.0*sin(y/12.0*pi)+320*sin(y*pi/30.0))*2.0/3.0
returnlat;
}
functransformLog(x:CLLocationDegrees,y:CLLocationDegrees)->CLLocationDegrees{
varlon:CLLocationDegrees=300.0+x+2.0*y+0.1*x*x
lon+=0.1*x*y+0.1*sqrt(abs(x))
lon+=(20.0*sin(6.0*x*pi)+20.0*sin(2.0*x*pi))*2.0/3.0
lon+=(20.0*sin(x*pi)+40.0*sin(x/3.0*pi))*2.0/3.0
lon+=(150.0*sin(x/12.0*pi)+300.0*sin(x/30.0*pi))*2.0/3.0
returnlon;
}
varadjustLat=transformLat(ude-105.0,de-35.0);
varadjustLon=transformLog(ude-105.0,de-35.0);
varradLat=de/180.0*pi;
varmagic=sin(radLat);
magic=1-ee*magic*magic;
varsqrtMagic=sqrt(magic);
adjustLat=(adjustLat*180.0)/((a*(1-ee))/(magic*sqrtMagic)*pi);
adjustLon=(adjustLon*180.0)/(a/sqrtMagic*cos(radLat)*pi);
returnCLLocationCoordinate2D(latitude:de+adjustLat,longitude:ude+adjustLon);
}
}
publicextensionCLLocationCoordinate2D{
funcadjust()->CLLocationCoordinate2D{
dinateOutOfChina(self)?self:ormToGCJ(fromWGS:self)
}
}
直接贴代码,参考了
简单封装了下,
⼯具类+扩展类,适⽤于各种地⽅,建议⼤家把这个直接放到⾃⼰的library⾥⾯
⽤的时候这样:
varnewLocation=CLLocation
varadjustedCoordinate=()
varregion=MKCoordinateRegionMakeWithDistance(adjustedCoordinate,100,100)
ion(region,animated:true)
本来想扩展CLLocation的conventioninit函数,直接修改接收到的location,但它⾥⾯的init都是protected,没法实现,算了