Bidirectional UTM-WGS84 converter for golang. It use logic from UTM python version by Tobias Bieniek
go get github.com/im7mortal/UTM
Convert a latitude, longitude into an UTM coordinate
easting, northing, zoneNumber, zoneLetter, err := UTM.FromLatLon(40.71435, -74.00597, false)
Convert an UTM coordinate into a latitude, longitude.
latitude, longitude, err := UTM.ToLatLon(377486, 6296562, 30, "V")
Since the zone letter is not strictly needed for the conversion you may also
the northern
parameter instead, which is a named parameter and can be set
to either true
or false
. In this case you should define fields clearly(!).
You can't set ZoneLetter or northern both.
latitude, longitude, err := UTM.ToLatLon(377486, 6296562, 30, "", false)
The UTM coordinate system is explained on this Wikipedia page
Benchmark | Amount of iterations | Average speed |
---|---|---|
ToLatLon | 10000000 | 123 ns/op |
ToLatLonWithNorthern | 10000000 | 121 ns/op |
FromLatLon | 20000000 | 80.6 ns/op |
go test -bench=.
package main
import (
"github.com/im7mortal/UTM"
"fmt"
)
func main() {
easting, northing, zoneNumber, zoneLetter, err := UTM.FromLatLon(40.71435, -74.00597, false)
if err != nil {
panic(err.Error())
}
fmt.Println(
fmt.Sprintf(
"Easting: %d; Northing: %d; ZoneNumber: %d; ZoneLetter: %s;",
easting,
northing,
zoneNumber,
zoneLetter,
))
easting, northing, zoneNumber, zoneLetter, err = UTM.FromLatLon(40.71435, -74.00597, true)
if err != nil {
panic(err.Error())
}
fmt.Println(
fmt.Sprintf(
"Easting: %d; Northing: %d; ZoneNumber: %d; ZoneLetter: %s;",
easting,
northing,
zoneNumber,
zoneLetter,
))
latitude, longitude, err := UTM.ToLatLon(377486, 6296562, 30, "", true)
fmt.Println(fmt.Sprintf("Latitude: %.5f; Longitude: %.5f;", latitude, longitude))
latitude, longitude, err = UTM.ToLatLon(377486, 6296562, 30, "V")
fmt.Println(fmt.Sprintf("Latitude: %.5f; Longitude: %.5f;", latitude, longitude))
}
- Petr Lozhkin [email protected]