Skip to content

Instantly share code, notes, and snippets.

@migurski
Created September 21, 2012 03:43
Show Gist options
  • Star 40 You must be signed in to star a gist
  • Fork 35 You must be signed in to fork a gist
  • Save migurski/3759608 to your computer and use it in GitHub Desktop.
Save migurski/3759608 to your computer and use it in GitHub Desktop.
Merge multiple GeoJSON files into one
from json import load, JSONEncoder
from optparse import OptionParser
from re import compile
float_pat = compile(r'^-?\d+\.\d+(e-?\d+)?$')
charfloat_pat = compile(r'^[\[,\,]-?\d+\.\d+(e-?\d+)?$')
parser = OptionParser(usage="""%prog [options]
Group multiple GeoJSON files into one output file.
Example:
python %prog -p 2 input-1.json input-2.json output.json""")
defaults = dict(precision=6)
parser.set_defaults(**defaults)
parser.add_option('-p', '--precision', dest='precision',
type='int', help='Digits of precision, default %(precision)d.' % defaults)
if __name__ == '__main__':
options, args = parser.parse_args()
infiles, outfile = args[:-1], args[-1]
outjson = dict(type='FeatureCollection', features=[])
for infile in infiles:
injson = load(open(infile))
if injson.get('type', None) != 'FeatureCollection':
raise Exception('Sorry, "%s" does not look like GeoJSON' % infile)
if type(injson.get('features', None)) != list:
raise Exception('Sorry, "%s" does not look like GeoJSON' % infile)
outjson['features'] += injson['features']
encoder = JSONEncoder(separators=(',', ':'))
encoded = encoder.iterencode(outjson)
format = '%.' + str(options.precision) + 'f'
output = open(outfile, 'w')
for token in encoded:
if charfloat_pat.match(token):
# in python 2.7, we see a character followed by a float literal
output.write(token[0] + format % float(token[1:]))
elif float_pat.match(token):
# in python 2.6, we see a simple float literal
output.write(format % float(token))
else:
output.write(token)
@themiurgo
Copy link

@neogeomat

My fork solves that, defaults output to stdout. I have also updated the depcreated optparse to argparse.

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