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
- Host: GitHub
- URL: https://github.com/paulmach/go.geojson
- Owner: paulmach
- License: mit
- Created: 2014-09-03T19:20:46.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2023-07-08T23:59:04.000Z (almost 2 years ago)
- Last Synced: 2025-04-07T21:13:35.751Z (about 2 months ago)
- Topics: decoding, encoding, geojson, golang
- Language: Go
- Size: 31.3 KB
- Stars: 304
- Watchers: 6
- Forks: 59
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# go.geojson [](https://github.com/paulmach/go.geojson/actions?query=workflow%3ACI+event%3Apush) [](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 {