# Go implementation of the geodesic routines from GeographicLib

### Related tags

Utilities geodesic

# geodesic

This package is a Go implementation of the geodesic routines from GeographicLib.

## Features

• Pure Go implementation
• Distance calculations with nanometer precision
• Calculate the area and perimeter of a polygon
• Get the length of a polyline
• Direct and inverse solutions

## Installing

To start using `geodesic`, install Go and run `go get`:

`\$ go get -u github.com/tidwall/geodesic`

This will retrieve the library.

## Using

All operations are performed on an Ellipsoid object.

To create a custom ellipsoid by calling `geodesic.NewEllipsoid`

```// The first argument is the radius and the second is the flattening.
myEllipsoid := geodesic.NewEllipsoid(6378137.0, 1.0/298.257223563)```

Or, you can simply use the built-in `geodesic.WGS84` ellipsoid, which conforms to the WGS84 standard.

## Examples

Calculate distance between two points.

```var dist float64
geodesic.WGS84.Inverse(33.4911, -112.4223, 32.1189, -113.1123, &dist, nil, nil)
fmt.Printf("%f meters\n", dist)
// output:
// 165330.214571 meters```

Calculate initial azimuth from point A to point B.

```var azi float64
geodesic.WGS84.Inverse(33.4911, -112.4223, 32.1189, -113.1123, nil, &azi, nil)
fmt.Printf("%f degrees\n", azi)
// output:
// -156.803310 degrees```

Calculate final azimuth from point A to point B.

```var azi float64
geodesic.WGS84.Inverse(33.4911, -112.4223, 32.1189, -113.1123, nil, nil, &azi)
fmt.Printf("%f degrees\n", azi)
// output:
// -157.177169 degrees```

Calculate distance and azimuths at the same time.

```var dist, azi1, azi2 float64
geodesic.WGS84.Inverse(33.4911, -112.4223, 32.1189, -113.1123, &dist, &azi1, &azi2)
fmt.Printf("%f meters, %f degrees, %f degrees\n", dist,azi1,azi2)
// output:
// 165330.214571 meters, -156.803310 degrees, -157.177169 degrees```

Calculate destination using an initial point, azimuth, and distance.

```var lat, lon float64
geodesic.WGS84.Direct(33.4911, -112.4223, -156.803310, 165330.214571, &lat, &lon, nil)
fmt.Printf("%f, %f\n", lat, lon)
// output:
// 32.118900, -113.112300```

Calculate the area and perimeter of a polygon.

```// Arizona
poly := WGS84.PolygonInit(false)
var area, perimeter float64
poly.Compute(false, false, &area, &perimeter)
fmt.Printf("%f area (km²), %f perimeter (meters)\n", area/1000000, perimeter)
// output:
// 294838.722804 area (km²), 2254910.021767 perimeter (meters)```
• #### Different order of adding points leads to wrong area calculation

In the sample code below, the area calculated for the second case seems to be wrong.

``````func TestArea2(t *testing.T) {
var area, perimeter float64

poly := geodesic.WGS84.PolygonInit(false)

poly.Compute(false, false, &area, &perimeter)

fmt.Printf("%f, %f\n", area, perimeter)

poly = geodesic.WGS84.PolygonInit(false)

poly.Compute(false, false, &area, &perimeter)

fmt.Printf("%f, %f\n", area, perimeter)
}
``````

Outputs:

``````1190968350339.391846,   4355689.472548
508874653373749.062500, 4355689.472548
``````
opened by ksco 2
• #### [feature] geodesic buffer

Thank you for providing this valuable package in Go. For geodesic calculation, one important feature is the geodesic buffer (on sphere). Currently, there is no Go library that works for this feature. ArcGIS does provide some APIs, but they are not flexible enough. I was wondering if you have any plans to add relevant functions in this package?

opened by leiii 0
###### Implementation of do255e and do255s in Go

Go Implementation of do255e and do255s This is a plain Go implementation of do255e and do255s. It is considered secure; all relevant functions should

20 Dec 22, 2021
###### Go implementation of the Heaven's Gate technique

gopherheaven is a Go implementation of the classic Heaven's Gate technique originally published by roy g biv on VX Heaven in 2009. gopherheaven can be used as an evasion technique to directly call 64-bit code from a 32-bit process.

67 Jun 23, 2022
###### Lightweight, Simple, Quick, Thread-Safe Golang Stack Implementation

stack Lightweight, Simple, Quick, Thread-Safe Golang Stack Implementation Purpose Provide a fast, thread safe, and generic Golang Stack API with minim

5 May 3, 2022
###### Optimal implementation of ordered maps for Golang - ie maps that remember the order in which keys were inserted.

Goland Ordered Maps Same as regular maps, but also remembers the order in which keys were inserted, akin to Python's collections.OrderedDicts. It offe

195 Jun 20, 2022
###### An idiomatic Go implementation of Leaky bucket.

lbucket lbucket is an idiomatic Go leaky bucket implementation. The library make use of plain old Go stdlib; in other words, there are no third-party

11 Apr 17, 2022
###### A faster RWLock primitive in Go, 2-3 times faster than RWMutex. A Go implementation of concurrency control algorithm in paper

Go Left Right Concurrency A Go implementation of the left-right concurrency control algorithm in paper <Left-Right - A Concurrency Control Technique w

40 Apr 4, 2022
###### go-logr implementation with pterm

plogr go-logr implementation with pterm Usage See examples Add more colors and levels By default, only level 0 (info) and level 1 (debug) are supporte

4 Dec 22, 2021
###### Reference go implementation of globaldce protocol

globaldce-go This is the reference implementation of the command line interface of globaldce coded in the go programming language. This project is sti

10 Nov 8, 2021
###### Go implementation Welford’s method for one-pass variance computation

Welford - Online method of calculating variance and standard deviation Go implementation Welford’s method for one-pass variance computation with D. H.

7 Jun 5, 2022
###### Sliding window counters Redis rate limiting implementation for Golang

Sliding window counters Redis rate limiting implementation for Golang (Based on the Figma API rate limit algorithm)

5 Apr 4, 2022
###### Implementation for validating the NZ COVID Pass.

NZCP validator Validates NZCP passes according to https://nzcp.covid19.health.nz. Example See example_test.go and tests for more examples. func Exampl

8 Dec 20, 2021
###### Generic Free List implementation to reuse memory and avoid allocations

gofl GOFL provides a Generic Free List implementation for Go. Installation This

1 Dec 26, 2021
###### A pure Golang implementation of Rockchip rknand vendor storage interface.

go-rkvendorstorage A pure Golang implementation of Rockchip rknand vendor storage interface. Usage package main import ( "fmt" "github.com/jamesits

3 May 31, 2022
###### yaml-patch is a version of Evan Phoenix's json-patch, which is an implementation of JSON Patch, directly transposed to YAML

yaml-patch yaml-patch is a version of Evan Phoenix's json-patch, which is an implementation of JavaScript Object Notation (JSON) Patch, directly trans

0 Jan 15, 2022
###### Golang 1.18+ Generics implementation of Set methods

Golang Generics: Set A golang 1.18+ implementation of Set using Go generics Installation \$ go get -u github.com/chrispappas/golang-generics-set Quick

10 Jun 26, 2022
###### Library providing routines to merge and validate JSON, YAML and/or TOML files

CONFLATE Library providing routines to merge and validate JSON, YAML, TOML files and/or structs (godoc) Typical use case: Make your application config

25 May 5, 2022
###### A goroutine monitor to keep track of active routines from within your favorite shell.

roumon A goroutine monitor to keep track of active routines from within your favorite shell. Features Track live state of all active goroutines Termin

83 Jun 23, 2022
###### Routines was a fixed number thread pool to process the user task, and it would respawn a corresponding new thread when panic

Routines Routines was a fixed number thread pool to process the user task, and it would respawn a corresponding new thread when panic. It supports the

12 Dec 16, 2021
###### Parallel processing through go routines, copy and delete thousands of key within some minutes

redis-dumper CLI Parallel processing through go routines, copy and delete thousands of key within some minutes copy data by key pattern from one redis

0 Dec 26, 2021
###### Executes jobs in separate GO routines. Provides Timeout, StartTime controls. Provides Cancel all running job before new job is run.

jobExecutor Library to execute jobs in GO routines. Provides for Job Timeout/Deadline (MaxDuration()) Job Start WallClock control (When()) Add a job b

0 Jan 10, 2022
###### This is a Go port of the phase vocoding analysis/resynthesis routines from Tom Erbe's program "SoundHack".

Overview This is a Go port of the phase vocoding analysis/resynthesis routines from Tom Erbe's program "SoundHack". Unlike the original SoundHack, thi

4 Apr 24, 2022
###### Go language implementation of a blockchain based on the BDLS BFT protocol. The implementation was adapted from Ethereum and Sperax implementation

BDLS protocol based PoS Blockchain Most functionalities of this client is similar to the Ethereum golang implementation. If you do not find your quest

0 Jan 1, 2022
###### CVE-2021-4034 - A Golang implementation of clubby789's implementation of CVE-2021-4034

CVE-2021-4034 January 25, 2022 | An00bRektn This is a golang implementation of C

10 Feb 3, 2022
###### An implementation of JOSE standards (JWE, JWS, JWT) in Go

Go JOSE Package jose aims to provide an implementation of the Javascript Object Signing and Encryption set of standards. This includes support for JSO

1.9k Jun 23, 2022
###### goRBAC provides a lightweight role-based access control (RBAC) implementation in Golang.

goRBAC goRBAC provides a lightweight role-based access control implementation in Golang. For the purposes of this package: * an identity has one or mo

1.3k Jun 26, 2022
###### This is an implementation of JWT in golang!

jwt This is a minimal implementation of JWT designed with simplicity in mind. What is JWT? Jwt is a signed JSON object used for claims based authentic

99 May 9, 2022
###### Golang implementation of JSON Web Tokens (JWT)

jwt-go A go (or 'golang' for search engine friendliness) implementation of JSON Web Tokens NEW VERSION COMING: There have been a lot of improvements s

10.4k Jun 23, 2022
###### Platform-Agnostic Security Tokens implementation in GO (Golang)

Golang implementation of PASETO: Platform-Agnostic Security Tokens This is a 100% compatible pure Go (Golang) implementation of PASETO tokens. PASETO

608 Jun 26, 2022
###### s3fs provides a S3 implementation for Go1.16 filesystem interface.

S3 FileSystem (fs.FS) implementation.Since S3 is a flat structure, s3fs simulates directories by using prefixes and "/" delim. ModTime on directories is always zero value.

132 Jun 29, 2022