All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Improved README documentation
- Added visual examples
- Clarified usage examples
- Built-in default style via
GD::GIS::Style.default - Maps can now be rendered without explicitly assigning a style
- Default visual configuration for semantic layers:
- global settings (background, fonts, labels)
- roads
- rails
- water
- parks
- points
- track
- Default font and text color for point labels
- Default drawing order when no external style is provided
GD::GIS::Mapnow automatically assigns a default style during initialization- Style configuration is now optional when creating a map
- Rendering pipeline updated to operate safely with default style values
- Track layer styling structure aligned with renderer expectations
- Prevented crashes when a map instance had no style assigned
- Fixed
NoMethodErrorcaused by@stylebeingnil - Corrected handling of track layer style definitions
- Ensured label rendering works with the default style
- Fixed font and color handling for point labels
- Existing custom styles remain fully supported
- External YAML styles continue to work unchanged
- Explicit style assignment (
map.style = ...) still overrides defaults
- Global geographic extents dataset (
extents_global.json) including continents and countries (WGS84 bounding boxes) - Support for using named regions as
bboxvalues (e.g.:world,:europe,:argentina) - Lazy-loaded
GD::GIS::Extentsmodule for resolving symbolic bounding boxes - Ability to access extents via
GD::GIS::Extents.fetchandGD::GIS::Extents[] - New JSON-backed data storage for geographic extents
- Developer experience for quick map rendering without manually specifying coordinates
- Simplified API for demos, tests, and rapid prototyping
- Bounding boxes are approximate and intended for visualization purposes
- Coordinates use WGS84 (EPSG:4326) longitude/latitude order
- Updated example to align with core stylesheet changes.
- Improved YAML style structure consistency with other geometry types.
- Better defaults inherited from core styles (label handling and opacity).
- Minor cleanup in stylesheet naming and comments.
- No changes to geometry rendering logic.
- Initial complete MultiLineString example.
- Demonstrates rendering of
MultiLineStringgeometries from GeoJSON. - Basic YAML stylesheet support for:
- stroke color
- stroke width
- layer drawing order
- Static bounding box definition.
- PNG output suitable for documentation and testing.
- Expanded point rendering modes:
- image icons
- numeric markers
- alphabetic markers
- Updated stylesheet structure to match core
pointsstyle definition. - Added support for
font_colorin numeric and alphabetic modes. - Improved label defaults inherited from global core styles.
- Switched to automatic bounding box calculation from GeoJSON.
- Minor stylesheet cleanup and alignment with core style conventions.
- Initial Points example using basic icon rendering.
- YAML stylesheet support for:
- point color
- icon image
- label color
- Static font configuration.
- Manual bounding box definition.
- Full support for GeoJSON Point features as overlay layers.
- New
pointssection in styles (solarized.yml) to configure:iconfontsizecolor(RGB, RGBA, or automatic).
- Point labels, configurable via style.
- Centralized color normalization via
Style#normalize_color. - Automatic random vivid color generation when no color is specified.
- Default point marker when no
iconis provided.
- GeoJSON classification now takes geometry type (
Point,LineString,Polygon) into account in addition to feature properties. Pointfeatures are rendered as overlay layers (PointsLayer) instead of legacy semantic layers.- Style handling is centralized in
Style; layers now receive resolved values only (improved separation of concerns).
- Stricter style validation:
- Clear exceptions are raised when required
pointskeys are missing.
- Clear exceptions are raised when required
- More explicit error messages for better debugging and developer experience.
- Cleaner architecture between
Map,Style, and rendering layers with reduced coupling.
- GeoJSON files containing only
Pointfeatures now render correctly. - Fixed silent failures caused by mismatches between style definitions and geometry types.
- Corrected improper calls to color helpers (
ColorHelpers).
This release transforms libgd-gis from an OSM-only renderer into a true multi-source GIS engine.
A CRS middleware was added so that all incoming geometries are normalized to CRS84 (lon,lat) before rendering.
Supported inputs:
urn:ogc:def:crs:OGC:1.3:CRS84EPSG:4326EPSG:3857(Web Mercator)
Implemented in CRS::Normalizer and automatically applied in LayerGeoJSON.
This allows loading GeoJSON from:
- OpenStreetMap
- QGIS exports
- IGN Argentina
- Any WGS84 or Mercator dataset
without breaking projection or map alignment.
A new ontology system was introduced to decouple data source from map meaning.
Instead of reading OSM-specific tags (waterway, highway, etc),
features are now classified by semantic meaning:
:water :roads :parks :rails
regardless of their source.
Implemented in:
Ontology(lib/gd/gis/ontology.rb)ontology.yml(semantic dictionary)
Example:
| Source | Raw value | Ontology |
|---|---|---|
| OSM | waterway=river |
:water |
| IGN | objeto=Canal |
:water |
| QGIS | type=drainage |
:water |
This makes it possible to mix IGN, OSM and QGIS layers in the same map.
libgd-gis can now render Argentina’s official hydrology datasets from the Instituto Geográfico Nacional (IGN), including:
- Rivers
- Streams
- Canals
- Drainage networks
- Delta systems
using GeoJSON exports and ontology-based classification.
-
LayerGeoJSONnow:- Detects CRS
- Reprojects coordinates
- Classifies features through ontology
- Produces
Featureobjects withfeature.layer
-
The rendering pipeline now uses semantic layers instead of source-specific tags.
GeoJSON → CRS Normalizer → Ontology → Feature(layer) → Map → Style → Raster
This is the same architecture used by professional GIS systems (QGIS, ArcGIS, Mapbox).
Release date: 2026-01-12
This release is a major step forward for libgd-gis, focused on cartographic quality, styling, and GIS-grade rendering features.
libgd-gis now supports external style definitions to control how maps are rendered.
You can define:
- Road strokes and casings
- Water layers
- Parks, rails, and custom layers
- Label colors and font sizes
Styles can be loaded and applied at render time, enabling themeable maps (dark, light, carto-like, satellite overlays, etc).
Full support for rendering GeoJSON layers:
PolygonMultiPolygonLineStringMultiLineString- Feature properties are preserved for labeling and classification
This allows:
- City boundaries
- Rivers
- Roads
- Parks
- Administrative areas
- Any GIS dataset exported as GeoJSON
The new map.image API exposes the underlying GD::Image instance:
map.image.text(...)
map.image.rectangle(...)
map.image.filled_rectangle(...)
This allows custom overlays, labels, legends, watermarks, UI elements, and cartographic decorations to be drawn directly on top of the map.
A new labeling system was added:
- Labels for:
- Routes
- Rivers
- Points
- Polygons
- Lines
- Automatic label placement
- Repeated label suppression
- Font, size, and color driven by styles
This allows producing real map-quality annotated maps.
Points can now be rendered from tabular or CSV-like data:
map.add_points(data,
lon: ->(r) { r["lon"] },
lat: ->(r) { r["lat"] },
label: ->(r) { r["name"] },
icon: "marker.png"
)
If icon is omitted, a default marker is generated automatically.
Rendering now uses truecolor images with alpha support, enabling:
- Smooth antialiased lines
- Alpha-blended layers
- High-quality labels
- Professional cartographic output
- Fixed repeated labels appearing multiple times on the same feature
- Improved projection and bounding box handling
- Improved clipping of features near map borders
- Fixed polygon and multipolygon drawing issues
- Improved water layer detection and rendering
- Improved layer ordering and rendering pipeline
- Fixed CI and Docker builds for GD and pkg-config
- Added full RSpec rendering pipeline tests
- Added point layer tests
- Added GeoJSON rendering tests
- Added CI support for libgd via apt + pkg-config
- Docker and GitHub Actions now use the same GD build path
- Requires ruby-libgd ≥ 0.2.1
- Works with Ruby 3.2 – 3.3
- Tested on Linux, Docker, and CI
This release transforms libgd-gis from a prototype into a real GIS rendering engine for Ruby: styles, labels, GeoJSON, points, and professional-grade map output.