|
| 1 | +^{:kindly/hide-code true |
| 2 | + :clay {:title "GIS roadmap" |
| 3 | + :quarto {:author :luke-zeitlin |
| 4 | + :type :post |
| 5 | + :date "2025-10-23" |
| 6 | + :draft true |
| 7 | + :category :gis |
| 8 | + :tags [:gis]}}} |
| 9 | + |
| 10 | +(ns gis.roadmap |
| 11 | + (:require [scicloj.kindly.v4.kind :as kind])) |
| 12 | + |
| 13 | +;; # Roadmap for Clojure GIS |
| 14 | +;; The plan is to present a cohesive story for GIS work in the Clojure ecosystem. |
| 15 | +;; At present this document can serve as a location to add notes, todos and thoughts. |
| 16 | +;; Some future version of it may serve as a landing page. |
| 17 | +;; # Why Clojure? |
| 18 | +;; ## TODO: |
| 19 | +;; A few words about why Clojure is good for GIS... |
| 20 | +;; - Clojure's ability to interact with multiple host environments (Java, JS, Python, etc). |
| 21 | +;; - Same language on the front and backend |
| 22 | +;; - Ergonomic data workflow |
| 23 | +;; - Interactive development |
| 24 | +;; # GIS Task Categories |
| 25 | +;; ## Image formats |
| 26 | +;; ### Raster |
| 27 | +;; #### Cloud Optimized GeoTIFF (COG) |
| 28 | +;; ##### What is a COG? |
| 29 | +;; **TIFF** is an extensible image file format. **GeoTIFFs** are TIFFs with geospatial metadata |
| 30 | +;; such as coordinate reference / projection information, Geographic extent, |
| 31 | +;; pixel resolution and so on. |
| 32 | +;; **Cloud Optimized GeoTIFFs (COGs)** are geoTIFFs arranged for efficient access over HTTP. This |
| 33 | +;; is achieved with tiled layouts allowing for partial access (using HTTP range requests), |
| 34 | +;; and resolution pyramids. This allows for fetching only the portion of the COG required. |
| 35 | +;; |
| 36 | +;; More details on the format at: [cogeo.org](https://www.cogeo.org) |
| 37 | +;; |
| 38 | +;; #### How to interact with COGs with Clojure |
| 39 | +;; Many libraries for creation and manipulation of GeoTIFF data in other languages rely on |
| 40 | +;; the [GDAL binary](https://gdal.org). |
| 41 | +;; This is performant and battle-tested but has a large footprint and is vulnerable to |
| 42 | +;; version mismatches between the client language and GDAL. |
| 43 | +;; |
| 44 | +;; Some pure language implementations (that do not depend on GDAL) exist, such as |
| 45 | +;; [geotiff.js](https://geotiffjs.github.io/) for JavaScript and [GeoTools](https://geotools.org/) in Java. |
| 46 | +;; For the sake of |
| 47 | +;; simplicity we recommend using interop with pure language GeoTIFF library where possible. |
| 48 | +;; |
| 49 | +;; ##### TODOs: |
| 50 | +;; - GeoTools / Java interop example |
| 51 | +;; - geotiff.js / JavaScript interop example |
| 52 | +;; - Example of a containerized Python bindings with GDAL setup. |
| 53 | +;; |
| 54 | +;; |
| 55 | +;; #### NetCDF |
| 56 | +;; NetCDF is a format for metadata enhanced, compressed, multidimensional arrays. |
| 57 | +;; Often used for weather, climate, remote sensing and |
| 58 | +;; oceanographic data. |
| 59 | +;; Both [GeoTools](https://geotools.org/) and [NetCDF-Java](https://docs.unidata.ucar.edu/netcdf-java) are acceptable ways to to handle and create |
| 60 | +;; netCDF files in Java-hosted Clojure. In JS we can read NetCDF files with |
| 61 | +;; [netcdfjs](https://github.com/cheminfo/netcdfjs) |
| 62 | +;; ##### TODOs: |
| 63 | +;; - GeoTools interop example |
| 64 | +;; - NetCDF-Java example |
| 65 | +;; - Which one is best? |
| 66 | +;; - netcdfjs example (maybe interactive with scittle/react/clay) |
| 67 | +;; |
| 68 | +;; #### HDF |
| 69 | +;; Another widely used multidimensional array format in the scientific GIS world. |
| 70 | +;; |
| 71 | +;; [HDF in clojure](https://scicloj.github.io/clojure-data-scrapbook/projects/data-formats/hdf/index.html) |
| 72 | +;; #### Zarr |
| 73 | +;; ##### TODO: |
| 74 | +;; - how to read in Clojure |
| 75 | +;; |
| 76 | +;; ### Vector |
| 77 | +;; #### GeoJSON |
| 78 | +;; - json->edn |
| 79 | +;; - spec validation for geoJSON |
| 80 | +;; - review [FarmLogs/geojson](https://github.com/FarmLogs/geojson) |
| 81 | +;; #### Shapefile |
| 82 | +;; - [ovid](https://github.com/willcohen/ovid) |
| 83 | +;; #### Notes: |
| 84 | +;; Maybe [Factual/geo](https://github.com/Factual/geo) is good for some of this? |
| 85 | +;; |
| 86 | +;; ## Cloud Optimized |
| 87 | +;; ### PMTiles |
| 88 | +;; - Reading: Timeverse PMtiles (Java interop) |
| 89 | +;; - Creation: CLI / Babashka? |
| 90 | +;; ### Notes: |
| 91 | +;; [The Cloud Native Geo guide](https://guide.cloudnativegeo.org/) may be a useful starting |
| 92 | +;; pount for some of this. |
| 93 | +;; |
| 94 | +^:kindly/hide-code |
| 95 | +(kind/image {:src "cogeo-formats-table.png" |
| 96 | + :style {:width "30em"}}) |
| 97 | +;; *Image from https:/guide.cloudnativegeo.org* |
| 98 | +;; |
| 99 | +;; ## Image processing |
| 100 | +;; Routing / Network analysis |
| 101 | +;; ### Some articles to review |
| 102 | +;; - [GTFS](https://en.wikipedia.org/wiki/GTFS) |
| 103 | +;; - [MATSim](https://github.com/matsim-org) |
| 104 | +;; |
| 105 | +;; ## Spatial DBs |
| 106 | +;; - postGIS |
| 107 | +;; - MBTiles / sqllite |
| 108 | +;; |
| 109 | +;; ## Spatial reference systems |
| 110 | +;; ### Coordinate system conversions |
| 111 | +;; - [Coordinate Systems article](https://mgimond.github.io/Spatial/chp09_0.html) maybe a good starting point for a Clojure oriented article on the same. |
| 112 | + |
| 113 | +;; ### H3 |
| 114 | +;; - again, [Factual/geo](https://github.com/factual/geo) may be a good starting point. |
| 115 | +;; |
| 116 | +;; ## Map widgets |
| 117 | +;; - Leaflet |
| 118 | +;; - Openlayers |
| 119 | +;; - Kepler.gl |
| 120 | +;; |
| 121 | +;; ## Geo-coding / Addresses |
| 122 | +;; |
| 123 | +;; ## Remote sensing |
| 124 | +;; ### Satellite imagery |
| 125 | +;; - Sentinel2 |
| 126 | +;; - Planet |
| 127 | +;; - Google Earth Engine |
| 128 | +;; ## Tile Servers |
| 129 | +;; |
| 130 | +;; # Python integration (libpython-clj) |
| 131 | +;; A lot of GIS work is done in Python. Creating documentation, tools, containers to |
| 132 | +;; make it quick/easy/simple to interact with Python from Clojure |
| 133 | +;; will make doing GIS work in Clojure more palatable. |
| 134 | +;; |
| 135 | +;; # Template Projects |
| 136 | +;; Some [deps-new](https://github.com/seancorfield/deps-new) or similar templates for |
| 137 | +;; getting started on GIS projects. |
| 138 | +;; |
| 139 | +;; # Existing articles for Clojure GIS |
| 140 | +;; Perhaps we can link to, rework or use some existing work including: |
| 141 | +;; - [Seattle Parks - Scicloj](https://scicloj.github.io/clojure-data-scrapbook/projects/geography/seattle-parks/index.html) |
| 142 | +;; - [Chicago Bikes - Scicloj](https://scicloj.github.io/clojure-data-scrapbook/projects/geography/chicago-bikes/index.html) |
| 143 | +;; - [Remote sensing water - Civitas](https://clojurecivitas.github.io/earth_observation/waterquality.html) |
| 144 | +;; - [Cesium - Civitas](https://clojurecivitas.github.io/cesium/geovis.html) |
| 145 | +;; - [Clojure Maps Examples](https://github.com/joannecheng/clojure-map-examples) |
| 146 | +^:kindly/hide-code |
| 147 | +(comment |
| 148 | + , |
| 149 | + (require '[scicloj.clay.v2.api :as clay]) |
| 150 | + |
| 151 | + (clay/make! {:source-path "src/gis/roadmap.clj" |
| 152 | + :live-reload :toggle})) |
| 153 | + |
0 commit comments