libgd-gis moves into serious cartography territory

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:

Article content

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:

Article content

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

📝 Article Sponsorship
Your brand featured inside a technical article (clearly marked as sponsored).
📌 Inline Sponsored Block
Highlighted sponsor section embedded within an article.
📎 Sidebar Sponsor
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.

Article content

Leave a comment