All notable changes to this project will be documented in this file. This change log follows the conventions of keepachangelog.com.
:struct-fields metadata in fndefsout_*) automatically allocate, call, read, and free heap memory. Callers pass only input args and get back typed maps. 11 functions: proj_get_area_of_use, proj_get_area_of_use_ex, proj_cs_get_axis_info, proj_ellipsoid_get_parameters, proj_prime_meridian_get_parameters, proj_coordoperation_get_method_info, proj_coordoperation_get_param, proj_coordoperation_get_grid_used, proj_uom_get_info_from_database, proj_grid_get_info_from_database, proj_coordoperation_get_towgs84_valuesgetEllipsoid, getPrimeMeridian, crsGetCoordinateSystem, crsGetCoordoperation) and all out-param functionsproj_get_units_from_databaseproj_get_celestial_body_list_from_databaseproj_create: raw binding for PROJ strings, WKT, and pipeline definitions (e.g., +proj=pipeline +step +proj=robin)create-from-wkt, set-coord!, set-col!, out-param functions across all platforms (CLJ FFI, GraalVM, Node.js, Playwright, Java)bb deploy and bb deploy:dry-run tasks for release workflowdownload-grids task (was WIP, never completed):west-lon-degree). Java: camelCase strings ("westLonDegree"). JS camelCase aliases: camelCase keys (westLonDegree). JS snake_case aliases: snake_case keys (west_lon_degree). Out-param keys like :west_lon_degree are now :west-lon-degree; Java keys like "auth-name" and "semi_major_metre" are now "authName" and "semiMajorMetre".get-crs-info-list-from-database renamed to proj-get-crs-info-list-from-database (Clojure) / projGetCrsInfoListFromDatabase (JS)projCreateCrsToCrs) instead of snake_case (proj_create_crs_to_crs); both forms remain functionalstring-array-to-polyglot-array renamed to string-list-to-native-array, now cross-platformproj_as_proj_string on concatenated operations) now return nil instead of throwing (FFI) or returning "" (GraalVM)coord->coord-array: missing :browser case in CLJS dispatchcoord->coord-array: missing auto-initialization before dispatchset-coord!: wrapped JVM-only (was incorrectly cross-platform)toggle-graal!: now resets implementation to nil like force-graal!/force-ffi!null (was "")[] and frees allocated memoryextract-args: FFI gets "" (dtype-next rejects nil), WASM gets 0 (NULL, required for "all/any" semantics)extract-argsproj_create_from_wkt: pointer args changed to :pointer? (nullable)proj_create_crs_to_crs/proj_get_source_crs roundtrip, producing ISO-19111 compatible objects. A console.warn is emitted suggesting explicit contexts for better performance.force-worker-idx parameter on proj-emscripten-helper and def-wasm-fn-runtime for routing calls to a specific workerprojCreateCrsToCrs({source_crs: "EPSG:4326", target_crs: "EPSG:3857"}))extract-args to dispatch-proj-fn for both JVM and CLJSprojAsWkt when called without an explicit context on a PJ object created on a different workergetCrsInfoListFromDatabase now auto-creates a context when called without oneprojTransArray, projCreateCrsToCrs), plus manual aliases for helper functions (setCoords, coordArray, contextCreate, etc.)proj_network_stubs.c with EM_JS)Atomics.wait()proj-worker.mjs, fetch-worker.mjs) with context-to-worker affinitylogging.clj)network.clj) with ProxyExecutable callbacks dispatched via C stubsgetWorkerMode() / getWorkerCount() for inspecting the worker pool at runtimegraal.clj -- GraalVM dispatch now uses shared wasm.cljc code pathcontext-create accepts {:network false} option across all platformsproj_trans_array and allocated there. coord: now takes the coord array object directly instead of coords.malloc. Results are read via getCoords(coords, idx) instead of coords.array[i].proj.db, proj.ini, and proj-emscripten.wasm relative to module URL instead of HTML page (fixes CDN loading)proj_create_crs_to_crs_from_pj function
Java API: PROJ.java wrapper, PROJTest.java tests, bb test:java-ffi, bb test:java-graal, bb test:clj-ffi
Container-Based Build System:
Containerfile with builds for native, WASM, and development targetslinux/amd64, linux/aarch64, and windows/amd64--build-arg USE_LOCAL_PROJ=1Local PROJ Development Workflow:
bb proj:clone task to clone OSGeo/PROJ repository to vendor/PROJ--local-proj flag for all build tasks to use local PROJ instead of release versionextract-args now uses :argsemantics defaults (fixes proj_create_from_database NPE)proj_create_from_database options parameter changed to :pointer? for proper null handlingBabashka Build System: Complete replacement of shell scripts with bb.edn tasks
bb build command with --native, --wasm, and --cross optionsbb test:ffi, bb test:graal, bb test:cljs, bb test:playwright for comprehensive testingbb jar, bb pom, bb cherry, bb nrepl and other development tasksbb test:all and bb build:all meta-tasks for eventual CI/CD workflowsbb test-run for complete build and test pipeline (excluding deployment)Macro-Based Code Generation: Complete architectural refactor
fndefs.cljc containing all PROJ function definitions as datamacros.clj and macros.cljs for compile-time and runtime code generationRuntime Dispatch System: New unified architecture in proj.cljc
dispatch-proj-fn central router for all function callsextract-args for flexible parameter handling (supports both :source-crs and :source_crs styles)WebAssembly Module: New wasm.cljc namespace
proj-loader.mjs for ES6 module loadingTesting Infrastructure
examples/browser/index.htmlJavaScript/NPM Support
init function alias for cleaner JavaScript APIDeveloper Experience
Build System: Complete migration from shell scripts to Babashka
Project Structure
src/js/proj-emscripten/ to consolidated WASM support in coreEnums.java) - no longer needed with macro systemsrc/cljc/net/willcohen/proj/Implementation Files
graal.clj: Refactored to use macro-generated functionsnative.clj: Simplified with macro systemproj.cljc: Major refactor for runtime dispatchDocumentation
init functionDependencies
proj-emscripten JavaScript packageCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |