An open API service indexing awesome lists of open source software.

https://github.com/paulmach/go.geojson

Encoding and decoding GeoJSON <-> Go
https://github.com/paulmach/go.geojson

decoding encoding geojson golang

Last synced: 15 days ago
JSON representation

Encoding and decoding GeoJSON <-> Go

Awesome Lists containing this project

README

        

# go.geojson [![CI](https://github.com/paulmach/go.geojson/workflows/CI/badge.svg)](https://github.com/paulmach/go.geojson/actions?query=workflow%3ACI+event%3Apush) [![Godoc Reference](https://godoc.org/github.com/paulmach/go.geojson?status.svg)](https://godoc.org/github.com/paulmach/go.geojson)

Go.geojson is a package for **encoding and decoding** [GeoJSON](http://geojson.org/) into Go structs.
Supports both the [json.Marshaler](http://golang.org/pkg/encoding/json/#Marshaler) and [json.Unmarshaler](http://golang.org/pkg/encoding/json/#Unmarshaler)
interfaces as well as [sql.Scanner](http://golang.org/pkg/database/sql/#Scanner) for directly scanning PostGIS query results.
The package also provides helper functions such as `UnmarshalFeatureCollection`, `UnmarshalFeature` and `UnmarshalGeometry`.

### Deprecated, use [orb/geojson](https://github.com/paulmach/orb/tree/master/geojson)
The [orb](https://github.com/paulmach/orb) package, and its subpackages, provide all the features here and more.

## Examples

* #### Unmarshalling (JSON -> Go)

go.geojson supports both the [json.Marshaler](http://golang.org/pkg/encoding/json/#Marshaler) and [json.Unmarshaler](http://golang.org/pkg/encoding/json/#Unmarshaler) interfaces as well as helper functions such as `UnmarshalFeatureCollection`, `UnmarshalFeature` and `UnmarshalGeometry`.

// Feature Collection
rawFeatureJSON := []byte(`
{ "type": "FeatureCollection",
"features": [
{ "type": "Feature",
"geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
"properties": {"prop0": "value0"}
}
]
}`)

fc1, err := geojson.UnmarshalFeatureCollection(rawFeatureJSON)

fc2 := geojson.NewFeatureCollection()
err := json.Unmarshal(rawJSON, fc2)

// Geometry
rawGeometryJSON := []byte(`{"type": "Point", "coordinates": [102.0, 0.5]}`)
g, err := geojson.UnmarshalGeometry(rawGeometryJSON)

g.IsPoint() == true
g.Point == []float64{102.0, 0.5}

* #### Marshalling (Go -> JSON)

g := geojson.NewPointGeometry([]float64{1, 2})
rawJSON, err := g.MarshalJSON()

fc := geojson.NewFeatureCollection()
fc.AddFeature(geojson.NewPointFeature([]float64{1,2}))
rawJSON, err := fc.MarshalJSON()

* #### Scanning PostGIS query results

row := db.QueryRow("SELECT ST_AsGeoJSON(the_geom) FROM postgis_table)

var geometry *geojson.Geometry
row.Scan(&geometry)

* #### Dealing with different Geometry types

A geometry can be of several types, causing problems in a statically typed language.
Thus there is a separate attribute on Geometry for each type.
See the [Geometry object](https://godoc.org/github.com/paulmach/go.geojson#Geometry) for more details.

g := geojson.UnmarshalGeometry([]byte(`
{
"type": "LineString",
"coordinates": [
[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
]
}`))

switch {
case g.IsPoint():
// do something with g.Point
case g.IsLineString():
// do something with g.LineString
}

## Feature Properties

GeoJSON [Features](http://geojson.org/geojson-spec.html#feature-objects) can have properties of any type.
This can cause issues in a statically typed language such as Go.
So, included are some helper methods on the Feature object to ease the pain.

// functions to do the casting for you
func (f Feature) PropertyBool(key string) (bool, error) {
func (f Feature) PropertyInt(key string) (int, error) {
func (f Feature) PropertyFloat64(key string) (float64, error) {
func (f Feature) PropertyString(key string) (string, error) {

// functions that hide the error and let you define default
func (f Feature) PropertyMustBool(key string, def ...bool) bool {
func (f Feature) PropertyMustInt(key string, def ...int) int {
func (f Feature) PropertyMustFloat64(key string, def ...float64) float64 {
func (f Feature) PropertyMustString(key string, def ...string) string {