func Zone(lat, lng float64) (int, error) {

	p := Point{Lat: lat, Lng: lng}

	if !p.Valid() {
		return 0, &invalidPointError{p: p, msg: "invalid point"}
	}

	if p.Lat >= 72.0 && p.Lat < 84.0 {
		if p.Lng >= 0.0 && p.Lng < 9.0 {
			return 31, nil
		}
		if p.Lng >= 9.0 && p.Lng < 21.0 {
			return 33, nil
		}
		if p.Lng >= 21.0 && p.Lng < 33.0 {
			return 35, nil
		}
		if p.Lng >= 33.0 && p.Lng < 42.0 {
			return 37, nil
		}
	}

	if p.Lat >= 56.0 && p.Lat < 64.0 && p.Lng >= 3.0 && p.Lng <= 12.0 {
		return 32, nil
	}

	return int(math.Round((183 + p.Lng) / 6)), nil
}
// Zone to get UTM zone from point
Zone to get UTM zone from point
// Zone to get UTM zone from point
func Zone(lat, lng float64) (int, error) {
	p := Point{Lat: lat, Lng: lng}
	if !p.Valid() {
		return 0, &invalidPointError{p: p, msg: "invalid point"}
	}
	if p.Lat >= 72.0 && p.Lat < 84.0 {
		if p.Lng >= 0.0 && p.Lng < 9.0 {
			return 31, nil
		}
		if p.Lng >= 9.0 && p.Lng < 21.0 {
			return 33, nil
		}
		if p.Lng >= 21.0 && p.Lng < 33.0 {
			return 35, nil
		}
		if p.Lng >= 33.0 && p.Lng < 42.0 {
			return 37, nil
		}
	}
	if p.Lat >= 56.0 && p.Lat < 64.0 && p.Lng >= 3.0 && p.Lng <= 12.0 {
		return 32, nil
	}
	return int(math.Round((183 + p.Lng) / 6)), nil
}
func Zone ( lat , lng float64 ) ( int , error ) { p := Point { Lat : lat , Lng : lng } if ! p . Valid ( ) { return 0 , & invalidPointError { p : p , msg : " " } } if p . Lat >= 72.0 && p . Lat < 84.0 { if p . Lng >= 0.0 && p . Lng < 9.0 { return 31 , nil } if p . Lng >= 9.0 && p . Lng < 21.0 { return 33 , nil } if p . Lng >= 21.0 && p . Lng < 33.0 { return 35 , nil } if p . Lng >= 33.0 && p . Lng < 42.0 { return 37 , nil } } if p . Lat >= 56.0 && p . Lat < 64.0 && p . Lng >= 3.0 && p . Lng <= 12.0 { return 32 , nil } return int ( math . Round ( ( 183 + p . Lng ) / 6 ) ) , nil }
Zone to get UTM zone from point
Zone to get UTM zone from point