Tuesday, June 16, 2026

Mapping least known countries making historic appearances in the 2026 FIFA World Cup

 The world's least-known and least-visited countries are primarily remote island nations, landlocked enclaves, and overlooked territories. Despite their obscurity, these destinations offer pristine, crowd-free environments and unique cultural histories. The least known and smallest countries making historic appearances in the 2026 FIFA World Cup include 'Bosnia and Herzegovina', Curaçao and Cape Verde, which are making their tournament debuts. This expanded 48-team tournament allows several lesser-known, smaller, and debutant nations to reach football's biggest stage.

Some destinations capture the imagination not because they dominate headlines, but because they remain delightfully off the radar. Today, we're mapping three such places: Bosnia and Herzegovina, Curaçao, and Cape Verde. Each offers a unique blend of history, culture, and natural beauty that defies their under-the-radar status.

But in 2026, these nations have something else in common: they're all making historic appearances on football's biggest stage. As the FIFA World Cup expands to 48 teams, these three have seized their moment, earning spots that will put them firmly in the global spotlight. Here's why you should know them both on the pitch and beyond.


Bosnia and Herzegovina

Bosnia and Herzegovina have officially taken the 2026 FIFA World Cup by storm. Written off ahead of the grueling UEFA play-offs, the "Dragons" produced a legendary, screen-worthy comeback. They survived a penalty shootout against Wales before completely shattering the script in Zenica, defeating heavy favorites Italy on penalties to punch their ticket to North America.

Guided by manager Sergej Barbarez, the squad beautifully bridges generations. Iconic 40-year-old captain Edin Džeko leads the front line, while breakout 21-year-old winger Esmir Bajraktarević—who ice-coldly slotted home the winning penalty against Gianluigi Donnarumma—injects fresh energy. Competing in just their second-ever World Cup, Bosnia and Herzegovina enter Group B with no fear, ready to battle Canada, Switzerland, and Qatar for a historic spot in the knockout stages.

From a cartographic perspective, Bosnia and Herzegovina boasts one of the most fascinating spatial layouts in the Balkan Peninsula. It occupies a central location in Southeastern Europe, structurally bridging the rugged interior of the Dinaric Alps with the Mediterranean basin.


Cartographically, its most striking feature is the Neum Corridor a historical 20-kilometer sliver of land cutting through Croatia to grant the nation its only access to the Adriatic Sea. Administratively, the map reflects a highly decentralized structure under the Dayton Agreement, split into the Federation of Bosnia and Herzegovina, Republika Srpska, and the self-governing Brčko District.


Curaçao 

The 2026 FIFA World Cup has delivered its ultimate underdog fairytale. With a tiny population of just over 156,000 and a compact land area of 444 square kilometers, Curaçao has officially become the smallest nation in history to qualify for a World Cup, eclipsing the record previously held by Iceland.
Under the guidance of 78-year-old veteran manager Dick Advocaat, the "Blue Wave" engineered an astonishing, undefeated 10-match qualification campaign in the CONCACAF zone. After breezing through the second round, they faced an intense third-round group alongside Jamaica, Trinidad and Tobago, and Bermuda. The defining moment arrived on November 18, 2025, in Kingston. Needing a single point against heavyweights Jamaica, Curaçao’s disciplined defense ground out a historic 0-0 draw, topping Group B and booking their tickets to Group E.
Geographically, Curaçao is a hidden gem of the Lesser Antilles, nestled in the southern Caribbean Sea. Located roughly 65 kilometers (40 miles) north of the Venezuelan coast, it forms part of the ABC islands alongside Aruba and Bonaire.
From a cartographic perspective, the country is characterized by its elongated, narrow shape stretching from northwest to southeast. The capital city and major port of Willemstad splits the southwestern coast, acting as a crucial maritime gateway. Heavily influenced by its semi-arid climate, the rugged, low-lying topography is ringed by spectacular coral reefs, putting this tiny powerhouse firmly on both global travel and sports maps.


Cape Verde (Cabo Verde)

The 2026 FIFA World Cup is proving to be a tournament of jaw-dropping milestones, and Cape Verde (Cabo Verde) is riding the crest of that wave. Representing an archipelago home to barely 600,000 people, the "Blue Sharks" have captured global imagination by sealing their first-ever World Cup ticket, introducing themselves with a stunning 0–0 opening draw against European champions Spain.
Under the tactical masterclass of homegrown coach Bubista, Cape Verde engineered a staggering upset in CAF Group D. Anchored by a rock-solid low defensive block and efficient transition play, they went on a relentless run—winning 7 out of 10 qualification matches. The decisive moment came on October 13, 2025, when a convincing 3–0 triumph over Eswatini officially pushed them to 23 points, topping the table and completely eclipsing African powerhouse Cameroon.
From a geographic and cartographic viewpoint, Cape Verde's territory is an isolated, volcanic marvel. Located in the central Atlantic Ocean, the nation is an archipelago composed of 10 volcanic islands (nine of which are inhabited) and five islets, situated roughly 570 kilometers (350 miles) off the western coast of Senegal, West Africa.  The islands are uniquely divided into two primary horseshoe-shaped groups based on prevailing wind patterns: the Barlavento (Windward) islands to the north, including Santo Antão and Sal, and the Sotavento (Leeward) islands to the south, which include Santiago, home to the capital city of Praia. This rugged, mountainous maritime positioning historically made it a vital seafaring crossroads—and today, it serves as the foundation for one of the most resilient, tightly knit footballing families on the planet.

Conclusion

The historic appearances of Bosnia and Herzegovina, Curaçao, and Cape Verde at the 2026 FIFA World Cup remind us that maps are never truly static. In a single tournament cycle, these three distinct nations have fundamentally redrawn the boundaries of global football.

From a geospatial and cartographic perspective, their journeys reflect an incredible triumph over geographical constraints. Whether overcoming the intricate internal topography of the Balkans, navigating the isolated maritime coordinates of a volcanic Atlantic archipelago, or proving that a tiny 444-square-kilometer Caribbean island can stand toe-to-toe with global giants, these nations have bridged vast spatial divides through sheer sporting excellence.

For cartographers, researchers, and football enthusiasts alike, the lessons extend far beyond the pitch:

  • Bosnia and Herzegovina proved that grit can unite complex administrative borders.
  • Curaçao shattered records to show that small spatial scale does not dictate human potential.
  • Cape Verde put its isolated Atlantic coordinates firmly at the center of the sporting world.

As the tournament progresses across North America, these "least-known" countries are no longer just fascinating anomalies or tiny dots on a reference map. They have earned their coordinates on the grandest stage of all, proving that on the pitch, every corner of the globe has a voice.

Thursday, April 9, 2026

Comparison of AI Generated Cartographic Webmap

 In this post, I will provide a simple request in plain English to four AI tools (namely: Gemini, ChatGPT, DeepSeek and Grok) to compare the results we get. The prompt provided is this sentence below;-

Generate html webmap with all the necessary cartographic elements

Note that the request statement isn't detailed, as no specific location and technical functionality were provided. This is delibrate to see how each AI tool thinker and solve the problem.


Gemini


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Professional Web Map Interface</title>
    
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
    
    <style>
        body { margin: 0; padding: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
        #map { height: 100vh; width: 100vw; }

        /* Map Legend Styling */
        .legend {
            padding: 10px;
            background: white;
            line-height: 1.5;
            color: #333;
            border-radius: 5px;
            box-shadow: 0 0 15px rgba(0,0,0,0.2);
        }
        .legend i {
            width: 18px;
            height: 18px;
            float: left;
            margin-right: 8px;
            opacity: 0.7;
        }

        /* Header Overlay */
        .map-header {
            position: absolute;
            top: 10px;
            left: 50px;
            z-index: 1000;
            background: rgba(255, 255, 255, 0.9);
            padding: 5px 15px;
            border-radius: 4px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>

<div class="map-header">
    <h2>City Infrastructure Overview</h2>
</div>

<div id="map"></div>

<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>

<script>
    // 1. Initialize the Map
    const map = L.map('map').setView([45.523062, -122.676482], 13);

    // 2. Base Layers (Cartography Element: Reference Frame)
    const osm = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '© OpenStreetMap contributors'
    }).addTo(map);

    const satellite = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
        attribution: 'Tiles &copy; Esri'
    });

    // 3. Data Layers (Thematic Elements)
    const parks = L.layerGroup();
    L.marker([45.528, -122.662]).bindPopup("<b>Holladay Park</b><br>Public Green Space").addTo(parks);
    L.marker([45.515, -122.684]).bindPopup("<b>Portland Art Museum</b><br>Cultural Center").addTo(parks);

    // 4. Layer Control (Interactivity)
    const baseMaps = {
        "Street Map": osm,
        "Satellite": satellite
    };
    const overlayMaps = {
        "Points of Interest": parks
    };
    L.control.layers(baseMaps, overlayMaps, {collapsed: false}).addTo(map);

    // 5. Scale Bar (Cartography Element: Measurement)
    L.control.scale({ imperial: true, metric: true, position: 'bottomleft' }).addTo(map);

    // 6. Custom Legend (Cartography Element: Symbology)
    const legend = L.control({position: 'bottomright'});
    legend.onAdd = function (map) {
        const div = L.DomUtil.create('div', 'legend');
        div.innerHTML += '<h4>Map Legend</h4>';
        div.innerHTML += '<i style="background: #2196F3"></i><span>Commercial</span><br>';
        div.innerHTML += '<i style="background: #4CAF50"></i><span>Parks</span><br>';
        div.innerHTML += '<i style="background: #F44336"></i><span>Critical Infrastructure</span><br>';
        return div;
    };
    legend.addTo(map);

</script>
</body>
</html>

Saturday, February 7, 2026

Visualizing Common GIS Digitizing Errors

 To help visualize common GIS digitizing errors, I have created a comprehensive SVG graphic using Inkscape software. Each error is isolated and labeled to demonstrate the specific topological or geometric issue it represents.


The SVG file is here below, copy the SVG code into a text editor and save it with .svg extension.

<svg viewBox="0 0 800 600" xmlns="http://www.w3.org/2000/svg">
  <rect width="800" height="600" fill="#f8f9fa" />
  
  <style>
    .label { font-family: sans-serif; font-size: 12px; font-weight: bold; fill: #333; }
    .error-mark { fill: #e74c3c; stroke: #c0392b; stroke-width: 2; fill-opacity: 0.6; }
    .base-geo { fill: #3498db; stroke: #2980b9; stroke-width: 2; fill-opacity: 0.4; }
    .point { fill: #2c3e50; }
    .highlight { stroke: #e67e22; stroke-width: 3; stroke-dasharray: 4; }
  </style>

  <g transform="translate(50, 50)">
    <path d="M 0,0 L 100,0 L 0,80 L 100,80 Z" class="error-mark" />
    <text x="0" y="110" class="label">Self Intersection</text>
  </g>

  <g transform="translate(200, 50)">
    <path d="M 0,80 L 50,20 L 100,80" fill="none" stroke="#2980b9" stroke-width="2" />
    <circle cx="50" cy="20" r="4" class="point" />
    <circle cx="52" cy="22" r="4" fill="red" opacity="0.7" />
    <text x="0" y="110" class="label">Duplicate Nodes</text>
  </g>

  <g transform="translate(350, 50)">
    <path d="M 0,0 H 100 V 80 H 0 Z M 30,30 V 50 H 70 V 30 Z" class="base-geo" fill-rule="evenodd" />
    <text x="0" y="110" class="label">Hole (Undesired)</text>
  </g>

  <g transform="translate(500, 50)">
    <path d="M 0,80 L 45,80 L 48,78 L 100,80" fill="none" stroke="#2980b9" stroke-width="2" />
    <circle cx="46.5" cy="79" r="8" fill="none" stroke="red" />
    <text x="0" y="110" class="label">Short Segment</text>
  </g>

  <g transform="translate(650, 50)">
    <path d="M 0,80 L 100,75 L 0,70" fill="none" stroke="red" stroke-width="2" />
    <text x="0" y="110" class="label">Minimum Angle</text>
  </g>

  <g transform="translate(50, 200)">
    <rect x="40" y="40" width="10" height="10" class="error-mark" />
    <text x="0" y="110" class="label">Minimum Area</text>
  </g>

  <g transform="translate(200, 200)">
    <path d="M 0,40 Q 50,35 100,40 Q 50,42 0,40" class="error-mark" />
    <text x="0" y="110" class="label">Sliver Polygon</text>
  </g>

  <g transform="translate(350, 200)">
    <rect x="10" y="10" width="80" height="60" class="base-geo" />
    <rect x="15" y="15" width="80" height="60" class="error-mark" opacity="0.4" />
    <text x="0" y="110" class="label">Duplicate Features</text>
  </g>

  <g transform="translate(500, 200)">
    <rect x="0" y="0" width="100" height="80" class="base-geo" />
    <circle cx="50" cy="40" r="20" class="error-mark" />
    <text x="0" y="110" class="label">Feature in Feature</text>
  </g>

  <g transform="translate(200, 350)">
    <rect x="0" y="0" width="80" height="80" class="base-geo" />
    <rect x="60" y="20" width="80" height="80" fill="#e74c3c" fill-opacity="0.5" stroke="#c0392b" />
    <text x="30" y="120" class="label">Overlap</text>
  </g>

  <g transform="translate(450, 350)">
    <path d="M 0,0 L 70,0 L 65,80 L 0,80 Z" class="base-geo" />
    <path d="M 80,0 L 150,0 L 150,80 L 85,80 Z" class="base-geo" />
    <text x="45" y="120" class="label">Gap (Sliver)</text>
  </g>
</svg>


Self Intersection:- A polygon boundary crosses over itself. Breaks validity in OGC standards; creates "figure-eight" shapes.



Sliver Polygons:- Long, thin polygons often created by overlapping boundaries. Inflates feature count and messes up area calculations. This error come from very small polygon (with small area) with a large perimeter



Gaps & Overlaps:- Polygons that should be adjacent have space between them or sit on top of each other. Leads to "double counting" or "missing data" in spatial joins.



Minimum Angle:- Vertices are too close, creating a sharp "spike." Causes rendering artifacts and issues with offset/buffer tools.



Duplicate Nodes:- Multiple vertices at the same coordinates. Increases file size and slows down processing without adding detail.



Thank you for reading.

Monday, February 2, 2026

List of USGS EROS data portals

 The USGS Earth Resources Observation and Science (EROS) Center provides access to extensive satellite, aerial, and land surface data through several key portals. The primary platforms for searching and downloading imagery are EarthExplorer and GloVis. 

As of the year 2026, the USGS Earth Resources Observation and Science (EROS) Center continues to provide specialized portals for accessing satellite imagery and geospatial datasets. Accessing most of these services requires an account via the EROS Registration System (ERS).


Portal website links are provided below;-

1) EarthExplorer (EE) - https://earthexplorer.usgs.gov/
2) Global Visualization Viewer (GloVis) - https://glovis.usgs.gov/
3) LP DAAC (Land Data) - https://lpdaac.usgs.gov/
4) EROS Science Processing (ESPA) - https://espa.cr.usgs.gov/
5) Commercial Cloud Data (AWS) - https://registry.opendata.aws/
6) Machine-to-Machine (M2M) API - https://m2m.cr.usgs.gov/
7) Bulk Download Application (BDWA) - https://ebulk.cr.usgs.gov/
8) HDDS Explorer (Hazards/Disasters) - https://hdds.usgs.gov/
9) EarthNow! Landsat Viewer - https://earthnow.usgs.gov/
10) LANDFIRE Map Viewer - https://www.landfire.gov/viewer/
11) Multi-Resolution Land Characteristics (NLCD) - https://www.mrlc.gov/viewer/
12) Coastal Elevation Database (CoNED) - https://www.topotools.cr.usgs.gov
13) Monitoring Trends in Burn Severity (MTBS) - https://www.mtbs.gov/
14) AppEEARS (Data Subsetting) - https://appeears.earthdatacloud.nasa.gov/
15) IntELiMon Viewer (Interagency Ecosystem LiDAR Monitoring) - https://dmsdata.cr.usgs.gov/lidar-monitoring/viewer/
16) LRESA (Landsat Reprocessing Events Search Application) - https://lresa.cr.usgs.gov/
17) Spectral Characteristics Viewer - https://landsat.usgs.gov/spectral-characteristics-viewer
18) Fire Danger Viewer - https://fire-danger-viewer.cr.usgs.gov/
19) EROS Registration System (ERS) - https://ers.cr.usgs.gov/


That is it!

Tuesday, January 27, 2026

Bluepark upload custom HTML/CSS/JS webpage

 Bluepark is a powerful UK based ecommerce platform. Bluepark is a powerful ecommerce software, hosted on fast and reliable UK servers, provides scalable shopping cart solutions for small to large businesses. I helps you create your own online shop and sell online with the UK's leading all-in-one ecommerce platform, backed by our 5-star-rated Support Team.

In Bluepark, you do not "upload" a standalone HTML file in the traditional sense of FTP; instead, you add or edit HTML code through the admin panel to customize existing themes or content blocks.

If your HTML refers to external assets like custom scripts or specialized images:

  • Use the File Manager by navigating to Admin > Files.
  • Upload your assets here to host them on Bluepark's servers.
  • Note that for interactive elements, Bluepark variables and classes are often required to ensure functionality within their CMS environment. 


That is it!

Wednesday, January 14, 2026

How to Trust a JupyterLab Notebook

 If you have ever encountered the "JupyterLab is not trusted" message, that is a security warning feature designed to prevent malicious code like JavaScript or HTML in a notebook cell from automatically executing.



However, in some cases it is not a malicious code but JupyterLab erroniously classified it as one. In this post, I will guide you on how to fix it. That is how to trust the code in the JupyterLab Notebook.

You can mark a notebook as trusted using the GUI (the browser user interface) or the command line. I will focus on using the user interface for this guide.

Using the user interface (JupyterLab) to Trust a Notebook

Step 1: Open the notebook in JupyterLab

Step 2: Open the Command Palette by going to View >> Activate Command Palette



Step 3: Type 'trust' and select the "Trust Notebook" command as seen below.


That is it. Now re-start the JupyterLab server and re-run all the code cells.

Thank you for following.

Wednesday, December 17, 2025

Delete a table or layer from GeoPackage within QGIS

 To delete a table (layer) from a GeoPackage within QGIS, you can use either the Browser panel or the DB Manager.


Method 1: Using the Browser Panel

  1. This is the simplest and most direct way to delete a single table.
  2. Open the Browser panel: If it's not already visible, go to the top menu and select View > Panels > Browser Panel.
  3. Navigate to the GeoPackage: In the Browser panel tree, find the GeoPackage file (.gpkg) you are working with.
  4. Expand the GeoPackage: Click the arrow next to the GeoPackage name to view all the layers (tables) it contains.
  5. Delete the layer: Right-click on the specific layer/table you want to remove and select Delete Layer.
  6. Confirm the deletion: A confirmation window will appear; confirm that you want to delete the layer. 


Method 2: Using the DB Manager

The DB Manager provides a more database-oriented interface and is useful for managing multiple tables or running SQL commands. 

  1. Open the DB Manager: Go to the top menu and select Database > DB Manager.
  2. Connect to the GeoPackage: In the left-hand tree, expand GeoPackage. Right-click on GeoPackage and select New Connection, then browse to your .gpkg file.
  3. Find the table: Expand the connection to your GeoPackage and locate the desired table under Tables or Spatial tables.
  4. Delete the table: Right-click on the table name and select Delete.

That is it!

Saturday, December 6, 2025

CASE expression in QGIS

Understanding QGIS Expressions

A QGIS Expression is a combination of one or more values, operators, and functions that is evaluated dynamically within the context of a QGIS project.

The syntax for the QGIS Expression language is derived from Structured Query Language (SQL).

QGIS Expressions are utilized extensively throughout the QGIS environment, making familiarity with them essential for a wide range of geospatial tasks. Their applications include, but are not limited to:-

  1. Mapping and Symbology: Manipulating symbology and labels to create sophisticated, data-driven visual representations.
  2. Data Analysis and Management: Selecting features based on specific criteria, and generating new columns or updating existing ones in the attribute table.
  3. Feature Management: Creating new geometries using the Geometry Generator tool or calculating spatial attributes.
  4. Data Exploration: Filtering and querying data for rapid exploration and analysis.


The Syntax

  • (1) 'name' means a string text name
  • (2) "name" means a attribute column called name for the curent feature
  • (3) @name means a variable value called name. This used to be $name in older version of QGIS.
  • (4) name() means a function called name





The CASE expression in QGIS provides conditional logic, allowing the assignment of different values or the execution of different actions based on whether specified conditions are met. This is particularly useful in the Field Calculator, for data-defined properties, or within expressions used for labeling and symbology.


CASE

WHEN "NAME" IN ('New Caledonia', 'Jamaica', 'Bolivia', 'Suriname', 'Dem. Rep. Congo', 'Iraq') THEN "WB_A3" 

END















Wednesday, November 26, 2025

How to Open QGIS Attribute Table as a docked window

 If you don't want your layers attribute table been displayed as a regular window that is movable on screen, then you ca make it docked/fixed by following this guide.

When you open an attribute table of any vector layer by default, it will appear to cover the map canvas justr like the image below.

Even if you tried to move the attribute table window, it won't be of much help in having it docked like in the image below. 


To achieve this docked window, you need to make use of the 'Settings Menu' as follow;-

Settings ► Options ► Data sources ► Feature Attributes and Table. Then check the box for 'Open attribute table in a docked window'


You can also make the column size fit to content by checking the 'Autosize all columns by default when opening attribute table' check-box.


That is it!

Thursday, November 20, 2025

Mapping Inter-confederation, European playoffs fixtures for the 2026 World Cup

 As of November 20, 2025, 42 spots for the 48-team 2026 FIFA World Cup have been secured through direct qualification. The remaining six spots will be decided through two separate playoff tournaments in March 2026. 

In this post, I will create a map showing the teams that will participate in the playoff tournaments.

Teams for Inter-confederation playoff: New Caledonia, Jamaica, Bolivia, Suriname, DR Congo, and Iraq



Teams for European playoff: Italy, Northern Ireland, Wales, Bosnia-Herzegovina, Ukraine, Sweden, Poland, Albania, Turkey, Romania, Slovakia, Kosovo, Denmark, North Macedonia, Czech Republic and Republic of Ireland




Goodluck to the playoff teams