wgs84ToGcj02.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package lib
  2. import "math"
  3. const (
  4. a = 6378245.0 // 长半轴
  5. ee = 0.0066934216229659 // 扁率
  6. )
  7. // 判断是否在中国范围外
  8. func outOfChina(lng, lat float64) bool {
  9. return !(lng > 72.004 && lng < 137.8347 && lat > 0.8293 && lat < 55.8271)
  10. }
  11. // 计算纬度偏差
  12. func transformLat(x, y float64) float64 {
  13. ret := -100.0 + 2.0*x + 3.0*y + 0.2*y*y + 0.1*x*y + 0.2*math.Sqrt(math.Abs(x))
  14. ret += (20.0*math.Sin(6.0*x*(math.Pi)) + 20.0*math.Sin(2.0*x*(math.Pi))) * 2.0 / 3.0
  15. ret += (20.0*math.Sin(y*(math.Pi)) + 40.0*math.Sin(y/3.0*(math.Pi))) * 2.0 / 3.0
  16. ret += (160.0*math.Sin(y/12.0*(math.Pi)) + 320.0*math.Sin(y/30.0*(math.Pi))) * 2.0 / 3.0
  17. return ret
  18. }
  19. // 计算经度偏差
  20. func transformLon(x, y float64) float64 {
  21. ret := 300.0 + x + 2.0*y + 0.1*x*x + 0.1*x*y + 0.1*math.Sqrt(math.Abs(x))
  22. ret += (20.0*math.Sin(6.0*x*(math.Pi)) + 20.0*math.Sin(2.0*x*(math.Pi))) * 2.0 / 3.0
  23. ret += (20.0*math.Sin(x*(math.Pi)) + 40.0*math.Sin(x/3.0*(math.Pi))) * 2.0 / 3.0
  24. ret += (150.0*math.Sin(x/12.0*(math.Pi)) + 300.0*math.Sin(x/30.0*(math.Pi))) * 2.0 / 3.0
  25. return ret
  26. }
  27. // WGS-84 转 GCJ-02
  28. func Wgs84ToGcj02(lng, lat float64) (float64, float64) {
  29. if outOfChina(lng, lat) {
  30. return lng, lat
  31. }
  32. dLat := transformLat(lng-105.0, lat-35.0)
  33. dLng := transformLon(lng-105.0, lat-35.0)
  34. radLat := lat / 180.0 * math.Pi
  35. magic := math.Sin(radLat)
  36. magic = 1 - ee*magic*magic
  37. sqrtMagic := math.Sqrt(magic)
  38. dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * math.Pi)
  39. dLng = (dLng * 180.0) / (a / sqrtMagic * math.Cos(radLat) * math.Pi)
  40. mgLat := lat + dLat
  41. mgLng := lng + dLng
  42. return mgLng, mgLat
  43. }