GIS roadmap
Roadmap for Clojure GIS
The plan is to present a cohesive story for GIS work in the Clojure ecosystem. At present this document can serve as a location to add notes, todos and thoughts. Some future version of it may serve as a landing page.
Why Clojure?
TODO:
A few words about why Clojure is good for GIS…
- Clojure’s ability to interact with multiple host environments (Java, JS, Python, etc).
- Same language on the front and backend
- Ergonomic data workflow
- Interactive development
GIS Task Categories
Image formats
Raster
Cloud Optimized GeoTIFF (COG)
What is a COG?
TIFF is an extensible image file format. GeoTIFFs are TIFFs with geospatial metadata such as coordinate reference / projection information, Geographic extent, pixel resolution and so on. Cloud Optimized GeoTIFFs (COGs) are geoTIFFs arranged for efficient access over HTTP. This is achieved with tiled layouts allowing for partial access (using HTTP range requests), and resolution pyramids. This allows for fetching only the portion of the COG required.
More details on the format at: cogeo.org
How to interact with COGs with Clojure
Many libraries for creation and manipulation of GeoTIFF data in other languages rely on the GDAL binary. This is performant and battle-tested but has a large footprint and is vulnerable to version mismatches between the client language and GDAL.
Some pure language implementations (that do not depend on GDAL) exist, such as geotiff.js for JavaScript and GeoTools in Java. For the sake of simplicity we recommend using interop with pure language GeoTIFF library where possible.
TODOs:
- GeoTools / Java interop example
- geotiff.js / JavaScript interop example
- Example of a containerized Python bindings with GDAL setup.
NetCDF
NetCDF is a format for metadata enhanced, compressed, multidimensional arrays. Often used for weather, climate, remote sensing and oceanographic data. Both GeoTools and NetCDF-Java are acceptable ways to to handle and create netCDF files in Java-hosted Clojure. In JS we can read NetCDF files with netcdfjs
TODOs:
- GeoTools interop example
- NetCDF-Java example
- Which one is best?
- netcdfjs example (maybe interactive with scittle/react/clay)
HDF
Another widely used multidimensional array format in the scientific GIS world.
Zarr
TODO:
- how to read in Clojure
Vector
GeoJSON
- json->edn
- spec validation for geoJSON
- review FarmLogs/geojson
Shapefile
Notes:
Maybe Factual/geo is good for some of this?
Cloud Optimized
PMTiles
- Reading: Timeverse PMtiles (Java interop)
- Creation: CLI / Babashka?
Notes:
The Cloud Native Geo guide may be a useful starting pount for some of this.
Image from https:/guide.cloudnativegeo.org
Image processing
Routing / Network analysis
Some articles to review
Spatial DBs
- postGIS
- MBTiles / sqllite
Spatial reference systems
Coordinate system conversions
- Coordinate Systems article maybe a good starting point for a Clojure oriented article on the same.
H3
- again, Factual/geo may be a good starting point.
Map widgets
- Leaflet
- Openlayers
- Kepler.gl
Geo-coding / Addresses
Remote sensing
Satellite imagery
- Sentinel2
- Planet
- Google Earth Engine
Tile Servers
Python integration (libpython-clj)
A lot of GIS work is done in Python. Creating documentation, tools, containers to make it quick/easy/simple to interact with Python from Clojure will make doing GIS work in Clojure more palatable.
Template Projects
Some deps-new or similar templates for getting started on GIS projects.
Existing articles for Clojure GIS
Perhaps we can link to, rework or use some existing work including:
- Seattle Parks - Scicloj
- Chicago Bikes - Scicloj
- Remote sensing water - Civitas
- Cesium - Civitas
- Clojure Maps Examples
source: src/gis/roadmap.clj