Skip to content
Octo × Generalization PT Request an assessment

Octo for cartographic generalization

The script removes the vertices. What disappears from the map is decided by the cartographer.

Simplifying, smoothing and aggregating already run without opening the interface, in PostGIS, QGIS, GRASS and mapshaper. What's new is coverage simplification: neighboring municipalities simplified together, with no gaps or slivers on the shared boundary. Octo builds the chain by scale, measures what changed and hands it over for review. The selection rule, the final tolerance and signing the product stay with the technical lead.

A fictitious coastline drawn three times, each with fewer vertices (412, 64 and 18), next to Octo, which takes the result to a boundary between two municipalities simplified with no gaps or overlaps 1:25,000 · original 1:250,000 · simplified 1:1,000,000 · simplified area < tolerance → removed COVERAGE MUN-A MUN-B GAPS AND SLIVERS: CHECK REPORT vertices before/after area deviation Hausdorff distance invalid geometries → CARTOGRAPHER ST_CoverageSimplify(geom, 200) OVER () OCTO × CARTOGRAPHY GENERALIZATION C-04
Illustration: the same coastline at three scales and a boundary simplified as a coverage; fictitious data.
ST_CoverageSimplify3.4PostGIS since 3.4, with GEOS 3.12
v.generalize13methods in GRASS 8.5, with displacement
ArcGIS Generalization16tools, for comparison only
Sources16listed at the end of the page
01

What Octo does in generalization.

Six possible deliverables, drawn from the research. All work on a copy, with the original dataset read-only, and all go to review by whoever is accountable for the product.

Multi-scale dataset, no slivers

Validates the boundary coverage, simplifies neighbors together for each scale and proves with numbers that no gaps or overlaps remain.

Deliverable: one coverage per scale + per-polygon report

Algorithm comparison

Runs Douglas-Peucker, Visvalingam and coverage simplification on the same layer and puts vertices, area deviation and Hausdorff distance side by side.

Deliverable: metrics table + maps to choose from

Selection by scale

Writes the cartographer's rule (stream order, road class, minimum area) and checks the count against Töpfer's radical law.

Deliverable: versioned rule + expected × actual count

Smoothing and displacement

Smooths rivers without changing road angles and moves a highway away from the river it hugs, keeping a map of what changed at each step.

Deliverable: derived layer + error maps + remaining conflicts

Buildings become blocks

Aggregates buildings by morphological closing, treating streets and rivers as barriers, and counts how many buildings fell into each block.

Deliverable: built-up area + layer of what was removed

Generalization by zoom

Pre-generalizes by zoom range with the cartographer's rule and leaves only the fine simplification to tippecanoe, instead of relying on density-based dropping.

Deliverable: layers by zoom ready for vector tiles
02

Eight arms, one derived map.

The same Octo cycle, applied to generalization. Each arm has a narrow role; the ones who decide what disappears, approve the scale and sign the product are people.

  1. Discovery

    Surveys what already exists

    PostGIS, GEOS, QGIS and GRASS versions, where the dataset lives, which derived products exist and how they are made today.

  2. Data

    Pins down references

    CRS in meters, join key (municipality code, segment code), whether the layer is a coverage, which one is the source and which one is the copy.

  3. Security

    Takes care of access and data

    Read-only source dataset, credentials outside the script (.pgpass, service) and data with usage restrictions assessed with the client before anything leaves the environment.

  4. Architecture

    Picks the path

    Feature by feature or coverage; PostGIS, QGIS or GRASS; pre-generalization by zoom or tippecanoe only.

  5. Development

    Writes the chain

    Scripts with a simulation mode, an error map for each step and a metrics report, with the source of each syntax noted in the file.

  6. Review

    Checks by the numbers and on the map

    Validates the output coverage, compares it with an already approved version and separates the cases the cartographer needs to see at the output scale.

  7. Release

    Delivers to the working copy

    Only with your OK, it writes to a working schema or folder. Replacing the product in use is a person's job.

  8. Documentation

    Records what applies to your project

    Tool versions, tolerances, selection rule and the result of each run. One product's rule is not assumed ready for another.

Octo works with read access and as support. It does not edit the original dataset, does not replace official products and does not sign map sheets: that belongs to the licensed technical lead.

03

Each operation, its own path.

The criteria Octo uses to choose, always checked against the version installed at the client.

TaskPathNote
Simplify boundaries that form a coverageST_CoverageSimplify, native:coveragesimplify, shapely.coverage_simplifyValidate before and after
Validate coverageST_CoverageInvalidEdges, native:coveragevalidateGap width in CRS units
Clean a dirty coverageST_CoverageClean (PostGIS 3.6) or mapshaperChanges the data: human review
Simplify rivers and roadsST_SimplifyPreserveTopology, v.generalize method=douglasCheck the failures (error=)
Simplify for the webmapshaper -simplify weighted, tippecanoeCheck at each zoom level
SmoothST_ChaikinSmoothing, method=chaiken, native:smoothgeometryVertices double: simplify afterward
Aggregate buildingsClosing buffer + barriers (Shapely or PostGIS)In ArcGIS, Aggregate Polygons requires Advanced
Select by scaleAttribute filter + radical law as a checkThe rule belongs to the cartographer
Move river and road apartv.generalize method=displacementHeavy on memory; run per sheet
Choose the tolerance afterwardST_SetEffectiveAreaEffective area stored in the M coordinate
04

From one-off simplification to a chain by scale.

Three steps. Each one only makes sense after the previous one has shown results with your mapping team.

A proposal, not a promise

1 Today

Measured simplification

You point to a layer and a scale; Octo runs the available algorithms and shows what each one changed.

  • Coverage validation of the dataset
  • DP, VW and coverage side by side
  • Report on vertices, area and Hausdorff
Benefit: choose the algorithm by the numbers, not by habit
2 Next

In-house multi-scale dataset

The boundary and hydrography dataset gets versions by scale, generated by the same rule at each update.

  • One coverage per scale, no gaps
  • Versioned river and road selection
  • Error maps for each step
Benefit: a new version of the dataset doesn't restart generalization from scratch
3 Later

Full chain with review

Building aggregation, displacement and zoom layers for web maps join the same chain, always with a review queue.

  • Built-up area by scale
  • Remaining conflicts listed for editing
  • Zoom layers for vector tiles
Benefit: the cartographer reviews the exceptions, not the whole map
05

Confirmed by sources.

Every point below has a source published by the responsible body (Planalto, IBGE, the Brazilian Army, CONCAR), by the project or by the standards organization. The sources are in the next section.

4

points with a published source, each with its reference alongside.

ConfirmedSimplifying one by one breaks the shared boundary
The PostGIS documentation says ST_SimplifyPreserveTopology does not preserve boundaries shared between polygons and points to ST_CoverageSimplify; ogr2ogr -simplify preserves topology per feature, but not across the whole layer.Source: postgis.net/docs; gdal.org, ogr2ogr
ConfirmedCoverage in three tools
ST_CoverageSimplify has existed since PostGIS 3.4 (GEOS 3.12), native:coveragesimplify since QGIS 3.36 and shapely.coverage_simplify since Shapely 2.1; ST_CoverageClean arrived in PostGIS 3.6, with GEOS 3.14.Source: PostGIS, QGIS and Shapely documentation; PostGIS 3.6.0 announcement
ConfirmedDisplacement in GRASS
v.generalize has 13 methods, including displacement; the manual says finding alpha and beta is a matter of trial and error, suggests 10 to 100 iterations and warns that the method uses a lot of memory.Source: GRASS 8.5 manual, v.generalize
ConfirmedOriginal algorithms
Douglas-Peucker was published in 1973 in Cartographica 10(2); Visvalingam-Whyatt in 1993 in The Cartographic Journal 30(1), with a comparison against Douglas-Peucker on two coastlines.Source: DOI records of the articles
06

What Octo does and what stays with you.

Octo prepares everything, but does not sign. The document of record stays with whoever is accountable for it.

Octo prepares

Surveys, calculates, organizes and produces the documents: spreadsheets, reports, sheets, maps and drafts.

Deliverable: material ready to check

Your team checks

The licensed professional checks what Octo delivered before signing. If something doesn't add up, it goes back to Octo with the correction.

Step: review by the signer

Who signs

Octo does not sign. Designs, technical reports, ART/RRT (Brazil's professional responsibility records), accountability reports and any official document are still signed by the company's or agency's licensed professional: here, the cartographic engineer or another licensed professional, with an ART; official data goes into the INDE only after approval by the competent authority.

Sign-off: licensed professional, with ART
07

Sources.

Project documentation, the original algorithm papers and public agency pages, accessed on October 31, 2026.

Your dataset at several scales, without redrawing the boundary.

The assessment starts with a layer your team already generalizes by hand, without touching the original dataset. You get the versions by scale with a report of what changed, and decide with them in hand.