
January 13, 2026
Rivers of Europe and Entre Ríos rendered directly in Ruby
Today marks a major milestone for libgd-gis: we crossed from “experimental map renderer” into a real GIS-grade drawing engine.
Using nothing but Ruby + libgd, we are now able to render continent-scale river networks, provincial hydrology, and complex GeoJSON layers with proper classification, styling, and compositing — no QGIS, no Mapbox, no JavaScript.
Let’s look at what changed.
🌍 Europe — continental hydrology rendered in Ruby
This image shows the full river system of Europe, loaded from Natural Earth GeoJSON and rendered by libgd-gis:

This is not a static tile. This is a live GeoJSON rendering pipeline:
GeoJSON → Feature → Projection → Style → GD raster
Every river you see is:
- Parsed from GeoJSON
- Classified as water
- Projected to image coordinates
- Drawn with vector-correct stroke geometry
- Composited onto a basemap
In traditional GIS this would require GDAL + QGIS + PostGIS. Here it runs inside a single Ruby process.
🇦🇷 Entre Ríos — real provincial-scale hydrography
The same pipeline now works at regional precision.
This is Entre Ríos Province, Argentina, using hydrology layers only:

Notice what is being rendered:
- Paraná River (main channel)
- Uruguay River
- Delta branches
- Interior streams
- Tributaries and sub-basins
All of this comes from GeoJSON water features, not raster tiles.
🧠 What changed in libgd-gis
The key upgrade today was semantic layer classification.
Instead of blindly drawing everything, libgd-gis now understands what a feature is:
water: ign: objeto: - canal - río - arroyo - embalse - laguna - dique - represa gna: - canal - río - arroyo - embalse - laguna
This ontology allows libgd-gis to:
- Detect water bodies across datasets
- Merge IGN + GNA + Natural Earth + OSM sources
- Draw them in a unified water layer
- Apply special stroke & fill rules
This is real GIS semantics, not just drawing lines.
Advertise on RubyStackNews
RubyStackNews is a niche publication read by Ruby and Rails developers worldwide. Our audience includes senior engineers, tech leads, and decision-makers from the US, Europe, and Asia.
Sponsorship Options
Your brand featured inside a technical article (clearly marked as sponsored).
Highlighted sponsor section embedded within an article.
Logo + link displayed site-wide in the sidebar.
- Highly targeted Ruby / Rails audience
- Organic traffic from search and developer communities
- No ad networks — direct sponsorships only
Interested in sponsoring RubyStackNews?
Contact via WhatsApp🎨 Styles now behave like real map engines
Water is not just “blue lines” anymore.
libgd-gis now supports:
- Multi-stroke rivers
- Center lines
- Width scaling
- Alpha transparency
- Polygon vs line water bodies
Example:
water: stroke: [0, 120, 255] stroke_width: 6 fill: [180, 220, 255] fill_width: 4 center: [255, 255, 255] center_width: 1
That is how real cartography is done — and now Ruby can do it.
🗺️ Why this matters
You can now build:
- Hydrology maps
- Environmental dashboards
- Flood modeling previews
- GIS thumbnails
- Offline map images
- Scientific plots
- Spatial reports
…all inside Ruby, without external GIS engines.
This is not about replacing QGIS. This is about embedding GIS inside Ruby applications.
Rails can now generate maps.
🟥 ruby-libgd
Native Ruby raster engine with alpha blending, image scaling, filters and pixel-level drawing.
RubyGems Source code🗺️ libgd-gis
GIS rendering for Ruby: basemaps, lines, polygons and projections built on top of ruby-libgd.
RubyGems Source code🚀 What this unlocks next
Because water, roads, railways, parks, cities and regions are now first-class layers, the next steps become possible:
- Label placement
- Z-ordering
- Symbolizers
- Heatmaps
- Tile generation
- Thematic GIS (population, climate, terrain)
libgd-gis is no longer a toy — it is becoming a Ruby GIS engine.
If you are in the Ruby ecosystem and you ever thought “why do I need JavaScript just to draw a map?”
Now you don’t.
Ruby can draw the world.
