Skip to content

Instantly share code, notes, and snippets.

@tidwall
Last active June 8, 2017 17:34
Show Gist options
  • Save tidwall/ca6ca1dd0cb780f0be4d134f8e4eb7bc to your computer and use it in GitHub Desktop.
Save tidwall/ca6ca1dd0cb780f0be4d134f8e4eb7bc to your computer and use it in GitHub Desktop.
Pretty format GeoJSON Features
package main
import (
"github.com/tidwall/gjson"
"github.com/tidwall/pretty"
)
var json = []byte(`
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [[[-67.13734351262877, 45.137451890638886],
[-66.96466, 44.8097],
[-68.03252, 44.3252],
[-69.06, 43.98],
[-70.11617, 43.68405],
[-70.64573401557249, 43.090083319667144],
[-70.75102474636725, 43.08003225358635],
[-70.79761105007827, 43.21973948828747],
[-70.98176001655037, 43.36789581966826],
[-70.94416541205806, 43.46633942318431],
[-71.08482, 45.3052400000002],
[-70.6600225491012, 45.46022288673396],
[-70.30495378282376, 45.914794623389355],
[-70.00014034695016, 46.69317088478567],
[-69.23708614772835, 47.44777598732787],
[-68.90478084987546, 47.184794623394396],
[-68.23430497910454, 47.35462921812177],
[-67.79035274928509, 47.066248887716995],
[-67.79141211614706, 45.702585354182816],
[-67.13734351262877, 45.137451890638886]]]
},
"properties":{"key2": "hello","key1":"world"}
}
`)
func prettyGeoJSON(json []byte) []byte {
// get the geometry.
res := gjson.GetBytes(json, "geometry")
// sanity checks
if res.Index == 0 || len(res.Raw) == 0 ||
res.Raw[0] != '{' || res.Raw[len(res.Raw)-1] != '}' {
// probably a generic geometry, make it ugly
return pretty.Ugly(json)
}
// make an ugly copy of just the geometry segment
geom := pretty.Ugly(json[res.Index : res.Index+len(res.Raw)])
// now for the tricky part.
// empty the geometry object.
// Note that this mutates the original json.
for i := 1; i < len(res.Raw)-1; i++ {
json[res.Index+i] = ' '
}
// make the json pretty
json = pretty.Pretty(json)
// find the new location of the geometry
res = gjson.GetBytes(json, "geometry")
// allocate the space for the final json.
final := make([]byte, len(json)+len(geom)-2)
copy(final, json[:res.Index])
copy(final[res.Index:], geom)
copy(final[res.Index+len(geom):], json[res.Index+len(res.Raw):])
return final
}
func main() {
json = prettyGeoJSON(json)
println(string(json))
}
@tidwall
Copy link
Author

tidwall commented Jun 8, 2017

Output will look like:

{
  "type": "Feature",
  "geometry": {"type":"Polygon","coordinates":[[[-67.13734351262877,45.137451890638886],[-66.96466,44.8097],[-68.03252,44.3252],[-69.06,43.98],[-70.11617,43.68405],[-70.64573401557249,43.090083319667144],[-70.75102474636725,43.08003225358635],[-70.79761105007827,43.21973948828747],[-70.98176001655037,43.36789581966826],[-70.94416541205806,43.46633942318431],[-71.08482,45.3052400000002],[-70.6600225491012,45.46022288673396],[-70.30495378282376,45.914794623389355],[-70.00014034695016,46.69317088478567],[-69.23708614772835,47.44777598732787],[-68.90478084987546,47.184794623394396],[-68.23430497910454,47.35462921812177],[-67.79035274928509,47.066248887716995],[-67.79141211614706,45.702585354182816],[-67.13734351262877,45.137451890638886]]]},
  "properties": {
    "key2": "hello",
    "key1": "world"
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment