exupero's blog
RSSApps

Merging GeoJSON features

In the previous post I mentioned that I track hikes, bicycle rides, and car trips in GeoJSON files. Each file is named after a particular date and contains the path of that day's activity. To see a cumulative map of everywhere I've logged hikes or bike rides or drives, I have a Babashka script called merge-geojson-features which combines the GeoJSON data into a single structure:

(require '[cheshire.core :as json])
(let [files *command-line-args*]
  (println
    (json/generate-string
      {:type "FeatureCollection"
       :features (sequence
                   (comp
                     (map slurp)
                     (map json/parse-string)
                     (mapcat #(get % "features")))
                   files)}
      {:pretty (json/create-pretty-printer
                 (assoc json/default-pretty-print-options
                        :indent-arrays? true))})))

Probably jq could do the same with a one-liner, but so far I haven't figured out how. If you know, please email me.

Writing 14 lines of code in a language I'm familiar with is usually faster than writing one line in a language I only know the rudiments of, which is why I usually reach for Babashka for tasks like this. There's also the temptation to think that the script will develop further. For example, I could store the source filename as a property on each feature then be able to see when I took a particular trip in the shape info popup on geojson.io. So far, however, I haven't had the need.

The script prints the GeoJSON to the terminal, so I typically pipe it to pbcopy then paste the data into geojson.io to see it on a map.