<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Kartoza</title><link>https://kartoza.github.io/kartoza-website/</link><description>Recent content in Home on Kartoza</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 21 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://kartoza.github.io/kartoza-website/rss.xml" rel="self" type="application/rss+xml"/><item><title>GeoAI: Building Smarter Spatial Decision-Making Systems</title><link>https://kartoza.github.io/kartoza-website/blog/geoai-building-smarter-spatial-decision-making-systems/</link><pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/geoai-building-smarter-spatial-decision-making-systems/</guid><description>&lt;h2 id="what-is-geoai">What is GeoAI?&lt;/h2>
&lt;p>It is 2:07 AM, heavy rain is pounding the city, and emergency teams need to know one thing fast: &lt;em>Which neighbourhoods will flood first?&lt;/em>&lt;/p>
&lt;p>&lt;strong>&lt;em>This is where GeoAI shines.&lt;/em>&lt;/strong>&lt;/p>
&lt;p>&lt;strong>GeoAI (Geospatial Artificial Intelligence)&lt;/strong> is the combination of AI and geospatial science to understand patterns in data tied to place and time. In simple terms, GeoAI does not just answer what might happen, it answers what, where, and when.&lt;/p></description></item><item><title>How to Use Custom Icons in Maputnik (Sprite Sheet Guide)</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-use-custom-icons-in-maputnik-sprite-sheet-guide/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-use-custom-icons-in-maputnik-sprite-sheet-guide/</guid><description>&lt;h2 id="the-missing-svg-button">The Missing SVG Button&lt;/h2>
&lt;p>If you have ever tried styling a vector map in Maputnik, you have probably hit this wall: you have a folder full of perfectly designed SVG icons, but there is no simple &amp;ldquo;Upload SVG&amp;rdquo; button for your symbol layers.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/UcXLuvc.png" alt="">&lt;/p>
&lt;p>Unlike desktop GIS software, web mapping specifications (like MapLibre and Mapbox GL) are optimised for rendering speed. Loading hundreds of individual SVG files requires too many HTTP requests and bogs down performance. Instead, the style specification requires a &lt;strong>sprite sheet&lt;/strong> : a single raster image (PNG) containing all your icons, paired with an index file (JSON) that tells the map exactly where each icon sits on that image.&lt;/p></description></item><item><title>Unlocking the World in Your Classroom: Namibia &amp; eSwatini Topo Sheets, New Thematic Projects, and Dynamic Indexes</title><link>https://kartoza.github.io/kartoza-website/blog/unlocking-the-world-in-your-classroom-namibia-eswatini-topo-sheets-new-thematic-projects-and-dynamic-indexes/</link><pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/unlocking-the-world-in-your-classroom-namibia-eswatini-topo-sheets-new-thematic-projects-and-dynamic-indexes/</guid><description>&lt;p>If you teach Geography, or Social Sciences in Grades 8 and 9, in Southern Africa, you know the struggle of finding high-quality, relevant, and curriculum-aligned maps for your classroom. The days of fighting with a temperamental photocopier over a faded, ten-year-old map sheet are officially behind us.&lt;/p>
&lt;p>Thanks to the ongoing partnership between SAGTA and Kartoza, the &lt;strong>SAGTA Map Downloader&lt;/strong> has levelled up. We are constantly looking for ways to make this a more robust tool for educators. Geography doesn&amp;rsquo;t stop at the border, and neither should our classroom resources.&lt;/p></description></item><item><title>Kartoza at BioMonWeek</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-at-biomonweek/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-at-biomonweek/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/tjajWKz.png" alt="">&lt;/p>
&lt;p>In early May Kartoza co-founders &lt;a
href="https://kartoza.com/the_team/tim-sutton/"
target="_blank"
rel="noopener"
>Tim Sutton&lt;/a> and &lt;a
href="https://kartoza.com/the_team/gavin-fleming/"
target="_blank"
rel="noopener"
>Gavin Fleming&lt;/a> attended &lt;a
href="https://2026.biomonweek.eu"
target="_blank"
rel="noopener"
>BioMonWeek&lt;/a> in Montpellier, France; the first ever European-wide conference on biodiversity monitoring. We went to show off the Biodiversity Information Management System (&amp;rsquo;&lt;a
href="https://bims.kartoza.com"
target="_blank"
rel="noopener"
>BIMS&lt;/a>&amp;rsquo;) that Kartoza and the &lt;a
href="https://frcsa.org.za"
target="_blank"
rel="noopener"
>Fresh Water Research Centre&lt;/a> have developed over the past ten or so years under the careful stewardship of Dimas tri Ciputra, senior developer at Kartoza. BIMS is Open Source (AGPL) and provides a complete platform for recording biological occurrence records, managing taxonomy and for reporting and exploring one&amp;rsquo;s data with numerous dashboards that help one to attain insights about the state of biodiversity in one&amp;rsquo;s area of interest.&lt;/p></description></item><item><title>Building an Operational Geospatial Workflow</title><link>https://kartoza.github.io/kartoza-website/blog/building-an-operational-geospatial-workflow/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/building-an-operational-geospatial-workflow/</guid><description>&lt;p>Developing a large-scale Earth Observation (EO) data pipeline, especially for the first time, includes the daunting task of transitioning from a localised EO workflow (often in the form of a &lt;a
href="https://docs.jupyter.org/en/latest/#what-is-a-notebook"
target="_blank"
rel="noopener"
>Jupyter Notebook&lt;/a>) to an operational workflow covering a much larger area of interest, like a country or continent. This article covers the main parts expected in a scalable and resource-efficient workflow, which you can use as a template to get you started.&lt;/p></description></item><item><title>Mapping a Sustainable Future: A Real-World Use Case for Open-Source GIS in Conservation</title><link>https://kartoza.github.io/kartoza-website/blog/mapping-a-sustainable-future-a-real-world-use-case-for-open-source-gis-in-conservation/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mapping-a-sustainable-future-a-real-world-use-case-for-open-source-gis-in-conservation/</guid><description>&lt;p>Recently, a colleague and I had the opportunity to represent Kartoza at the University of Pretoria&amp;rsquo;s joint Open Day for the faculties of Natural and Agricultural Sciences (NAS) and Engineering, Built Environment and Information Technology (EBIT). It was a fantastic event filled with prospective (and current) students eager to explore careers at the intersection of technology, engineering, and the natural world. However, having interacted with many of these potential future GIS professionals, I realised that a significant number of them did not fully understand how Geographic Information Systems (GIS) are actually being used in the real world. It is easy to get caught up in the academic theory of spatial data, but the practical applications are where this technology makes a tangible impact.&lt;/p></description></item><item><title>GEOE3: Geospatial Enabling Environments for Employment Spatial Tool</title><link>https://kartoza.github.io/kartoza-website/blog/geoe3-geospatial-enabling-environments-employment-tool/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/geoe3-geospatial-enabling-environments-employment-tool/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">GEOE3: Geospatial Enabling Environments for Employment Spatial Tool&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS Plugin&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="05cd3e53c7a36e36" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="05cd3e53c7a36e36" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
GEOE3 (formerly GEEST) is a powerful open-source spatial mapping tool developed by the World Bank that enables comprehensive analysis of how various spatial factors influence women&amp;rsquo;s employment and business opportunities.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;strong>GEOE3 (Geospatial Enabling Environments for Employment Spatial Tool)&lt;/strong> is a user-friendly QGIS plugin that analyses how spatial factors influence women&amp;rsquo;s economic participation across regions. Originally developed by the World Bank and Kartoza under the name GEEST, GEOE3 provides a comprehensive framework for gender-informed spatial analysis.&lt;/p></description></item><item><title>Reflections on FOSDEM 2026</title><link>https://kartoza.github.io/kartoza-website/blog/reflections-on-fosdem-2026/</link><pubDate>Tue, 17 Feb 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/reflections-on-fosdem-2026/</guid><description>&lt;p>This was my first time attending a FOSDEM conference and only my second time to leave Portugal in the last two years due to getting caught in the middle of an unfortunate breakdown at the Portuguese Immigration agency, which left me without travel documents for a long time.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/2dkA0zQ.jpg" alt="">&lt;/p>
&lt;p>It was great to be able to attend a community event again. I attended the event with my colleague Dimas Tri Ciputra who gave a very polished presentation on BIMS, the &lt;a
href="https://kartoza.com/bims"
target="_blank"
rel="noopener"
>Biodiversity Information Management System&lt;/a>.&lt;/p></description></item><item><title>Building Energy Planning Capacity in Nigeria: Reflections on EMP-N 2025</title><link>https://kartoza.github.io/kartoza-website/blog/building-energy-planning-capacity-in-nigeria-reflections-on-emp-n-2025/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/building-energy-planning-capacity-in-nigeria-reflections-on-emp-n-2025/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/Attendees.JPG" alt="">&lt;/p>
&lt;p>Imagine trying to plan a nation’s energy future when crucial data is scattered across ministries, outdated spreadsheets, and hard drives. This was the challenge at Nigeria’s first &lt;strong>Energy Modelling Platform&lt;/strong> event, and we tackled it head-on in Abuja recently. In October 2025, Nigeria hosted its inaugural &lt;strong>Energy Modelling Platform – Nigeria (EMP-N)&lt;/strong> training – a two-week intensive workshop at the Energy Commission headquarters in Abuja – bringing together local and international experts to support a just, sustainable energy transition. This country-specific EMP (the first of its kind) was convened by the &lt;strong>Climate Compatible Growth (CCG)&lt;/strong> programme in &lt;a
href="https://climatecompatiblegrowth.com/energy-modelling-platform-for-nigeria-emp-n/#:~:text=The%20Energy%20Modelling%20Platform%20%E2%80%93,All%2C%20and%20the%20World%20Bank"
target="_blank"
rel="noopener"
>partnership&lt;/a> with the &lt;strong>Energy Commission of Nigeria&lt;/strong> , &lt;strong>World Resources Institute (WRI)&lt;/strong> , &lt;strong>Sustainable Energy for All (SEforALL)&lt;/strong> , and the &lt;strong>World Bank&lt;/strong>. The goal was clear: equip government analysts, academics, NGOs and private-sector practitioners with open-source tools and skills to map Nigeria’s energy future in line with development goals.&lt;/p></description></item><item><title>How AI Tools Are Transforming Developer Workflows: Lessons from IDSW</title><link>https://kartoza.github.io/kartoza-website/blog/how-ai-tools-are-transforming-developer-workflows-lessons-from-idsw/</link><pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-ai-tools-are-transforming-developer-workflows-lessons-from-idsw/</guid><description>&lt;p>On November 23-24, I had the opportunity to attend &lt;a
href="https://idsw.dev/"
target="_blank"
rel="noopener"
>IDSW&lt;/a> in Jakarta, Indonesia. The IDSW is a community-led annual software developer conference and the main theme of this year was exploring AI(Artificial Intelligence) and its impact through hands-on sessions and discussions.&lt;/p>
&lt;hr>
&lt;h2 id="glossary">Glossary&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>AI (Artificial Intelligence):&lt;/strong> Technology that enables machines to perform human-like tasks such as language understanding and pattern recognition.&lt;/li>
&lt;li>&lt;strong>AST (Abstract Syntax Tree):&lt;/strong> A structured representation of source code used to understand a program’s logic.&lt;/li>
&lt;li>&lt;strong>Back-end / Front-end:&lt;/strong> Server-side logic and data processing vs. user interface and experience.&lt;/li>
&lt;li>&lt;strong>CRUD:&lt;/strong> Create, Read, Update, Delete — core data operations in applications.&lt;/li>
&lt;li>&lt;strong>LLM (Large Language Model):&lt;/strong> AI trained on large text datasets to generate code, understand prompts, and reason.&lt;/li>
&lt;li>&lt;strong>PRD (Product Requirement Document):&lt;/strong> A document defining a product’s goals, features, and requirements.&lt;/li>
&lt;li>&lt;strong>Tool calling:&lt;/strong> An AI model’s ability to use external tools or functions to complete tasks.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;p>In this article, I want to share some of the insights I gained from attending various talks from industry experts. Let’s dive in:&lt;/p></description></item><item><title>Get Ready: Geospatial Hosting Is On the Way</title><link>https://kartoza.github.io/kartoza-website/blog/get-ready-geospatial-hosting-is-on-the-way/</link><pubDate>Tue, 09 Sep 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/get-ready-geospatial-hosting-is-on-the-way/</guid><description>&lt;p>Over the past year, we have been working on GeoSpatialHosting (GSH), a platform designed to make it easier to deploy and manage open-source spatial tools. Our aim is to provide a reliable and cost-effective hosting solution for GIS projects without the need for complex setup or infrastructure management.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/Wk5apyN.png" alt="">&lt;/p>
&lt;h2 id="current-status">Current Status&lt;/h2>
&lt;p>We are pleased to share that the platform has now reached a production-ready stage. We are finalising the last details to ensure stability, usability and that support resources are in place before the public launch.&lt;/p></description></item><item><title>Agile Project Management for a Geospatial Consultancy</title><link>https://kartoza.github.io/kartoza-website/blog/agile-project-management-for-a-geospatial-consultancy/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/agile-project-management-for-a-geospatial-consultancy/</guid><description>&lt;h1 id="why-agile-matters-in-a-geospatial-consultancy">Why Agile Matters in a Geospatial Consultancy&lt;/h1>
&lt;p>Managing geospatial projects comes with a unique set of challenges that can make project delivery complex and unpredictable. Unlike traditional IT or software projects, GIS projects can involve intensive data collection, rapid technological advancements, and a high dependence on accurate spatial information. Budget constraints and time limitations further complicate the process, as clients often underestimate the resources required to develop high-quality GIS solutions.&lt;/p></description></item><item><title>Mapping My World: A Journey with OpenStreetMap</title><link>https://kartoza.github.io/kartoza-website/blog/mapping-my-world-a-journey-with-openstreetmap/</link><pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mapping-my-world-a-journey-with-openstreetmap/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>&lt;strong>Open Street Map (OSM)&lt;/strong> is a free, editable map of the world created and maintained by a mapper community. It’s used by people around the world for navigation, planning, and much more. Anyone can contribute by adding or editing map data, making it a valuable resource for local, national, and global projects. As interns, we were tasked to map buildings in our area and learn how to use OSM’s tools. This experience taught us about mapping, solving problems, and improving maps for everyone.&lt;/p></description></item><item><title>Streamlining Geospatial Data for GeoPackage Upload</title><link>https://kartoza.github.io/kartoza-website/blog/streamlining-geospatial-data-for-geopackage-upload/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/streamlining-geospatial-data-for-geopackage-upload/</guid><description>&lt;p>For the Kartoza 2025 internship, my fellow interns and I were tasked with digitally recreating a Bob Ross painting using QGIS. The artwork was created by digitizing features and organizing them into vector layers, each assigned a &amp;lsquo;Type&amp;rsquo; attribute and strategically stacked to replicate the painting. Various symbology effects, such as the glow draw effect, random marker fill, and gradient fill, were applied to enhance the final composition.&lt;/p>
&lt;p>Once the project was completed, the GeoPackage needed to be uploaded to the QGIS Hub. However, a key requirement for uploading was that the file size had to be under 5MB—or 1MB if compressed into a ZIP file. This posed a significant challenge, as the GeoPackage was 9.7MB. The main reason for the large file size was the extensive use of the stream digitizing tool, which resulted in a high number of vertices. Additionally, the layers contained inessential attribute fields that were useful earlier in the project but were no longer needed in the final version. There was also the possibility of temporary or deleted data still being stored within the project.&lt;/p></description></item><item><title>Introducing the new QGIS Plugins Website and QGIS Hub</title><link>https://kartoza.github.io/kartoza-website/blog/introducing-the-new-qgis-plugins-website-and-qgis-hub/</link><pubDate>Fri, 07 Mar 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/introducing-the-new-qgis-plugins-website-and-qgis-hub/</guid><description>&lt;p>We are excited to announce the release of the newly updated &lt;a
href="https://plugins.qgis.org"
target="_blank"
rel="noopener"
>QGIS Plugins Website&lt;/a> and the launch of the &lt;a
href="https://hub.qgis.org"
target="_blank"
rel="noopener"
>QGIS Hub Website&lt;/a>! These updates bring a fresh new look that aligns with the QGIS branding overhaul, along with significant improvements in user experience.&lt;/p>
&lt;h3 id="revamped-qgis-plugins-website">Revamped QGIS Plugins Website&lt;/h3>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/T0r39En.gif" alt="">&lt;/p>
&lt;p>&lt;em>QGIS Plugins Homepage&lt;/em>&lt;/p>
&lt;p>The &lt;a
href="https://plugins.qgis.org/"
target="_blank"
rel="noopener"
>QGIS Plugins website&lt;/a> has undergone a major redesign to enhance usability and provide a seamless experience for users. With a modernised interface and improved navigation, users can now find and manage plugins more efficiently. Some of the key updates include:&lt;/p></description></item><item><title>Rendering Points as a Heatmap in GeoServer</title><link>https://kartoza.github.io/kartoza-website/blog/rendering-points-as-a-heatmap-in-geoserver/</link><pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/rendering-points-as-a-heatmap-in-geoserver/</guid><description>&lt;h1 id="rendering-points-as-a-heatmap-in-geoserver">Rendering Points as a Heatmap in GeoServer&lt;/h1>
&lt;p>I was assigned the task of rendering a points layer as a heatmap on GeoServer. The client provided a QGIS style that they wanted replicated using an SLD (Styled Layer Descriptor). Initially, they attempted to export the QGIS style directly as an SLD and upload it to GeoServer. However, this approach failed because QGIS generated the heatmap SLD as:&lt;/p>
&lt;pre>&lt;code>&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;StyledLayerDescriptor xmlns=&amp;quot;http://www.opengis.net/sld&amp;quot; xsi:schemaLocation=&amp;quot;http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd&amp;quot; xmlns:xlink=&amp;quot;http://www.w3.org/1999/xlink&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; version=&amp;quot;1.1.0&amp;quot; xmlns:ogc=&amp;quot;http://www.opengis.net/ogc&amp;quot; xmlns:se=&amp;quot;http://www.opengis.net/se&amp;quot;&amp;gt;
 &amp;lt;NamedLayer&amp;gt;
   &amp;lt;se:Name&amp;gt;Current_Layer&amp;lt;/se:Name&amp;gt;
   &amp;lt;UserStyle&amp;gt;
     &amp;lt;se:Name&amp;gt;Current_style&amp;lt;/se:Name&amp;gt;
     &amp;lt;se:FeatureTypeStyle&amp;gt;
       &amp;lt;!--FeatureRenderer heatmapRenderer not implemented yet--&amp;gt;
     &amp;lt;/se:FeatureTypeStyle&amp;gt;
   &amp;lt;/UserStyle&amp;gt;
 &amp;lt;/NamedLayer&amp;gt;
&amp;lt;/StyledLayerDescriptor&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>The main issue was the line:&lt;/p></description></item><item><title>The Evolution of GIS: From Humble Beginnings to Modern Tech</title><link>https://kartoza.github.io/kartoza-website/blog/the-evolution-of-gis-from-humble-beginnings-to-modern-tech/</link><pubDate>Fri, 29 Nov 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/the-evolution-of-gis-from-humble-beginnings-to-modern-tech/</guid><description>&lt;p>Geographic Information Systems (GIS) have come a long way since the mid-20th century, evolving from simple mapping tools into powerful technologies shaping industries and societies worldwide. At Kartoza, we recently found ourselves diving into this evolution during a lively office discussion sparked by Geography Awareness Week and GIS Day. These annual events celebrate the value of geography and GIS in understanding our world.&lt;/p>
&lt;p>In this article, we explore the milestones that have defined GIS over the years and reflect on how these tools continue to empower decision-makers, educators, and communities.&lt;/p></description></item><item><title>Kartoza - Tutorial: Updating Raster NoData Value with Rasterio</title><link>https://kartoza.github.io/kartoza-website/blog/tutorial-update-raster-nodata-value-with-raterio/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/tutorial-update-raster-nodata-value-with-raterio/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza - Tutorial: Updating Raster NoData Value with Rasterio&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Python&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="0008ccd00b0b5ba7" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="0008ccd00b0b5ba7" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Updating raster NoData value in Python is easy and straightforward.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="understanding-raster-nodata-values">Understanding Raster NoData Values&lt;/h2>
&lt;p>A raster NoData value is a special value assigned to cells in a raster dataset to indicate the absence of valid data for that location. It marks areas where there is no information or where data is missing, ensuring that these cells are excluded from calculations or analysis.&lt;/p></description></item><item><title>Tutorial: Updating Raster NoData Value with Rasterio</title><link>https://kartoza.github.io/kartoza-website/blog/tutorial-updating-raster-nodata-value-with-rasterio/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/tutorial-updating-raster-nodata-value-with-rasterio/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/6tZWObm.png" alt="">&lt;/p>
&lt;p>A raster NoData value is a special value assigned to cells in a raster dataset to indicate the absence of valid data for that location. It marks areas where there is no information or where data is missing, ensuring that these cells are excluded from calculations or analysis.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/Vg87fa9.png" alt="">&lt;/p>
&lt;p>&lt;em>This is the nodata value before update&lt;/em>&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/KusBDjV.png" alt="">&lt;/p>
&lt;p>&lt;em>This is the nodata value after update&lt;/em>&lt;/p>
&lt;p>In the &lt;a
href="https://github.com/kartoza/cplus-api/"
target="_blank"
rel="noopener"
>CPLUS API&lt;/a>, which is part of the &lt;a
href="https://github.com/ConservationInternational/cplus-plugin"
target="_blank"
rel="noopener"
>CPLUS Plugin&lt;/a> that we are building for Conservation International, we integrate Natural Climate Solution (NCS) Pathways from &lt;a
href="https://app.naturebase.org/data"
target="_blank"
rel="noopener"
>Naturebase&lt;/a>. In our workflow, we update raster NoData value to -9999, to enable performing raster calculations. We will be using &lt;a
href="https://rasterio.readthedocs.io/en/stable/"
target="_blank"
rel="noopener"
>Rasterio&lt;/a> in this tutorial, so you need to make sure you have it installed.&lt;/p></description></item><item><title>Kartoza - First QGIS Conference Experience: A Journey of Collaboration and Innovation</title><link>https://kartoza.github.io/kartoza-website/blog/first-qgis-conference-experience-a-journey-of-collaboration-and-innovation/</link><pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/first-qgis-conference-experience-a-journey-of-collaboration-and-innovation/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza - First QGIS Conference Experience: A Journey of Collaboration and Innovation&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="98edd814a4f7d574" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="98edd814a4f7d574" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
A QGIS full-stack web developer attended their inaugural QGIS User Conference in Bratislava, Slovakia, followed by the Contributors Meeting.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="my-first-qgis-conference-experience-a-journey-of-collaboration-and-innovation">My first QGIS Conference Experience: A Journey of Collaboration and Innovation&lt;/h2>
&lt;p>From September 9th to 13th, the author attended the QGIS User Conference, followed by the Contributors Meeting in Bratislava, Slovakia. As a QGIS full-stack web developer funded by QGIS and accompanied by Selma Vidimlić Husić (QGIS documentation writer), this event provided opportunities to connect with contributors and the broader QGIS community.&lt;/p></description></item><item><title>My experience at the EMP Joint Global Training School 2024</title><link>https://kartoza.github.io/kartoza-website/blog/my-experience-at-the-emp-joint-global-training-school-2024/</link><pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/my-experience-at-the-emp-joint-global-training-school-2024/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/77mt42H.png" alt="">&lt;/p>
&lt;p>Thanks to a partnership between Kartoza and &lt;a
href="https://www.seforall.org/"
target="_blank"
rel="noopener"
>Sustainable Energy for All (SEforALL)&lt;/a>, I co-facilitated a geospatial data management training session with my colleague, Seabilwe Tilodi. This training was part of the Energy Modelling Platform&amp;rsquo;s Joint Global Training School 2024, held at ICTP in Trieste, Italy (the photo above was taken from the ICTP). The programme addressed challenges in energy access planning for emerging economies, focusing on the critical role of accurate and accessible data.&lt;/p></description></item><item><title>Disaster Management with QGIS and the InaSafe Plugin</title><link>https://kartoza.github.io/kartoza-website/blog/disaster-management-with-qgis-and-the-inasafe-plugin/</link><pubDate>Tue, 22 Oct 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/disaster-management-with-qgis-and-the-inasafe-plugin/</guid><description>&lt;h2 id="enhancing-disaster-management-with-qgis-and-the-inasafe-plugin">Enhancing Disaster Management with QGIS and the InaSafe Plugin&lt;/h2>
&lt;p>In the ever-evolving landscape of disaster management, having the right tools to anticipate and respond to disasters can be the difference between preparedness and chaos. One such tool that has been making waves is &lt;strong>InaSafe&lt;/strong> , an open-source plugin for QGIS designed to produce realistic natural hazard impact scenarios for better planning and response.&lt;/p>
&lt;p>&lt;strong>&lt;img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfw16OrAYg4VjSan3KPsn9vBO-Ej79EY4CiHwDt4nw39g5UqrSQNnrJe19EmNnHNwpe-kYEeV_tsn82d7ILptj4vJ2-Jo2HWB1OqJbqvH1ykYCaLmxO-981ORBQULOEsmEuY9nXeOVkj_dxLnITyWZ5gPY?key=CPE94m5H-_7sNPtMTw_GQg" alt="">&lt;/strong>&lt;/p>
&lt;p>At the&lt;strong>GISSA Gauteng session&lt;/strong> earlier this year, I demonstrated how InaSafe can empower disaster management professionals. My talk focused on how the tool can be used in practical, real-world scenarios, specifically through the analysis of flood events. &lt;a
href="https://www.canva.com/design/DAGH9G9ObXE/xljRc4kWJJnQWSEI8ZkpiQ/view?utm_content=DAGH9G9ObXE&amp;amp;utm_campaign=designshare&amp;amp;utm_medium=link&amp;amp;utm_source=editor"
target="_blank"
rel="noopener"
>Here’s a breakdown&lt;/a> of my key points and insights from the session.&lt;/p></description></item><item><title>Geospatial Hosting - Taking the pain out of hosting your GIS applications</title><link>https://kartoza.github.io/kartoza-website/blog/geospatial-hosting-taking-the-pain-out-of-hosting-your-gis-applications/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/geospatial-hosting-taking-the-pain-out-of-hosting-your-gis-applications/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/Wk5apyN.png" alt="">&lt;/p>
&lt;p>&lt;strong>Kartoza recently celebrated its 10th anniversary.&lt;/strong> Over the past decade, we&amp;rsquo;ve built some fantastic solutions for our customers, focusing on training, consulting, software development, and sharing our expertise in GIS. However, over the last two years, we decided to expand by adding a new dimension to our business: developing our own hosting platform.&lt;/p>
&lt;p>In modern cloud development, most solutions rely on big providers like Azure, Amazon Web Services, or Google Cloud Services. Typically, when designing a solution for a client or product, you&amp;rsquo;ll either manage individual servers, installing tools like Docker and Docker Compose for hand-managed services (the &amp;lsquo;old way&amp;rsquo;), or you’ll work with services like Kubernetes and Helm Charts to build your architecture within a cloud provider’s ecosystem (the &amp;rsquo;new&amp;rsquo; way).&lt;/p></description></item><item><title>Kartoza - Revamping Dominica's Geospatial Future: Inside the DomiNode Phase 2 Project</title><link>https://kartoza.github.io/kartoza-website/blog/revamping-dominicas-geospatial-future-inside-the-dominode-phase-2-project/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/revamping-dominicas-geospatial-future-inside-the-dominode-phase-2-project/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza - Revamping Dominica&amp;#39;s Geospatial Future: Inside the DomiNode Phase 2 Project&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">GeoNode&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="ec8d1cb37d24a481" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="ec8d1cb37d24a481" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
In a world where data can make the difference between disaster and resilience, the small island nation of Dominica is making big strides.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="a-new-era-for-dominode">A New Era for DomiNode&lt;/h2>
&lt;p>The DomiNode platform, originally developed with World Bank support through the Pilot Programme for Climate Resilience, underwent significant modernization in Phase 2. The objective centered on enhancing performance, security, and data handling while ensuring users regularly adopted the platform into their workflows.&lt;/p></description></item><item><title>Revamping Dominica's Geospatial Future: Inside the DomiNode Phase 2 Project</title><link>https://kartoza.github.io/kartoza-website/blog/revamping-dominica-s-geospatial-future-inside-the-dominode-phase-2-project/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/revamping-dominica-s-geospatial-future-inside-the-dominode-phase-2-project/</guid><description>&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/i3ktrwf.png" alt="">&lt;/p>
&lt;p>&lt;em>Dominica, officially named the Commonwealth of Dominica, is a small island nation located in the Caribbean.&lt;/em>&lt;/p>
&lt;p>In a world where data can make the difference between disaster and resilience, the small island nation of Dominica is making big strides. Enter the DomiNode Phase 2 project—a game-changing initiative transforming how Dominica handles and shares geospatial data. Spearheaded by the innovative teams at Kartoza and &lt;a
href="https://piensa.co"
target="_blank"
rel="noopener"
>Piensa&lt;/a>, this project isn&amp;rsquo;t just a technical upgrade, it&amp;rsquo;s a vital enhancement for a nation dealing with the impacts of climate change and natural disasters. The objective of DomiNode is to be a central SDI (spatial data infrastructure) serving all Dominican government departments. An effective SDI facilitates spatial data and metadata storage, management and access.&lt;/p></description></item><item><title>Discovering GIS: Job Shadowing at Kartoza</title><link>https://kartoza.github.io/kartoza-website/blog/discovering-gis-job-shadowing-at-kartoza/</link><pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/discovering-gis-job-shadowing-at-kartoza/</guid><description>&lt;h2 id="kartozas-commitment-to-education-and-the-future-of-gis">Kartoza&amp;rsquo;s Commitment to Education and the Future of GIS&lt;/h2>
&lt;h3 id="kartozas-philosophy">Kartoza&amp;rsquo;s Philosophy&lt;/h3>
&lt;p>We are a small company with a big dream: to see Free and open-source GIS (Geographic Information System) software make its way into every part of society, from government and private enterprises to academia and private users. Our mission is to make powerful GIS tools and knowledge accessible to everyone, enabling innovation and informed decision-making across various sectors.&lt;/p>
&lt;h3 id="supporting-future-gis-professionals">Supporting Future GIS Professionals&lt;/h3>
&lt;p>As part of our commitment to this mission, we frequently receive requests from school leavers and students seeking vacation work opportunities. While internships are generally the preferred route for those who qualify, we recognise the importance of early exposure to GIS and the IT industry. This is why, on occasion, we host Grade 11 or 12 students for job shadowing opportunities.&lt;/p></description></item><item><title>Kartoza's 10th Anniversary: Looking Back, Moving Forward</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-celebrating-ten-years/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-celebrating-ten-years/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza&amp;#39;s 10th Anniversary: Looking Back, Moving Forward&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">News&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="ce189acefd17d484" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="ce189acefd17d484" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Kartoza celebrated its tenth anniversary in July 2024, reflecting on a decade of organic growth and contributions to the open-source geospatial community.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="opening-section">Opening Section&lt;/h2>
&lt;p>Kartoza celebrated its tenth anniversary in July 2024. Founded by Gavin and Tim with support from their wives Bridget and Marcelle, the company launched on July 1, 2014, with a team of four people. Their founding vision emphasizes making &amp;ldquo;spatial decision making tools universal, accessible and affordable.&amp;rdquo;&lt;/p></description></item><item><title>Kartoza's 10th Anniversary: Looking Back, Moving Forward</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-s-10th-anniversary-looking-back-moving-forward/</link><pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-s-10th-anniversary-looking-back-moving-forward/</guid><description>&lt;h1 id="kartoza-celebrating-ten-years">Kartoza: Celebrating ten years!&lt;/h1>
&lt;p>Ten years ago, Gavin and Tim (with fantastic support from our wives Bridget and Marcelle) opened the virtual doors of our new company, Kartoza (Pty) Ltd. Prior to starting Kartoza together, we had both been operating small businesses catering to similar clientele and executing similar projects. Our aim was to join forces to achieve a shared vision:&lt;/p>
&lt;p>“To enable a world where spatial decision making tools are universal, accessible and affordable for everyone for the benefit of the planet and its people.”&lt;/p></description></item><item><title>Zonal Operations using PostGIS</title><link>https://kartoza.github.io/kartoza-website/blog/zonal-operations-using-postgis/</link><pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/zonal-operations-using-postgis/</guid><description>&lt;p>Recently I have been reviewing training materials from the &lt;a
href="https://changelog.qgis.org/en/qgis/"
target="_blank"
rel="noopener"
>QGIS Changelog site&lt;/a>. One particular lesson I liked was how to do &lt;a
href="https://changelog.qgis.org/en/qgis/lesson/raster-16/detail/57/?q=7.7"
target="_blank"
rel="noopener"
>Zonal Operations&lt;/a>. I thought about how to replicate the output produced in the lesson using Cloud storage and the PostGIS database.&lt;/p>
&lt;p>The basis of this tutorial assumes a user has the following:&lt;/p>
&lt;ol>
&lt;li>Cloud Storage. This could be Minio or Amazon S3 buckets or any other storage providers.&lt;/li>
&lt;li>A PostgreSQL database instance.&lt;/li>
&lt;li>ogr_fdw extension installed in the PostgreSQL database.&lt;/li>
&lt;/ol>
&lt;p>For a local setup, I am using a docker-compose setup.&lt;/p></description></item><item><title>Kartoza - PyConZA 2023 reportback</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-providing-talks-at-pyconza-2023/</link><pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-providing-talks-at-pyconza-2023/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza - PyConZA 2023 reportback&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Python&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="d83ed3ca715e370b" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="d83ed3ca715e370b" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Kartoza staff members Admire and Eli recently got the chance to attend the annual PyConZA conference in Umhlanga, Durban.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="pyconza-2023-conference-report">PyConZA 2023 Conference Report&lt;/h2>
&lt;p>Kartoza staff members Admire and Eli recently got the chance to attend the annual PyConZA conference in Umhlanga, Durban. This two-day event organised by the Python community, featured outstanding talks and insightful presentations. The hybrid format enabled attendees to join either in person or online, providing the flexibility to engage with both guests and presenters during the conference in person and online.&lt;/p></description></item><item><title>PyConZA 2023 reportback</title><link>https://kartoza.github.io/kartoza-website/blog/pyconza-2023-reportback/</link><pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/pyconza-2023-reportback/</guid><description>&lt;p>Kartoza staff members Admire and Eli recently got the chance to attend the annual PyConZA conference in Umhlanga, Durban. This two-day event organised by the Python community, featured outstanding talks and insightful presentations. The hybrid format enabled attendees to join either in person or online, providing the flexibility to engage with both guests and presenters during the conference in person and online.&lt;/p>
&lt;p>Admire Nyakudya, one of Kartoza&amp;rsquo;s resident Python experts, gave a well-attended talk on &lt;a
href="https://za.pycon.org/talks/26-leveraging-python-in-geospatial-applications/"
target="_blank"
rel="noopener"
>Leveraging Python in Geospatial Applications&lt;/a>. Admire discussed and provided some practical demonstrations on how he uses Python during development and in the geospatial industry to automate repetitive tasks and create custom solutions to resolve challenges related to working in remote environments. Read more about Admire&amp;rsquo;s ground-breaking work here: &lt;a
href="https://kartoza.com/blog/python/kartoza-at-pyconza-durban-2023"
target="_blank"
rel="noopener"
>Kartoza at PyConZA Durban 2023&lt;/a>.&lt;/p></description></item><item><title>Reading and Writing Shapefiles in Python with Fiona</title><link>https://kartoza.github.io/kartoza-website/blog/reading-and-writing-shapefiles-in-python-with-fiona/</link><pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/reading-and-writing-shapefiles-in-python-with-fiona/</guid><description>&lt;h2 id="what-is-fiona">What is Fiona?&lt;/h2>
&lt;p>&lt;a
href="https://github.com/Toblerity/Fiona"
target="_blank"
rel="noopener"
>Fiona&lt;/a> is a FOSS Python library that can be used to read and write GIS formats like shape file and geopackage. We may stumble upon some use cases where we need to import or export GIS data from shapefiles and this is where Fiona comes to the rescue. Its usage is straightforward, making it simple to use.&lt;/p>
&lt;h2 id="installing-fiona">Installing Fiona&lt;/h2>
&lt;p>We can install Fiona easily using&lt;/p>
&lt;pre>&lt;code>pip install fiona
&lt;/code>&lt;/pre>
&lt;h2 id="reading-shapefiles">Reading Shapefiles&lt;/h2>
&lt;p>Fiona has built in function to open shapefiles. First, import the necessary Fiona function.&lt;/p></description></item><item><title>Using WMS-T layers with QGIS Temporal Controller</title><link>https://kartoza.github.io/kartoza-website/blog/using-wms-t-layers-with-qgis-temporal-controller/</link><pubDate>Wed, 29 May 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/using-wms-t-layers-with-qgis-temporal-controller/</guid><description>&lt;p>The FOSS4G 2022 conference was held in Firenze, Italy, from 22th to 27th August. It was the first in person conference since the COVID outbreak.&lt;/p>
&lt;p>Thanks to the organisers for making it possible and kudos to all the people that were involved in the preparation and the conducting of the conference.&lt;/p>
&lt;p>I got a chance to attend and to present in the conference. It was a wonderful trip from the moment I started my flight from Dar es Salaam to Rome up to when I met other FOSS4G attendees in Florence. The conference allowed us to get acquainted with people that came from different parts of the world and to spend time in person with people that for some of us we only met and worked with virtually. This resulted into a joyful experience that left a huge memorable mark.&lt;/p></description></item><item><title>Kartoza Internship: Programming Sessions</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-internship-programming-sessions/</link><pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-internship-programming-sessions/</guid><description>&lt;p>The Kartoza Internship program is designed to provide aspiring candidates with a learning experience that prepares them for the workforce. Through this program, interns gain exposure to both GIS and programming areas, which helps them build their skills, knowledge, experience, and portfolio. This enables them to develop a strong foundation for their professional growth. I&amp;rsquo;ll be sharing my experience of mentoring programming interns in this blog. Till now, I have mentored three batches of interns in programming. I will be discussing some of the things that I did during the internships which might be helpful for you to learn from.&lt;/p></description></item><item><title>Managing Legacy Code - PyConID 2023</title><link>https://kartoza.github.io/kartoza-website/blog/managing-legacy-code-pyconid-2023/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/managing-legacy-code-pyconid-2023/</guid><description>&lt;p>On November 18-19th 2023, Python ID (Indonesia) held PyCon ID 2023 in Bina Nusantara (Binus) University Bandung. I attended with my colleague from the Python ID Yogyakarta region.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/RqXyZ7Z.jpg" alt="">&lt;/p>
&lt;p>This is the 6th PyCon in Indonesia and the first hybrid PyCon post pandemic. The general theme was “Python Is Fun”. This year, PyCon ID presented three keynote talks, 39 regular talks, three workshops and eight lightning talks, with 654 total participants. At the closing ceremony, Python ID announced that they will host PyCon APAC (Asia-Pacific) 2024 in Yogyakarta, October 25-27th 2024.&lt;/p></description></item><item><title>Managing Legacy Code - PyConID 2023</title><link>https://kartoza.github.io/kartoza-website/blog/pyconid-2023-in-bandung-indonesia/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/pyconid-2023-in-bandung-indonesia/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Managing Legacy Code - PyConID 2023&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Python&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="af1c63804c00540f" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="af1c63804c00540f" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
PyCon ID 2023 in Bandung explored approaches to managing legacy code, featuring keynote insights from GoPay&amp;rsquo;s tech advisor.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="opening-context">Opening Context&lt;/h2>
&lt;p>The article discusses PyCon ID 2023, held November 18-19 at Bina Nusantara University in Bandung, marking the sixth Python conference in Indonesia and the first hybrid event post-pandemic. The conference featured &amp;ldquo;Python Is Fun&amp;rdquo; as its central theme, with 654 participants, 39 regular talks, three workshops, and eight lightning talks.&lt;/p></description></item><item><title>Tutorial: Auto-updating GeoServer layer configurations</title><link>https://kartoza.github.io/kartoza-website/blog/tutorial-auto-updating-geoserver-layer-configurations/</link><pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/tutorial-auto-updating-geoserver-layer-configurations/</guid><description>&lt;p>Suppose you have a team digitising features in a desktop GIS like QGIS into a layer stored in PostgreSQL, that is also served through GeoServer. A frontend application accesses the WMS endpoint from GeoServer. Users accessing the frontend applications expect the layers to be live (i.e. to see instant changes as the vector layer is updated in QGIS).&lt;/p>
&lt;p>GeoServer reads the bounding box information from the data store during publishing and stores this information in the layer configuration dialog. As new features are added/deleted from the vector layer in PostgreSQL, GeoServer has no automatic way to reload its configuration to update the bounding box of the layer because it doesn&amp;rsquo;t periodically poll the database for changes.&lt;/p></description></item><item><title>Tutorial: Auto-updating GeoServer Layer Configurations</title><link>https://kartoza.github.io/kartoza-website/blog/auto-updating-geoserver-layer-configurations/</link><pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/auto-updating-geoserver-layer-configurations/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Tutorial: Auto-updating GeoServer Layer Configurations&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">GeoServer&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="cc587aac8da4883a" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="cc587aac8da4883a" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
How GeoServer&amp;rsquo;s REST API facilitates remote interactions for enhancing automation of layer configuration updates.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>The piece explains how GeoServer&amp;rsquo;s REST API facilitates &amp;ldquo;remote interactions with GeoServer, thereby enhancing automation.&amp;rdquo;&lt;/p></description></item><item><title>Kartoza at PyConZA Durban 2023</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-at-pyconza-durban-2023/</link><pubDate>Thu, 12 Oct 2023 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-at-pyconza-durban-2023/</guid><description>&lt;p>My colleague Eli and I recently attended &lt;a
href="https://za.pycon.org/#"
target="_blank"
rel="noopener"
>PyConZA&lt;/a> to share how we use &lt;a
href="https://www.python.org/"
target="_blank"
rel="noopener"
>Python&lt;/a> in our work. It was a hybrid event with an in-person audience of more than 50 people at the prestigious Premier Splendid Inn Umhlanga, which offered nice aerial views from the 10th floor.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/dpQcpMx.jpg" alt="">&lt;/p>
&lt;p>The main concepts covered by the talks can be broadly categorised as:&lt;/p>
&lt;ol>
&lt;li>Use of Python in managing databases (PostgreSQL)&lt;/li>
&lt;li>Processing data pipelines&lt;/li>
&lt;li>Do&amp;rsquo;s and Don&amp;rsquo;ts for building applications using Python.&lt;/li>
&lt;/ol>
&lt;p>I also had the privilege of presenting a talk, whose title was &lt;a
href="https://za.pycon.org/talks/26-leveraging-python-in-geospatial-applications/"
target="_blank"
rel="noopener"
>Leveraging Python in GeoSpatial Applications&lt;/a>. I went over how we at Kartoza use Python in the geospatial industry and was based on some the work we have done on previous projects such as the &lt;a
href="https://sagtamapdownloader.kartoza.com/"
target="_blank"
rel="noopener"
>SAGTA MapDownloader&lt;/a> and SDIs (Spatial Data Infrastructure) like one we did recently for managing electrical infrastructure in ECOWAS.&lt;/p></description></item><item><title>GIS in the classroom - Exploring the SAGTA Map Downloader</title><link>https://kartoza.github.io/kartoza-website/blog/gis-in-the-classroom-exploring-the-sagta-map-downloader/</link><pubDate>Tue, 13 Dec 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/gis-in-the-classroom-exploring-the-sagta-map-downloader/</guid><description>&lt;h1 id="overview">Overview&lt;/h1>
&lt;p>The &lt;a
href="https://2022.foss4g.org"
target="_blank"
rel="noopener"
>FOSS4G&lt;/a> conference was in full swing in 2022 after a hiatus due to Covid 19. The conference allows users from accross the globe to meet and share as per the philosophy of FOSS (Free and Open Source Software). I was quite privileged to present the work I have been doing with Geography Teachers in southern Africa.&lt;/p>
&lt;p>&lt;a
href="https://sagta.org.za/"
target="_blank"
rel="noopener"
>SAGTA&lt;/a> (the Southern African Geography Teachers Association) is a network for professional growth of Geography teachers in southern Africa. Geography teachers are at the core of the SAGTA Map Downloader tool that Kartoza has been developing and maintaing since early 2020. The Map Downloader allows teachers or students to do the following:&lt;/p></description></item><item><title>GIS in the Classroom - Exploring the SAGTA Map Downloader</title><link>https://kartoza.github.io/kartoza-website/blog/gis-in-the-classroom-exploring-the-sagta-mapdownloader/</link><pubDate>Tue, 13 Dec 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/gis-in-the-classroom-exploring-the-sagta-mapdownloader/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">GIS in the Classroom - Exploring the SAGTA Map Downloader&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="b20c26559207eb40" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="b20c26559207eb40" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
The FOSS4G conference presentation on the SAGTA Map Downloader, a tool developed for geography educators in southern Africa.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>The FOSS4G conference in 2022 resumed after pandemic-related delays, providing a platform for global open-source software practitioners to convene and exchange ideas. The presenter shared work conducted with geography educators across southern Africa.&lt;/p></description></item><item><title>Kartoza Book Review: QGIS for Hydrological Applications second Edition</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-qgis-for-hydrological-applications-second-edition/</link><pubDate>Fri, 09 Dec 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-qgis-for-hydrological-applications-second-edition/</guid><description>&lt;p>It was fantastic to catch up with the authors at the FOSS4G 2022 conference and &lt;a
href="https://www.youtube.com/watch?v=G1an2zLhhsk"
target="_blank"
rel="noopener"
>talk about the new edition&lt;/a> (and get some selfies). I was excited to receive a copy of QGIS for Hydrological Applications on my return from the conference and having taken the time to read and work through the book I have come to the following conclusion: QGIS for Hydrological Applications Second Edition is not just a book for Hydrologists but for anyone who wants to improve their QGIS skills through practical, real-world examples that happen to be hydrological.&lt;/p></description></item><item><title>How to get GIS going at your school</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-get-gis-going-at-your-school/</link><pubDate>Tue, 22 Nov 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-get-gis-going-at-your-school/</guid><description>&lt;p>This post guides geography teachers seeking to implement GIS software as part of the teaching curriculum. GIS, or Geographic Information Systems, are vital to real-world map making, spatial problem-solving, and spatial data visualisation. We discuss GIS software, documentation and data resources.&lt;/p>
&lt;h2 id="gis-software">GIS Software&lt;/h2>
&lt;p>Don&amp;rsquo;t let GIS software costs put you off teaching GIS at school. There are zero licence costs with free and open-source technology like &lt;a
href="https://qgis.org/en/site/index.html"
target="_blank"
rel="noopener"
>QGIS&lt;/a>, &lt;a
href="https://merginmaps.com"
target="_blank"
rel="noopener"
>Mergin Maps&lt;/a> and &lt;a
href="https://qfield.org"
target="_blank"
rel="noopener"
>QField&lt;/a>. There&amp;rsquo;s also lots of free and open data around. QGIS runs on any desktop or notebook computer, even on older technology. Mergin Maps and QField run on smartphones and tablets.&lt;/p></description></item><item><title>A Beginner's Guide to Asking Good Questions on StackExchange</title><link>https://kartoza.github.io/kartoza-website/blog/a-beginner-s-guide-to-asking-good-questions-on-stackexchange/</link><pubDate>Fri, 07 Oct 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/a-beginner-s-guide-to-asking-good-questions-on-stackexchange/</guid><description>&lt;p>To get a good response or answer on StackExchange sites, one must ask a good question. This not only applies to StackExchange sites but also to any other Q&amp;amp;A forums, lists or sites e.g. StackOverflow.&lt;/p>
&lt;p>What is a good question? &amp;lsquo;Good&amp;rsquo; is such a simple yet vague term. The checklist below provides a few criteria by which to measure your question to determine if it is a &amp;lsquo;good&amp;rsquo; question. The example question I will use to show these criteria comes from the Geographic Information Systems StackExchange site under questions tagged [open-data-cube].&lt;/p></description></item><item><title>A Beginner's Guide to Asking Good Questions on StackExchange</title><link>https://kartoza.github.io/kartoza-website/blog/foss4g-2022-firenze/</link><pubDate>Fri, 07 Oct 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/foss4g-2022-firenze/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">A Beginner&amp;#39;s Guide to Asking Good Questions on StackExchange&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="a6e37c9277631797" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="a6e37c9277631797" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Every software beginner eventually encounters problems that search engines cannot resolve.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="asking-good-questions">Asking Good Questions&lt;/h2>
&lt;p>To get a good response or answer on StackExchange sites, one must ask a good question. This not only applies to StackExchange sites but also to any other Q&amp;amp;A forums, lists or sites e.g. StackOverflow.&lt;/p></description></item><item><title>Kartoza Book Review: Discover QGIS 3.x - Second Edition</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-discover-qgis-3-x-second-edition/</link><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-discover-qgis-3-x-second-edition/</guid><description>&lt;h1 id="kartoza-book-review-discover-qgis-3x---second-edition">Kartoza Book Review: Discover QGIS 3.x - Second Edition&lt;/h1>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/8IJ3njD.png" alt="">&lt;/p>
&lt;p>I was thrilled to win a copy of the book Discover QGIS 3.x - Second Edition by Kurt Menke at the FOSS4G 2022 conference in Florence. After two long flights and many happy hours of reading, I am pleased to say that this book is an essential guide for any new QGIS user, a fantastic syllabus for GIS educators and a gem in the back pocket of every QGIS professional. Although the book starts gently by giving some background information and essentials for beginner users, it quickly ramps up to vital theoretical knowledge and practical, real-world examples and exercises to work through.&lt;/p></description></item><item><title>Kartoza Book Review: Discover QGIS 3.x - Second Edition</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-discover-qgis-3x-second-edition/</link><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-book-review-discover-qgis-3x-second-edition/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Kartoza Book Review: Discover QGIS 3.x - Second Edition&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="26d3c2f26559dddf" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="26d3c2f26559dddf" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
An essential guide for any new QGIS user, a fantastic syllabus for GIS educators, and valuable for professionals.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="opening">Opening&lt;/h2>
&lt;p>Amy Ternent won a copy of Kurt Menke&amp;rsquo;s book at FOSS4G 2022 in Florence. She describes it as &amp;ldquo;an essential guide for any new QGIS user, a fantastic syllabus for GIS educators&amp;rdquo; and valuable for professionals. The work transitions from beginner fundamentals to advanced theory and practical exercises.&lt;/p></description></item><item><title>FOSS4G 2022: STAC Highlights and using PySTAC</title><link>https://kartoza.github.io/kartoza-website/blog/foss4g-2022-stac-highlights-and-using-pystac/</link><pubDate>Fri, 23 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/foss4g-2022-stac-highlights-and-using-pystac/</guid><description>&lt;h2 id="what-is-stac">What is STAC?&lt;/h2>
&lt;p>According to STAC official page &lt;a
href="https://stacspec.org/"
target="_blank"
rel="noopener"
>https://stacspec.org/&lt;/a>, Spatio-Temporal Asset Catalog (STAC) specification is a common language for describing and cataloging spatio-temporal assets so they can be more easily be indexed and discovered. A spatio-temporal asset itself is any file representing information about Earth captured in a certain space and time. Its specification consists of four semi-independent specifications which can be used alone, but work best when combined with the others.&lt;/p></description></item><item><title>FOSS4G 2022: STAC Highlights and using PySTAC</title><link>https://kartoza.github.io/kartoza-website/blog/foss4g-high/</link><pubDate>Fri, 23 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/foss4g-high/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">FOSS4G 2022: STAC Highlights and using PySTAC&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="3978d62aa8d6fae1" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="3978d62aa8d6fae1" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
An exploration of the Spatio-Temporal Asset Catalog (STAC) specification and practical examples using PySTAC library for Python.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="what-is-stac">What is STAC?&lt;/h2>
&lt;p>According to the official specification, &amp;ldquo;Spatio-Temporal Asset Catalog (STAC) specification is a common language for describing and cataloging spatio-temporal assets&amp;rdquo; to facilitate indexing and discovery. The specification comprises four components:&lt;/p></description></item><item><title>Workshop - Making Your Own Maps for Publication Using QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/making-your-own-maps-for-publication-ssag-conference/</link><pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/making-your-own-maps-for-publication-ssag-conference/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Workshop - Making Your Own Maps for Publication Using QGIS&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Conference&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="2cdd6dff4a2cd5da" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="2cdd6dff4a2cd5da" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Kartoza delivered an introductory workshop on QGIS and its application for creating publication-ready cartography at the SSAG conference.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="content">Content&lt;/h2>
&lt;p>The Society of South African Geographers (SSAG) convened its biennial conference at the University of Pretoria during September 12-14, 2022, marking &amp;ldquo;their first in-person conference since COVID-19 lockdowns.&amp;rdquo;&lt;/p></description></item><item><title>Workshop - Making Your Own Maps for Publication Using QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/workshop-making-your-own-maps-for-publication-using-qgis/</link><pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/workshop-making-your-own-maps-for-publication-using-qgis/</guid><description>&lt;p>The &lt;a
href="https://www.ssag.co.za/"
target="_blank"
rel="noopener"
>Society of South African Geographers&lt;/a> (SSAG) held its biennial conference at the University of Pretoria on September 12-14, 2022. It&amp;rsquo;s their first in-person conference since COVID-19 lockdowns.&lt;/p>
&lt;p>The conference featured keynote speakers who discussed their research, roundtable discussions on South Africa&amp;rsquo;s New Energy Action Plan and workshops on GIS. Various topics were presented in the GIS workshops, where participants could learn more about using GIS in their academic research or workplace. Kartoza had the opportunity to present a short workshop at the conference.&lt;/p></description></item><item><title>Installing QGIS on a Chromebook</title><link>https://kartoza.github.io/kartoza-website/blog/installing-qgis-on-a-chromebook/</link><pubDate>Tue, 24 May 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/installing-qgis-on-a-chromebook/</guid><description>&lt;p>in 2021, all the Geography Department notebooks at St Johns College (Johannesburg), that had QGIS installed, were distributed to students during COVID lockdowns, so they were no longer available to the deparment. The school had stock of Chromebooks but these would only be useful to the department if QGIS could be installed, as QGIS is used intensively in most Geography lessons.&lt;/p>
&lt;p>Since Chromebooks are intended as mainly client computers and don&amp;rsquo;t have the resources to install and run all the usual desktop applications, there was doubt at first that this could work. However, the IT department Geography departments managed not only to install QGIS successfully, but it runs fast and without a hitch. Typically, data is shared as GeoPackages via Google Drive (the school has a Google Education account) so users can access data locally.&lt;/p></description></item><item><title>A Step Forward in Kartoza's QGIS and GeoNode Training</title><link>https://kartoza.github.io/kartoza-website/blog/a-step-forward-in-kartoza-s-qgis-and-geonode-training/</link><pubDate>Fri, 20 May 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/a-step-forward-in-kartoza-s-qgis-and-geonode-training/</guid><description>&lt;p>Learning online has become an essential part of education globally. Kartoza has answered the call for up-to-date, engaging and dynamic teaching material by updating our &lt;a
href="https://changelog.qgis.org/en/qgis"
target="_blank"
rel="noopener"
>QGIS&lt;/a> and &lt;a
href="https://changelog.kartoza.com/en/geonode/"
target="_blank"
rel="noopener"
>GeoNode&lt;/a> teaching platforms. Kartoza uses our open source &amp;lsquo;&lt;a
href="https://github.com/kartoza/prj.app"
target="_blank"
rel="noopener"
>changelog&lt;/a>&amp;rsquo; platform, that allows for continual updates and customisation of material to deliver cutting-edge training.&lt;/p>
&lt;p>The Kartoza Changelog is a web platform that aims to be a simple, all-encompassing educational tool. Software projects and their training courses can be managed and showcased and lessons in each course appear in sequential sections containing worksheets. Each worksheet includes instructions and sample data to download and experiment with. The worksheets can also contain links to external resources.&lt;/p></description></item><item><title>A Step Forward in Kartoza's QGIS and GeoNode Training</title><link>https://kartoza.github.io/kartoza-website/blog/a-step-forward-in-kartozas-qgis-and-geonode-training/</link><pubDate>Fri, 20 May 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/a-step-forward-in-kartozas-qgis-and-geonode-training/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">A Step Forward in Kartoza&amp;#39;s QGIS and GeoNode Training&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="f944da52447bf810" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="f944da52447bf810" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Learning online has become an essential part of education globally. Kartoza has answered the call for up-to-date, engaging and dynamic teaching material by updating our QGIS and GeoNode teaching platforms.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="modernizing-training-platforms">Modernizing Training Platforms&lt;/h2>
&lt;p>Learning online has become an essential part of education globally. Kartoza has responded to the need for current, interactive teaching materials by updating their QGIS and GeoNode training platforms. The organisation uses an open source &amp;lsquo;changelog&amp;rsquo; platform enabling continuous content updates and customization for state-of-the-art instruction.&lt;/p></description></item><item><title>Reading and Writing XLSX File with Openpyxl</title><link>https://kartoza.github.io/kartoza-website/blog/reading-and-writing-xlsx-file-with-openpyxl/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/reading-and-writing-xlsx-file-with-openpyxl/</guid><description>&lt;p>Openpyxl is a Python library used for manipulating Excel files. I came across a ticket that needs to export data ti XLSX format, and I used Openpyxl for that as it’s pretty straightforward.&lt;/p>
&lt;h1 id="reading-xlsx-file">Reading XLSX File&lt;/h1>
&lt;p>Reading XLSX file is simple. First, we load the file into a Workbook object and choose the sheets. If the file contains only one sheet, we can use .active to get the sheet. Active will return active sheet, and in the case when there’s only 1 sheet, that sheet will always be active.&lt;/p></description></item><item><title>Creating 3D Models for QGIS with ODM on Windows</title><link>https://kartoza.github.io/kartoza-website/blog/creating-3d-models-for-qgis-with-odm-on-windows/</link><pubDate>Mon, 07 Feb 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/creating-3d-models-for-qgis-with-odm-on-windows/</guid><description>&lt;p>This post is a walkthrough showing you how to create a 3D model using ODM and Blender from the video frames of a video shot on your cellphone and use the 3D model as a symbol in QGIS. &lt;a
href="https://www.blender.org/"
target="_blank"
rel="noopener"
>Blender&lt;/a> is a free and open-source 3D creation suite. &lt;a
href="https://www.opendronemap.org/"
target="_blank"
rel="noopener"
>Open Drone Map&lt;/a> (ODM) is drone mapping software that can be used to generate 3D models from aerial images (or in this case, generate 3D reconstructions from cell phone video). This post is adapted from &lt;a
href="https://gist.github.com/timlinux/95bd137154326aab43cf91291e285527"
target="_blank"
rel="noopener"
>Creating 3D Models for QGIS With ODM&lt;/a> by Tim Sutton, which describes how to achieve the same results on Linux.&lt;/p></description></item><item><title>QGIS STAC API Plugin</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-stac-api-plugin/</link><pubDate>Thu, 03 Feb 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-stac-api-plugin/</guid><description>&lt;p>A new QGIS plugin that allows browsing STAC API catalogs inside QGIS has been released. The plugin, developed by Kartoza and sponsored by Microsoft, is available for download and installation in the QGIS official plugin repository. Before this plugin was developed, there was an existing plugin that aimed at providing the same services, though it wasn&amp;rsquo;t updated to use the latest stable release of the STAC API and was not being actively maintained.&lt;/p></description></item><item><title>Mocking Requests with Responses</title><link>https://kartoza.github.io/kartoza-website/blog/mocking-requests-with-responses/</link><pubDate>Tue, 01 Feb 2022 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mocking-requests-with-responses/</guid><description>&lt;p>Sometimes, making a request to third-party service is a requirement in our code. And when we test it, those requests could affect the test result i.e. when the service is down, hence causing a test error. It&amp;rsquo;s also a bad idea if our request incurs a cost, like when our code requests a subscription to a third party. If you have read my blog &lt;a
href="https://kartoza.com/en/blog/mocking-request-with-requests_mock/"
target="_blank"
rel="noopener"
>&amp;ldquo;Mocking Requests with requests_mock&amp;rdquo;&lt;/a>, then you would know that all those issues can be solved by mocking our requests in tests using &lt;a
href="https://requests-mock.readthedocs.io/en/latest/"
target="_blank"
rel="noopener"
>requests_mock&lt;/a>. This blog will show you an alternative to &lt;em>requests_mock&lt;/em> , the one that is simpler to use yet offers more features: &lt;a
href="https://pypi.org/project/responses/"
target="_blank"
rel="noopener"
>responses&lt;/a>. For ease of understanding, the return value from requests will be called &amp;ldquo;response&amp;rdquo; and the library that we use is &amp;ldquo;&lt;em>responses&lt;/em> &amp;quot; (i.e. an extra &amp;ldquo;s&amp;rdquo; in &amp;ldquo;responses&amp;rdquo;).&lt;/p></description></item><item><title>Collaborating on a QGIS Project Saved in a PostgreSQL Database</title><link>https://kartoza.github.io/kartoza-website/blog/collaborating-on-a-qgis-project-saved-in-a-postgresql-database/</link><pubDate>Fri, 25 Jun 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/collaborating-on-a-qgis-project-saved-in-a-postgresql-database/</guid><description>&lt;p>QGIS provides a couple of options when it comes to working with QGIS projects. All these formats have their strengths and weakness. When doing some work in QGIS we used to pass around the QGIS project files but ever since storing the QGIS projects in a PostgreSQL database became an option we have been investigating using this as our primary method of collaboration.&lt;/p>
&lt;p>When working with QGIS projects in an enterprise environment we encourage following these rules:&lt;/p></description></item><item><title>PostgreSQL SSL Setup in Docker-postgis</title><link>https://kartoza.github.io/kartoza-website/blog/postgresql-ssl-setup-in-docker-postgis/</link><pubDate>Mon, 31 May 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/postgresql-ssl-setup-in-docker-postgis/</guid><description>&lt;p>Databases are the cornerstone of most web applications and also act as a central repository for the storage of data.&lt;/p>
&lt;p>There are many ways to get a running PostgreSQL database on your host machine. Our preferred method of setting up the the database is using Docker and Kartoza provides a PostGIS Docker image that is quite flexible and easy to configure.&lt;/p>
&lt;p>The docker &lt;a
href="https://github.com/kartoza/docker-postgis"
target="_blank"
rel="noopener"
>image&lt;/a> provides SSL support out of the box using the default snake oil certificates. However, the out of the box configuration for SSL the image does not force all clients connecting to the database to use SSL connections. To force all clients connecting to the database to use the SSL we had to manually edit the &lt;a
href="https://www.postgresql.org/docs/13/auth-pg-hba-conf.html"
target="_blank"
rel="noopener"
>pg_hba.conf&lt;/a> file which could be an irritation since you need to either store the hba file in a different volume, or make the changes whenever you redeploy the container. Fortunately, this will be a thing of the past as we have added an environment variable &lt;code>FORCE_SSL=TRUE&lt;/code> as an option in the configuration.&lt;/p></description></item><item><title>The Kartoza Intern's Journey Creating a Field Survey with QGIS, Mergin and Input</title><link>https://kartoza.github.io/kartoza-website/blog/the-kartoza-intern-s-journey-creating-a-field-survey-with-qgis-mergin-and-input/</link><pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/the-kartoza-intern-s-journey-creating-a-field-survey-with-qgis-mergin-and-input/</guid><description>&lt;h1 id="heading">&lt;/h1>
&lt;p>Simple, powerful and efficient field data collection is vital for any project with a geospatial aspect. &lt;a
href="https://inputapp.io/en/"
target="_blank"
rel="noopener"
>Input&lt;/a> is a FOSS application created by &lt;a
href="https://www.lutraconsulting.co.uk/"
target="_blank"
rel="noopener"
>Lutra consulting&lt;/a> that brings the power of QGIS to a portable device for data collection. The Kartoza intern team was challenged to get to grips with Input. The team decided to keep it simple and create a project to collect data from local parks, including paths, trees and infrastructure. This blog follows the journey taken by the team and includes tips and tricks to help novice users.&lt;/p></description></item><item><title>The Kartoza Intern's Journey Creating a Field Survey with QGIS, Mergin and Input</title><link>https://kartoza.github.io/kartoza-website/blog/the-kartoza-interns-journey-creating-a-field-survey-with-qgis-mergin-and-input/</link><pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/the-kartoza-interns-journey-creating-a-field-survey-with-qgis-mergin-and-input/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">The Kartoza Intern&amp;#39;s Journey Creating a Field Survey with QGIS, Mergin and Input&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="b4ae529d5ad9c61f" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="b4ae529d5ad9c61f" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Input represents a free and open-source application that extends QGIS capabilities to portable devices for fieldwork data gathering.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Input represents a free and open-source application developed by Lutra Consulting that extends QGIS capabilities to portable devices for fieldwork data gathering. The Kartoza intern cohort undertook a practical challenge to master Input by designing a parks survey encompassing pathways, vegetation, and built infrastructure.&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 19 and 20</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-19-and-20/</link><pubDate>Tue, 06 Apr 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-19-and-20/</guid><description>&lt;p>Today&amp;rsquo;s blog shows the next two episodes in the Road to Nerdvana series. Episode 19 is a walk through using the Google Earth Engine Time series Explorer plugin for QGIS.&lt;/p>
&lt;p>&lt;a
href="https://www.youtube.com/watch?v=xCgD1DYYFU4"
target="_blank"
rel="noopener"
>QGIS Road to Nerdvana Episode 19&lt;/a>&lt;/p>
&lt;p>In Episode 20 Tim shows off some of the work he has been doing to integrate QGIS Server and QGIS Atlas reports on his farm project.&lt;/p>
&lt;p>Don&amp;rsquo;t forget to subscribe!&lt;/p></description></item><item><title>Using Geospatial Technology to Promote Clean Cooking</title><link>https://kartoza.github.io/kartoza-website/blog/using-geospatial-technology-to-promote-clean-cooking/</link><pubDate>Wed, 17 Mar 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/using-geospatial-technology-to-promote-clean-cooking/</guid><description>&lt;p>Access to clean cooking technology (such as gas or electric stoves) can greatly improve health outcomes. Approximately 3 million people depend on biomass fuels such as wood, coal, and dung for cooking to cook with (source: &lt;a
href="https://www.who.int/news-room/fact-sheets/detail/household-air-pollution-and-health"
target="_blank"
rel="noopener"
>WHO article on household air pollution&lt;/a>). The indoor air pollution generated whilst cooking indoors has serious, negative health impacts, with women and children in particular being affected. In fact the World Health Organisation (WHO) notes:&lt;/p></description></item><item><title>QGIS Road to Nerdvana Intern Edition</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-intern-edition/</link><pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-intern-edition/</guid><description>&lt;p>The interns took over the Nerdvana space, showing off their mapping skills using QGIS&lt;/p>
&lt;p>Catch Amy in &lt;a
href="https://youtu.be/wajSLoF0yK0"
target="_blank"
rel="noopener"
>Episode 19 of QGIS Road to Nerdvana&lt;/a>, Riley in &lt;a
href="https://youtu.be/VRxIoSxA8kk"
target="_blank"
rel="noopener"
>Episode 20 of QGIS Road to Nerdvana&lt;/a>, Nic in &lt;a
href="https://youtu.be/f7HPzHu0bKg"
target="_blank"
rel="noopener"
>Episode 21 of QGIS Road to Nerdvana&lt;/a> and Zinzi in &lt;a
href="https://youtu.be/PjUf5NVnx_k"
target="_blank"
rel="noopener"
>Epidose 22 of QGIS Road to Nerdvana&lt;/a>.&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 18: Introduction to PostgreSQL and PostGIS</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-18-introduction-to-postgresql-and-postgis/</link><pubDate>Mon, 08 Mar 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-18-introduction-to-postgresql-and-postgis/</guid><description>&lt;p>This is a walk-through showing how PostgreSQL and PostGIS can be used as a geospatial data store and then the data in that store be consumed and created by geopandas.&lt;/p>
&lt;p>Enjoy watching Episode 18 of QGIS Road to Nerdvana&lt;/p>
&lt;p>Don&amp;rsquo;t forget to like, comment and subscribe!&lt;/p></description></item><item><title>Python Type-Hint</title><link>https://kartoza.github.io/kartoza-website/blog/python-type-hint/</link><pubDate>Mon, 01 Mar 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/python-type-hint/</guid><description>&lt;p>Python is a dynamically-typed language, which means the interpreter does type-checking when the code is executed, and the variable type can change over its lifetime.&lt;/p>
&lt;pre>&lt;code>&amp;gt;&amp;gt;&amp;gt; if False:
... 1 + &amp;quot;two&amp;quot; # This line never runs, so no TypeError is raised
... else:
... 1 + 2
...
3
1 + &amp;quot;two&amp;quot; # Now this is type checked, and a TypeError is raised
&lt;/code>&lt;/pre>
&lt;p>On the above example, the first branch is never executed and thus type-checking never occurs. Then when we manually add 1 + “two”, it raises error because they’re not of the same type.&lt;/p></description></item><item><title>Making Django Custom Migrations</title><link>https://kartoza.github.io/kartoza-website/blog/making-django-custom-migrations/</link><pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/making-django-custom-migrations/</guid><description>&lt;p>Working with Django, we must be familiar with &lt;code>makemigrations&lt;/code> and the &lt;code>migrate&lt;/code> command. We use &lt;code>makemigrations&lt;/code> to automatically generate migration files, and &lt;code>migrate&lt;/code> to apply them.&lt;/p>
&lt;h2 id="problem">Problem&lt;/h2>
&lt;p>Recently I stumbled upon a problem where in short, I need to add &lt;code>created_at&lt;/code> and &lt;code>updated_at&lt;/code> (both are DateTimeField) to an existing table. Here’s the model for that table.&lt;/p>
&lt;pre>&lt;code>Class FarmerSample(models.Model):
geom = models.PointField()
farm = models.IntegerField()
datum = models.DateField()
sample_number = models.CharField(max_length=128)
def __str__(self):
     return '{} | {}'.format(self.id, self.datum)
&lt;/code>&lt;/pre>
&lt;p>&lt;code>FarmerSample&lt;/code> data has &lt;code>datum&lt;/code> field, which is the date a record is associated with. It is not the date when a record was created, because they are most likely created or saved to the database a few days after the observations, which makes the the creation date more recent than the &lt;code>datum&lt;/code>. I will not go into the detail as to why I need to add a field to indicate when a record was created and updated, but will focus only on my approach.&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 14: Fun and Games with QGIS Server</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-14-fun-and-games-with-qgis-server/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-14-fun-and-games-with-qgis-server/</guid><description>&lt;p>In this episode, Charles and Tim walk through setting up a QGIS server in docker with data and QGIS project files published in PostgreSQL / PostGIS. They have made a resource pack with the configuration files created and the sampled data etc., all of which are available at:&lt;/p>
&lt;p>&lt;a
href="https://plugins.qgis.org/geopackages/8/"
target="_blank"
rel="noopener"
>https://plugins.qgis.org/geopackages/8/&lt;/a>&lt;/p>
&lt;p>Enjoy&lt;/p>
&lt;p>&lt;a
href="https://youtu.be/1rSs3o8OoQ8"
target="_blank"
rel="noopener"
>Episode 14 of QGIS Road to Nerdvana&lt;/a>&lt;/p>
&lt;p>Don&amp;rsquo;t forget to leave your comments and subscribe!&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 12: Dashboards Revisited!</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-12-dashboards-revisited/</link><pubDate>Tue, 26 Jan 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-12-dashboards-revisited/</guid><description>&lt;p>In case you missed out on Episode 12 of our QGIS Road to Nerdvana, click on the link and enjoy the stream:&lt;/p>
&lt;p>&lt;a
href="https://youtu.be/lJTV90SvRAM"
target="_blank"
rel="noopener"
>QGIS Road to Nerdvana Episode 12&lt;/a>&lt;/p>
&lt;p>In this session, we will create a dashboard overlay in QGIS from scratch with no coding!&lt;/p>
&lt;p>Follow along as we explore creative new ways to use QGIS!&lt;/p>
&lt;p>You can download the GeoPackage we made in this tutorial here: &lt;a
href="https://github.com/timlinux/QGIS/files/5651978/QGISDashboardWalkthrough-Badajoz.zip"
target="_blank"
rel="noopener"
>https://github.com/timlinux/QGIS/files/5651978/QGISDashboardWalkthrough-Badajoz.zip&lt;/a>&lt;/p>
&lt;p>Don&amp;rsquo;t forget to leave your comments and subscribe!&lt;/p></description></item><item><title>QGIS Style Sharing Repository</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-style-sharing-repository/</link><pubDate>Mon, 25 Jan 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-style-sharing-repository/</guid><description>&lt;p>Woohoo! A new way to share styles in QGIS! Work sponsored by Kartoza.&lt;/p>
&lt;p>Sumandari (one of our developers) has been working on an exciting new functionality that she as been adding onto the QGIS plug-in website.&lt;/p>
&lt;p>﻿Here is the link to the session &lt;a
href="https://youtu.be/lQAMvTgDQl4"
target="_blank"
rel="noopener"
>QGIS Style Repositiry Demo&lt;/a>&lt;/p>
&lt;p>Don&amp;rsquo;t forget to leave your comments and subscribe to get more content!&lt;/p></description></item><item><title>Python Mocking Introduction</title><link>https://kartoza.github.io/kartoza-website/blog/python-mocking-introduction/</link><pubDate>Sun, 03 Jan 2021 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/python-mocking-introduction/</guid><description>&lt;p>Mocking is a process in unit testing when the test has external dependencies. We isolate our code during the test, without having to worry about the unexpected behavior of the dependencies. For example, we create a routine to save something to Firebase which utilizes 3rd party library called Firestore. There could be problems when saving data to Firebase, like internet connections, wrong configuration, non-existing document, you name it. Instead of testing every possible scenario when saving to Firebase, we only test that Firestore is called with correct parameter, which represents our data. The tests for Firestore itself should have been done by Firestore developer. Hence, we can shift our focus towards the implementation of our code. It also reduces testing time because we don’t need to send our data to Firebase.&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 10: Speed Map Making (part 1)</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-10-speed-map-making-part-1/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-10-speed-map-making-part-1/</guid><description>&lt;p>In this video Tim Sutton will be trying to go from Zero to Nice Looking Map as quick as he can. See how he goes about creating the map and see if you can&amp;rsquo;t make a nice looking map in 30 minutes.&lt;/p>
&lt;p>Enjoy&lt;a
href="https://youtu.be/_YQUy9rOKYo"
target="_blank"
rel="noopener"
> Episode 10, part 1 of our QGIS Road to Nerdvana!&lt;/a>&lt;/p>
&lt;p>Please subscribe to our channel if you want to see more videos like this! We are trying to get to 1000 subscribers so we can be famous like MrBeast :-)&lt;/p></description></item><item><title>QGIS Road To Nerdvana Episode 10: Speed Map Making (part 2)</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-10-speed-map-making-part-2/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-10-speed-map-making-part-2/</guid><description>&lt;p>Why make just one map in the quickest time possible? Make more! In this video, Tim Sutton will again try to go from Zero to a Nice Looking Map as quick as he can.&lt;/p>
&lt;p>Enjoy&lt;/p>
&lt;p>Please subscribe to our channel if you want to see more videos like this! We are trying to get to 1000 subscribers, so we can be famous like MrBeast :-)&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 11: Aggregate Dashboards</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-11-aggregate-dashboards/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-11-aggregate-dashboards/</guid><description>&lt;p>Tim Sutton decided to change things up a bit, he was joined by Charles and Seabilwe from Kartoza and the three made aggregate dashboards in QGIS. It is just the first steps and a lot of bumbling around, but hey, maybe you will learn something!&lt;/p>
&lt;p>In case you missed the live stream, here is the link:&lt;a
href="https://youtu.be/YLsDjzDP8zM"
target="_blank"
rel="noopener"
> &lt;/a>&lt;/p>
&lt;p>&lt;a
href="https://youtu.be/YLsDjzDP8zM"
target="_blank"
rel="noopener"
>QGIS Road to Nerdvana Episode 11&lt;/a>&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 8: It's All a Big Meshunderstanding</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-8-its-all-a-big-meshunderstanding/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-8-its-all-a-big-meshunderstanding/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">QGIS Road to Nerdvana Episode 8: It&amp;#39;s All a Big Meshunderstanding&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="205af5b075cde167" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="205af5b075cde167" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
In this episode, watch along as Tim Sutton explores some new mesh capabilities coming in QGIS 3.16!
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="exploring-mesh-capabilities">Exploring Mesh Capabilities&lt;/h2>
&lt;p>In this episode, watch along as Tim Sutton explores some new mesh capabilities coming in QGIS 3.16! Feel free to leave your questions in the comments below. Enjoy!&lt;/p></description></item><item><title>QGIS Road To Nerdvana Episode 8: It's All a Big Meshunderstanding</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-8-it-s-all-a-big-meshunderstanding/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-8-it-s-all-a-big-meshunderstanding/</guid><description>&lt;p>In this episode, watch along as Tim Sutton explores some new mesh capabilities coming in QGIS 3.16!&lt;/p>
&lt;p>Feel free to leave your questions in the comments below.&lt;/p>
&lt;p>Enjoy&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 9: Building a 3D Scene from Scratch</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-9-building-a-3d-scene-from-scratch/</link><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-9-building-a-3d-scene-from-scratch/</guid><description>&lt;p>In this episode, Tim Sutton will show you how to make a simple 3D scene in QGIS.&lt;/p>
&lt;p>Leave your comments and questions below and enjoy!!&lt;/p></description></item><item><title>Using a Docker Compose-Based Python Interpreter in PyCharm</title><link>https://kartoza.github.io/kartoza-website/blog/using-a-docker-compose-based-python-interpreter-in-pycharm/</link><pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/using-a-docker-compose-based-python-interpreter-in-pycharm/</guid><description>&lt;p>I was involved with different kinds of Django projects in the past. Back then the standard approach of attaching your debug interpreter was by creating a virtual environment in your python project. We debugged using PyCharm at that time. JetBrains generously gave us a free licence to use the whole suite of JetBrains tools as their way of supporting open source projects.&lt;/p>
&lt;p>However, back then the notion of developing a Django project from inside a container was not so common. We already managed some of our projects as microservices described by one or more docker-compose files. To debug with this kind of setup, we used an SSH daemon inside our container. Then we setup PyCharm so that it treated the docker container as a &lt;strong>remote interpreter&lt;/strong>. This worked for quite a long time (almost 5 years). Then finally JetBrains released support to allow interpreters inside a docker-compose configuration.&lt;/p></description></item><item><title>Working with Web Data using Requests and Beautiful Soup</title><link>https://kartoza.github.io/kartoza-website/blog/working-with-web-data-using-requests-and-beautiful-soup/</link><pubDate>Mon, 30 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/working-with-web-data-using-requests-and-beautiful-soup/</guid><description>&lt;p>Imagine us in charge of developing a feature to show public data coming from a third party that doesn’t have an API. Let’s say, we need to show current and historical data of dam water level which we can access at &lt;a
href="http://www.dwa.gov.za/Hydrology/Weekly/ProvinceWeek.aspx?region=WC"
target="_blank"
rel="noopener"
>http://www.dwa.gov.za/Hydrology/Weekly/ProvinceWeek.aspx?region=WC&lt;/a>. We cannot possibly add the entry manually&amp;ndash;it’s too time consuming. Some of us might choose the hard way to ask the data provider to make a public API, but there is a time constraint as we need it as soon as possible. One way to solve this is to use a method called “web scraping”.&lt;/p></description></item><item><title>Finding and Fixing Topology and Geometry Errors in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/finding-and-fixing-topology-and-geometry-errors-in-qgis/</link><pubDate>Mon, 23 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/finding-and-fixing-topology-and-geometry-errors-in-qgis/</guid><description>&lt;p>Google Maps, Google Earth, Uber are examples leading software/apps that are driven by GIS. They have allowed the ordinary person inadvertently to use GIS and appreciate its power without needing an understanding of the basics of GIS. Many people have taken the leap to using GIS by using some of the GIS capabilities in Google Earth.&lt;/p>
&lt;p>In a recent &amp;lsquo;&lt;a
href="https://kartoza.com/training-courses/"
target="_blank"
rel="noopener"
>Introduction to QGIS&lt;/a>&amp;rsquo; course, a client provided a dataset that had been generated in Google Earth, but each time they submitted their final layer to GIS experts they were told the layer was not correct. They just could not figure out what the error with their data was.&lt;/p></description></item><item><title>CyanoLakes App 1.0 Launched</title><link>https://kartoza.github.io/kartoza-website/blog/cyanolakes-app-1-0-launched/</link><pubDate>Sun, 15 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/cyanolakes-app-1-0-launched/</guid><description>&lt;p>We recently launched a mobile application that we developed with the CyanoLakes team. It adds a new dimension to the successful &lt;a
href="https://online.cyanolakes.com/"
target="_blank"
rel="noopener"
>Cyanolakes web app&lt;/a>, which has also received a facelift.&lt;/p>
&lt;p>The app uses satellite remote sensing data to provide cyanobacteria health risk levels and advisories for full and partial contact water activites, based on World Health Organisation guidelines and standards.&lt;/p>
&lt;p>We built it with React Native against the Cyanolakes web API.&lt;/p></description></item><item><title>CyanoLakes App 1.0 Launched</title><link>https://kartoza.github.io/kartoza-website/blog/cyanolakes-app-10-launched/</link><pubDate>Sun, 15 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/cyanolakes-app-10-launched/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">CyanoLakes App 1.0 Launched&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">JavaScript&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="80822161b81e2f92" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="80822161b81e2f92" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
We recently launched a mobile application that we developed with the CyanoLakes team. It adds a new dimension to the successful Cyanolakes web app.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="cyanolakes-mobile-application">CyanoLakes Mobile Application&lt;/h2>
&lt;p>Kartoza partnered with the CyanoLakes team to develop a mobile application that enhances their existing web platform. The application leverages satellite remote sensing technology to deliver cyanobacteria health risk assessments and activity advisories aligned with World Health Organisation guidelines.&lt;/p></description></item><item><title>Mocking Requests with requests_mock</title><link>https://kartoza.github.io/kartoza-website/blog/mocking-requests-with-requests-mock/</link><pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mocking-requests-with-requests-mock/</guid><description>&lt;p>Testing is an important part of software development, be it manual or automated. Untested code is a ticking time bomb ready to explode at the worst time possible, hence each developer must be responsible for testing their code. It’s even better when they make automated tests for their code, even if it’s only unit tests.&lt;/p>
&lt;p>There could be a time when we need to develop a feature relying on a 3rd party service. Let’s say we have a GIS app for farms and plan on a new feature where the user could subscribe to weather information. The weather data is retrieved from a paid 3rd party service and we are in charge of developing the feature.&lt;/p></description></item><item><title>Publishing Digital Elevation in Cesium</title><link>https://kartoza.github.io/kartoza-website/blog/publishing-digital-elevation-in-cesium/</link><pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/publishing-digital-elevation-in-cesium/</guid><description>&lt;p>Digital elevation data is now readily available from multiple sources. There are several tools that can help to visualise elevation data, &lt;a
href="https://www.cesium.com/"
target="_blank"
rel="noopener"
>Cesium&lt;/a> being one. Recently I have been researching how to visualise terrain data in cesium and I could not see a complete example that I could replicate on my own. This post will highlight the steps I took to visualise elevation data in cesium.&lt;/p>
&lt;ol>
&lt;li>Download elevation data. You can download the data from &lt;a
href="https://dwtkns.com/srtm30m/"
target="_blank"
rel="noopener"
>https://dwtkns.com/srtm30m/&lt;/a> or using the &lt;a
href="https://github.com/hdus/SRTM-Downloader"
target="_blank"
rel="noopener"
>SRTM Downloader&lt;/a> plugin in QGIS. In this example, I am using a GeoTIFF from &lt;a
href="https://github.com/kartoza/docker-mapproxy/blob/master/data/E020N40.tif"
target="_blank"
rel="noopener"
>https://github.com/kartoza/docker-mapproxy/blob/master/data/E020N40.tif&lt;/a>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/download-images.png" alt="">&lt;/li>
&lt;li>Modify your downloaded images to create a seamless layer. You can use &lt;a
href="https://gdal.org/programs/gdalbuildvrt.html"
target="_blank"
rel="noopener"
>gdalbuildvrt&lt;/a> or merge the individual tiles to a single image using &lt;a
href="https://gdal.org/programs/gdal_merge.html"
target="_blank"
rel="noopener"
>gdal_merge.py&lt;/a>.&lt;/li>
&lt;li>Spin up an instance of GeoServer. In this case, we will use the &lt;a
href="https://hub.docker.com/r/kartoza/geoserver"
target="_blank"
rel="noopener"
>kartoza/geoserver docker image&lt;/a>. To render the terrain data, we also need to install a GeoServer BIL extension. We run the following command to spin up GeoServer with the correct extension.&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>docker run -d -p 8080:8080 --name geoserver -v `pwd`/data:/data -e COMMUNITY_EXTENSIONS=dds-plugin kartoza/geoserver:2.17.2
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Open your GeoServer instance and publish your DEM. &lt;strong>NB:&lt;/strong> Remember to define the BIL format settings for your raster layer when publishing the layer.&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/bil-settings.png" alt="">&lt;/li>
&lt;li>Navigate to layer preview and test if you can preview your raster layer.&lt;/li>
&lt;li>Proceed to download the cesium terrain workshop material &lt;a
href="https://github.com/CesiumGS/cesium-workshop"
target="_blank"
rel="noopener"
>https://github.com/CesiumGS/cesium-workshop&lt;/a> &lt;strong>NB:&lt;/strong> The cesium workshop shows a lot of information which is not necessary for our example. We need to modify index.html and Source/App.js to be minimalistic for our example.&lt;/li>
&lt;li>Delete some lines from the index.html by running:&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>sed -i.bak '24,54d;' cesium-workshop/index.html
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Add a minimalistic App.js to replace the current one in the folder cesium-workshop/Source.&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>(function () {
    &amp;quot;use strict&amp;quot;;
    var west = 7.1;
    var south = -11.2;
    var east = 72.9;
    var north = 41.2;
    var rectangle = Cesium.Rectangle.fromDegrees(west, south, east, north);
    Cesium.Camera.DEFAULT_VIEW_FACTOR = 0;
    Cesium.Camera.DEFAULT_VIEW_RECTANGLE = rectangle;
    var viewer = new Cesium.Viewer('cesiumContainer', {
        scene3DOnly: true,
        selectionIndicator: false,
        baseLayerPicker: false
    });
    // Remove default base layer
    viewer.imageryLayers.remove(viewer.imageryLayers.get(0));
    viewer.imageryLayers.addImageryProvider(new Cesium.IonImageryProvider({assetId: 3954}));
    var terrainProvider = new Cesium.GeoserverTerrainProvider({
        url: &amp;quot;http://localhost:8080/geoserver/wms&amp;quot;,
        layerName: &amp;quot;kartoza:E020N40&amp;quot;,
        //styleName: &amp;quot;tradecraft:graytocolor&amp;quot;,
        waterMask: true
    });
    viewer.terrainProvider = terrainProvider;
}());
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Add a declaration for using &lt;a
href="https://github.com/kaktus40/Cesium-GeoserverTerrainProvider"
target="_blank"
rel="noopener"
>Cesium-GeoserverTerrainProvider&lt;/a>.&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>sed -i '/App.js/i &amp;lt;script src=&amp;quot;Source/GeoserverTerrainProvider.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;' cesium-workshop/index.html
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Use a web server to render your HTML file. For my use case, I am using Nginx in docker.&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>version: '3.4'
services:
  ngnix:
    image: nginx
    volumes:
      - ./cesium-workshop:/web
      - ./sites-enabled:/etc/nginx/conf.d:ro
    logging:
      driver: json-file
      options:
        max-size: 200m
        max-file: '10'
    ports:
      - 8091:80
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Where my nginx conf located in sites-enabled looks like&lt;/li>
&lt;/ol>
&lt;pre>&lt;code>server {
    listen      80;
    # the domain name it will serve for
    server_name localhost;
    # max upload size, adjust to taste
    client_max_body_size 15M;
    location / {
        add_header &amp;quot;Access-Control-Allow-Origin&amp;quot; &amp;quot;*&amp;quot;;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
        add_header 'Access-Control-Allow-Headers' 'X-Requested-With,Accept,Content-Type, Origin';
        root /web/;
        index index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
&lt;/code>&lt;/pre>
&lt;ol>
&lt;li>Navigate to &lt;a
href="http://localhost:8091"
target="_blank"
rel="noopener"
>http://localhost:8091&lt;/a>&lt;/li>
&lt;li>Rotate your map and you should be able to visualise the terrain as depicted below.&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/terains.png" alt="">&lt;/li>
&lt;li>In the production environment remember to replace the cesium default ion access token with your own&lt;/li>
&lt;/ol></description></item><item><title>QGIS Road to Nerdvana Episode 6 - Responding to Feedback on Episode 5 Pull Request</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-6-responding-to-feedback-on-episode-5-pull-request/</link><pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-6-responding-to-feedback-on-episode-5-pull-request/</guid><description>&lt;p>This episode is a follow-up from Episode 5, responding to the feedback received.&lt;br>
Enjoy&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 7: Logging Postgres Calls</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-7-logging-postgres-calls/</link><pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-7-logging-postgres-calls/</guid><description>&lt;p>In this episode, Tim Sutton will show you how to enable PostgreSQL logging and what underlying queries are generated by QGIS or any other PostgreSQL client.&lt;/p>
&lt;p>Enjoy&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 4: Dealing with Issues</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-4-dealing-with-issues/</link><pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-4-dealing-with-issues/</guid><description>&lt;p>In this episode of QGIS road to Nerdvana, Tim Sutton will be showing you a work flow that will aid in dealing with issues encountered with a QGIS that compiles, so you won’t have to compile or debug.&lt;/p>
&lt;p>Enjoy!!&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 5: Tweaking the First Run Dialog</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-5-tweaking-the-first-run-dialog/</link><pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-5-tweaking-the-first-run-dialog/</guid><description>&lt;p>In this episode, Tim Sutton takes you along for the ride as he picks a long-time irritation in QGIS: The first run dialog. He tweaks it to make it look nice to submit it as a pull request to QGIS.&lt;/p>
&lt;p>Enjoy&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 2: QGIS QtCreator Build on Pop_OS! 20.04</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-2-qgis-qtcreator-build-on-pop-os-20-04/</link><pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-2-qgis-qtcreator-build-on-pop-os-20-04/</guid><description>&lt;p>In today’s video blog, Tim Sutton shows you how to use QtCreator to build QGIS in a graphical development environment. The key entries used when setting up 3D support and here are the commands used to install QtCreator:&lt;/p>
&lt;pre>&lt;code>sudo apt install qtcreator
&lt;/code>&lt;/pre>
&lt;p>In CMake config&lt;/p>
&lt;pre>&lt;code>Qt53DExtras_DIR /home/timlinux/dev/cpp/QGIS/external/qt3dextra-headers/cmake/Qt53DExtras  
&lt;/code>&lt;/pre>
&lt;p>In manage kits&lt;/p>
&lt;pre>&lt;code>QT5_3DEXTRA_INCLUDE_DIR=/home/timlinux/dev/cpp/QGIS/external/qt3dextra-headers
QT5_3DEXTRA_LIBRARY=/usr/lib/x86_64-linux-gnu/libQt53DExtras.so
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Note you will have to adjust the paths above to match where you have checked out your code on your system.&lt;/strong>&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 2: QGIS QtCreator Build on Pop_OS! 20.04</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-2-qgis-qtcreator-build-on-pop-os-2004/</link><pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-2-qgis-qtcreator-build-on-pop-os-2004/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">QGIS Road to Nerdvana Episode 2&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="5b3e84d7a0fc8eec" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="5b3e84d7a0fc8eec" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Tim Sutton demonstrates how to use QtCreator to build QGIS within a graphical development environment.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Tim Sutton demonstrates how to use QtCreator to build QGIS within a graphical development environment. The tutorial focuses on establishing 3D support capabilities.&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 3: QGIS QA using Astyle and Pre-commit Hooks</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-3-qgis-qa-using-astyle-and-pre-commit-hooks/</link><pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-3-qgis-qa-using-astyle-and-pre-commit-hooks/</guid><description>&lt;p>We are back with another episode of our roads to Nerdvana. On today’s episode, Tim Sutton and world-renowned QGIS developer Matthias Kuhn walk you through the setup process for using &amp;lsquo;astyle precommit hooks&amp;rsquo; – basically clever tools that will make sure your code looks smart and neat automatically so that nobody rejects it for not being standard compliant when you make a pull request.&lt;/p>
&lt;p>Hit the like and subscribe button while you enjoy&lt;/p></description></item><item><title>QGIS Road to Nerdvana Episode 1: QGIS Console Build</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-1-qgis-console-build/</link><pubDate>Fri, 02 Oct 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-road-to-nerdvana-episode-1-qgis-console-build/</guid><description>&lt;p>QGIS Road to Nerdvana is an exciting series of videos blogs that walk you through building QGIS environments to installing and using QTCreator all running on Ubuntu 20.04.&lt;/p>
&lt;p>This also is a way of exploring various functions that QGIS has to offer, for creating simple maps to performing analysis efficiently.&lt;/p>
&lt;p>In the first part of the series of the video blogs, Tim Sutton walks you through the QGIS Console Build in Ubuntu 20.04.&lt;/p></description></item><item><title>Calculating Area of Rasters in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/calculating-area-of-rasters-in-qgis/</link><pubDate>Mon, 14 Sep 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/calculating-area-of-rasters-in-qgis/</guid><description>&lt;p>QGIS raster functionality has come a long way and continues to improve. During my spare time, I am always on the lookout for interesting questions posed on &lt;a
href="https://gis.stackexchange.com"
target="_blank"
rel="noopener"
>https://gis.stackexchange.com&lt;/a>.&lt;/p>
&lt;p>I recently came across &lt;a
href="https://gis.stackexchange.com/questions/52353/calculating-area-of-rasters-in-qgis"
target="_blank"
rel="noopener"
>https://gis.stackexchange.com/questions/52353/calculating-area-of-rasters-in-qgis&lt;/a> where a user asked how to calculate the area of each class in a raster.&lt;/p>
&lt;p>The suggested solution involved a three-step approach:&lt;/p>
&lt;ul>
&lt;li>Recode the raster to simplify the raster classes.&lt;/li>
&lt;li>Vectorize the raster layer.&lt;/li>
&lt;li>Calculation of the statistics from the vector layer either by using SQL (Virtual layers) or native QGIS algorithms.&lt;/li>
&lt;/ul>
&lt;p>Although the suggested solution was accepted as an answer it presents a couple of challenges&lt;/p></description></item><item><title>Speeding Up Multiple Web Map Service Requests Using Python's Asyncio and Aiohttp</title><link>https://kartoza.github.io/kartoza-website/blog/speeding-up-multiple-web-map-service-requests-using-python-s-asyncio-and-aiohttp/</link><pubDate>Wed, 29 Jul 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/speeding-up-multiple-web-map-service-requests-using-python-s-asyncio-and-aiohttp/</guid><description>&lt;p>&lt;a
href="https://geocontext.kartoza.com/"
target="_blank"
rel="noopener"
>Geocontext&lt;/a> is a Django app that retrieves information from multiple web based services for a specific query point. The services are arranged into hierarchies with multiple services in a &lt;em>group&lt;/em> and multiple &lt;em>groups&lt;/em> in a &lt;em>collection.&lt;/em> It currently supports querying WMS, WFS &amp;amp; ArcREST services.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/geocontext.png" alt="Geoconttextt result">&lt;/p>
&lt;p>Previously fetching these services was done by looping over all services in a group and for all the groups in a collection. This means that requests to external service providers were done serially, with each new request firing only after the previous is received and the app doing nothing but waiting in between. This is a classic bottleneck caused by network requests. We would like all of the network requests to be fired off in parallel instead.&lt;/p></description></item><item><title>Speeding Up Multiple Web Map Service Requests Using Python's Asyncio and Aiohttp</title><link>https://kartoza.github.io/kartoza-website/blog/speeding-up-multiple-web-map-service-requests-using-pythons-asyncio-and-aiohttp/</link><pubDate>Wed, 29 Jul 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/speeding-up-multiple-web-map-service-requests-using-pythons-asyncio-and-aiohttp/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Speeding Up Multiple Web Map Service Requests&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Python&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="08a775fa264a782a" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="08a775fa264a782a" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Geocontext is a Django application designed to retrieve information from multiple web-based services for specific query points.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Geocontext is a Django application designed to retrieve information from multiple web-based services for specific query points. The application organises services hierarchically, supporting WMS, WFS, and ArcREST service queries.&lt;/p></description></item><item><title>School GIS Task: Create a 5km COVID-19 Lockdown Exercise Buffer Around Your House</title><link>https://kartoza.github.io/kartoza-website/blog/school-gis-task-create-a-5km-covid-19-lockdown-exercise-buffer-around-your-house/</link><pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/school-gis-task-create-a-5km-covid-19-lockdown-exercise-buffer-around-your-house/</guid><description>&lt;p>If you are doing some teaching in the classroom and some online and you are finding &amp;ldquo;blended teaching&amp;rdquo; overwhelming, this task is designed for asynchronous self study.&lt;/p>
&lt;p>This task was initially given to Grade 10, 11 and 12s in South Africa&amp;rsquo;s Lockdown Level 4 so they could create a map of their 5km exercise buffer. The idea is that they digitse their home and local communities on OpenStreetMap (OSM), see the &lt;a
href="http://gissa.org.za/education/school-gis/osm-cheat-sheet.pdf"
target="_blank"
rel="noopener"
>cheat sheet&lt;/a> before they begin. Please feel free to watch these movies and make your own.&lt;/p></description></item><item><title>Does Hosting Your Own Server Still Make Sense in 2020?</title><link>https://kartoza.github.io/kartoza-website/blog/does-hosting-your-own-server-still-make-sense-in-2020/</link><pubDate>Mon, 15 Jun 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/does-hosting-your-own-server-still-make-sense-in-2020/</guid><description>&lt;p>&lt;strong>Client:&lt;/strong> We need a server for this project, and we want to host it in house&lt;/p>
&lt;p>&lt;strong>Me:&lt;/strong> Why?&lt;/p>
&lt;p>The procurement of a server / multiple servers represents a large capital outlay. If you amortize that outlay over a 5 to 10-year lifespan, in my opinion, it is usually a poor investment. With cloud hosting, your equipment will be hosted in a facility with proper cooling, dust management, and power management - all critical for the long reliable operation of a server. Unless your project partners have facilities like this in place already, you can expect higher than average hardware failure rates and server downtime. In addition, a cloud provider has strong physical security, removing the possibility that equipment can be stolen or reappropriated.&lt;/p></description></item><item><title>Consuming Cloud Optimised GeoTIFFs in QGIS Server</title><link>https://kartoza.github.io/kartoza-website/blog/consuming-cloud-optimised-geotiffs-in-qgis-server/</link><pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/consuming-cloud-optimised-geotiffs-in-qgis-server/</guid><description>&lt;p>QGIS has been able to consume &lt;a
href="https://www.cogeo.org/"
target="_blank"
rel="noopener"
>cloud optimised GeoTIFF&lt;/a>s (COGs) since v3.2, through the data source manager. This article does not aim to explain what a COG is as various other articles have done so extensively.&lt;/p>
&lt;p>Many organisations are choosing to use cloud based storage like &lt;a
href="https://aws.amazon.com/s3/"
target="_blank"
rel="noopener"
>S3&lt;/a> or &lt;a
href="https://cloud.google.com/storage/"
target="_blank"
rel="noopener"
>Google Cloud Storage&lt;/a>. Traditional GIS file formats can easily sit in the cloud, but serving up web map tiles or doing on-the-fly processing of the data are difficult to do efficiently with those formats. They often have to be fully downloaded to another location and then translated to an optimised format or stored in memory.&lt;/p></description></item><item><title>Create a Custom Reference Grid in QGIS Composer (Part 2)</title><link>https://kartoza.github.io/kartoza-website/blog/create-a-custom-reference-grid-in-qgis-composer-part-2/</link><pubDate>Mon, 30 Mar 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/create-a-custom-reference-grid-in-qgis-composer-part-2/</guid><description>&lt;p>This is a follow-up post on &lt;a
href="https://kartoza.com/en/blog/create-a-custom-reference-grid-in-qgis-composer/"
target="_blank"
rel="noopener"
>https://kartoza.com/en/blog/create-a-custom-reference-grid-in-qgis-composer/&lt;/a>.&lt;/p>
&lt;p>This post outlines how to make dynamic grids that are aligned to the lat long graticule.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/lat-long.png" alt="">&lt;/p>
&lt;p>Create one grid to show the lines with intervals in decimal degrees.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/lat-long-map-grid.png" alt="">&lt;/p>
&lt;p>Create another grid to show the labels in the center of the visible grid cells. Note the offset is set to half the interval and we don&amp;rsquo;t draw the lines.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/lat-long-labels.png" alt="">&lt;/p>
&lt;p>Navigate to the label setting for the second grid and choose the following.&lt;/p></description></item><item><title>Data Defined Settings for Grid Placements in QGIS 3.12</title><link>https://kartoza.github.io/kartoza-website/blog/data-defined-settings-for-grid-placements-in-qgis-3-12/</link><pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/data-defined-settings-for-grid-placements-in-qgis-3-12/</guid><description>&lt;p>For a while now I have been trying to simulate the &lt;a
href="http://www.ngi.gov.za/index.php/what-we-do/maps-and-geospatial-information/35-map-products/51-1-50-000-topographical-maps"
target="_blank"
rel="noopener"
>1in50k topographic maps of South Africa&lt;/a>. I started using QGIS since version 1.8 and I couldn&amp;rsquo;t replicate the cartography on the topographic maps but over time as QGIS has matured, I could replicate the NGI maps. NGI uses proprietary software and then Adobe to fine-tune some context on the maps. For this exercise I used QGIS 3.12.0&lt;/p>
&lt;p>The goal of the exercise was to emulate the grid labels for the topographic maps as depicted below.&lt;/p></description></item><item><title>Data Defined Settings for Grid Placements in QGIS 3.12</title><link>https://kartoza.github.io/kartoza-website/blog/data-defined-settings-for-grid-placements-in-qgis-312/</link><pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/data-defined-settings-for-grid-placements-in-qgis-312/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Data Defined Settings for Grid Placements in QGIS 3.12&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">QGIS&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="0d0ef44acaf1f91e" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="0d0ef44acaf1f91e" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
The author has been attempting to recreate South African 1:50,000 topographic maps using QGIS 3.12.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="recreating-topographic-maps-in-qgis">Recreating Topographic Maps in QGIS&lt;/h2>
&lt;p>For a while now I have been trying to simulate the &lt;a
href="http://www.ngi.gov.za/index.php/what-we-do/maps-and-geospatial-information/35-map-products/51-1-50-000-topographical-maps"
target="_blank"
rel="noopener"
>1in50k topographic maps of South Africa&lt;/a>. I started using QGIS since version 1.8 and I couldn&amp;rsquo;t replicate the cartography on the topographic maps but over time as QGIS has matured, I could replicate the NGI maps. NGI uses proprietary software and then Adobe to fine-tune some context on the maps. For this exercise I used QGIS 3.12.0&lt;/p></description></item><item><title>Calculating Intersects for Map Layers and Map Extent Dynamically in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/calculating-intersects-for-map-layers-and-map-extent-dynamically-in-qgis/</link><pubDate>Mon, 17 Feb 2020 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/calculating-intersects-for-map-layers-and-map-extent-dynamically-in-qgis/</guid><description>&lt;p>Recently we have been working on a project that involves simulating the &lt;a
href="http://www.ngi.gov.za/index.php/what-we-do/maps-and-geospatial-information/35-map-products/51-1-50-000-topographical-maps"
target="_blank"
rel="noopener"
>1 in 50k topographic maps in South Africa&lt;/a>. Since we are using QGIS Server to print the map all the logic is set up in print composer. All maps generated are dynamic (users can select a specific area within South Africa to print) and QGIS Server will use the map template to generate the map.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/printing-area.png" alt="Print Area">&lt;/p>
&lt;p>On each topographic map is printed map sheets that correspond to the printed area as depicted below&lt;/p></description></item><item><title>The Longest River in the World</title><link>https://kartoza.github.io/kartoza-website/blog/the-longest-river-in-the-world/</link><pubDate>Mon, 14 Oct 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/the-longest-river-in-the-world/</guid><description>&lt;p>Every now and then there might be a dispute about which is really the longest river in the world. As is shown in this National Geographic &lt;a
href="https://www.nationalgeographic.com/science/2007/06/amazon-longer-than-nile-river/"
target="_blank"
rel="noopener"
>article&lt;/a>. Even Wikipedia indicates that the fact that the Nile river is accepted as the longest river in the world as &amp;ldquo;disputed&amp;rdquo;.&lt;/p>
&lt;p>The main contender to take the crown as the longest river in the world is of course none other than the Amazon. As romantic as the National Geographic try to make it sound I don&amp;rsquo;t believe a dispute like this will be settled with an overland expidition into the jungles of Peru or a hero&amp;rsquo;s adventure looking for the source of the Nile in central Africa.&lt;/p></description></item><item><title>Batch Count Vector Features Intersecting Series of Blocks in PostgreSQL</title><link>https://kartoza.github.io/kartoza-website/blog/batch-count-vector-features-intersecting-series-of-blocks-in-postgresql/</link><pubDate>Thu, 13 Jun 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/batch-count-vector-features-intersecting-series-of-blocks-in-postgresql/</guid><description>&lt;p>The national mapping agency in South Africa (&lt;a
href="http://www.ngi.gov.za"
title="NGI"
target="_blank"
rel="noopener"
>NGI&lt;/a> ) caters for national mapping, digital topographic and other Geo-Spatial Information services. The department is mandated to provide spatial data for the whole country. In most cases, they have an in-house team that is responsible for digitizing aerial photography, field validation to produce vector data that is used to make 1:50 000 topographic maps.&lt;/p>
&lt;p>The department has recently floated a tender in which they encourage service providers to participate in the mapping exercise for some other parts of the country. The department is mandated to update all the spatial data on a 5-year cycle. As an interested party, I set out to find how much work would be involved in mapping these areas based on data available for these areas.&lt;/p></description></item><item><title>Show Only Features Within Current Atlas Feature - QGIS 3</title><link>https://kartoza.github.io/kartoza-website/blog/show-only-features-within-current-atlas-feature-qgis-3/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/show-only-features-within-current-atlas-feature-qgis-3/</guid><description>&lt;p>In our endless endeavour to spread QGIS, I was invited to conduct QGIS training at the &lt;a
href="http://www.gov.sz/index.php/ministries-departments/ministry-of-natural-resources/surveyor-general"
target="_blank"
rel="noopener"
>Surveyor General Department&lt;/a> in Swaziland.&lt;/p>
&lt;p>Whilst teaching about map composer and atlas we wanted to show features that are within a polygon extent. A quick google search showed us that this had been answered by &lt;a
href="https://gis.stackexchange.com/questions/260392/show-only-features-within-current-atlas-feature"
target="_blank"
rel="noopener"
>Underdark&lt;/a> but her answer included showing intersecting features. In our case, we only wanted to show features that were within a polygon.&lt;/p></description></item><item><title>Creating a Live, Topic Specific Mirror of OpenStreetMap in PostGIS</title><link>https://kartoza.github.io/kartoza-website/blog/creating-a-live-topic-specific-mirror-of-openstreetmap-in-postgis/</link><pubDate>Mon, 29 Apr 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/creating-a-live-topic-specific-mirror-of-openstreetmap-in-postgis/</guid><description>&lt;h3 id="introduction">Introduction&lt;/h3>
&lt;p>In this article, we will do a walk-through of creating a live mirror of OSM for a specific country or region and for a specific set of OSM features. For this example, we will fetch all building data for Angola into a PostGIS database, and update that database with new features as they arrive in OSM. Providing an OSM mirror in this way is a powerful tool to pair the power of OSM with the power of QGIS and PostGIS. Now you will be able to do offline analysis of the data in OSM. How does this all work? Here is a little diagram that illustrates the underlying architecture (click for a larger version):&lt;/p></description></item><item><title>FBIS 2 Launch Workshop</title><link>https://kartoza.github.io/kartoza-website/blog/fbis-2-launch-workshop/</link><pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/fbis-2-launch-workshop/</guid><description>&lt;p>Toni Olsen from Freshwater Research Center (&lt;a
href="http://frcsa.org.za"
target="_blank"
rel="noopener"
>http://frcsa.org.za&lt;/a>) presenting the Freshwater Biodiversity Informations System (FBIS) version 2 at the launch workshop. FBIS is developed by Kartoza based on design specifications and legacy data provided by FRC and other partners. The project is funded by JRS (&lt;a
href="http://jrsbiodiversity.org"
target="_blank"
rel="noopener"
>http://jrsbiodiversity.org&lt;/a>) and SANBI (&lt;a
href="https://www.sanbi.org"
target="_blank"
rel="noopener"
>https://www.sanbi.org&lt;/a>).&lt;/p></description></item><item><title>How to Make Beautiful Lollipop Call Out Labels in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-make-beautiful-lollipop-call-out-labels-in-qgis/</link><pubDate>Thu, 11 Apr 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-make-beautiful-lollipop-call-out-labels-in-qgis/</guid><description>&lt;p>Call out labels are a handy cartographic instrument for attaching labels to features on the map where you want the label to be offset from the feature being labelled. It allows you to prevent the map becoming overcrowded. I call the variant I describe here &amp;rsquo;lollipop&amp;rsquo; labels because the &amp;lsquo;callout line&amp;rsquo; is rendered with a decorative ball at the end.&lt;/p>
&lt;h4 id="generating-the-callout-geometry">&lt;strong>Generating the callout geometry&lt;/strong>&lt;/h4>
&lt;p>I am using logic like this to make callout labels using a geometry generator:&lt;/p></description></item><item><title>Mounting a Storage Drive in Hetzner Cloud for Rancher Deployments</title><link>https://kartoza.github.io/kartoza-website/blog/mounting-a-storage-drive-in-hetzner-cloud-for-rancher-deployments/</link><pubDate>Thu, 11 Apr 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mounting-a-storage-drive-in-hetzner-cloud-for-rancher-deployments/</guid><description>&lt;p>This article builds upon an earlier blog post by Tim Sutton on &lt;a
href="https://kartoza.com/en/blog/using-a-sambacifs-mount-as-a-docker-volume/"
target="_blank"
rel="noopener"
>using-a-sambacifs-mount-as-a-docker-volume&lt;/a>. In the previous article, Tim described the process of mounting a storage driver in detail.&lt;/p>
&lt;p>What has necessitated this article is the recent changes in what hetzner offers to configure a storage driver. In this article, I will describe the process of mounting a storage driver in hetzner cloud to use in rancher V1.1. Yes, we are still using rancher v1 in favour of the new shiny rancher 2.&lt;/p></description></item><item><title>Using NOTIFY to Automatically Refresh Layers in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/using-notify-to-automatically-refresh-layers-in-qgis/</link><pubDate>Mon, 01 Apr 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/using-notify-to-automatically-refresh-layers-in-qgis/</guid><description>&lt;p>One of the most brilliant but little-known features of QGIS is the ability to trigger layer refreshes and events in response to notifications from PostgreSQL. This was developed by the wizards from &lt;a
href="https://oslandia.com/"
target="_blank"
rel="noopener"
>Oslandia&lt;/a> and is easily added to any existing table in your PostgreSQL database - including PostGIS tables. This feature was added in version 3.0 (see &lt;a
href="https://qgis.org/en/site/forusers/visualchangelog30/#feature-trigger-layer-refresh-or-layer-actions-from-postgresql-notify-signal"
target="_blank"
rel="noopener"
>https://qgis.org/en/site/forusers/visualchangelog30/#feature-trigger-layer-refresh-or-layer-actions-from-postgresql-notify-signal&lt;/a>).&lt;/p>
&lt;p>Take for example this simple table:&lt;/p>
&lt;pre>&lt;code>emp-shared=# \d line
Table &amp;quot;public.line&amp;quot;
   Column   |           Type            |                     Modifiers                     
------------+---------------------------+---------------------------------------------------
id          | integer                   | not null default nextval('line_id_seq'::regclass)
name        | character varying(255)    | not null
voltage_kv  | real                      | not null
source_id   | integer                   | not null
geom        | geometry(LineString,4326) | 
Indexes:
  &amp;quot;line_pkey&amp;quot; PRIMARY KEY, btree (id)
  &amp;quot;sidx_line_geom&amp;quot; gist (geom)
&lt;/code>&lt;/pre>
&lt;p>Let&amp;rsquo;s first create a PostgreSQL function that will send the notification:&lt;/p></description></item><item><title>How to Easily Add South African and Namibian Toposheets as XYZ Tiles to QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-easily-add-south-african-and-namibian-toposheets-as-xyz-tiles-to-qgis/</link><pubDate>Tue, 08 Jan 2019 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-easily-add-south-african-and-namibian-toposheets-as-xyz-tiles-to-qgis/</guid><description>&lt;p>Thanks to the great work of Grant Slater and the OpenStreetmap team, there are freely available XYZ tilesets for South Africa and Namibia 1:50 000 series toposheets which can easily be added to QGIS. Here is the general procedure to add a layer:&lt;/p>
&lt;p>1.) Open the browser panel (View -&amp;gt; Panels -&amp;gt; Browser) and scroll down to the entry called XYZ tiles if needed.&lt;/p>
&lt;p>2. ) Right-click the XYZ tiles entry and choose &amp;lsquo;New Connection&amp;hellip;&amp;rsquo;&lt;/p></description></item><item><title>Year in Review: 2018</title><link>https://kartoza.github.io/kartoza-website/blog/year-in-review-2018/</link><pubDate>Tue, 18 Dec 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/year-in-review-2018/</guid><description>&lt;p>It’s been another awesome year for our Team. We have come a long way since establishing Kartoza in 2014, building many different software products, making friends and working with existing and new clients. Forming a company around an open source friendly business model presents many challenges but is also extremely rewarding. Here is our 2018 year end review that we would like to share with you!&lt;/p>
&lt;h2 id="event-highlights">Event Highlights&lt;/h2>
&lt;h3 id="foss4g">FOSS4G&lt;/h3>
&lt;p>FOSS4G is the annual conference for Open Source geospatial practitioners and enthusiasts. This year &lt;a
href="https://2018.foss4g.org/"
target="_blank"
rel="noopener"
>FOSS4G2018&lt;/a> was held in Dar es Salaam, Tanzania. Team Kartoza were there in force. We were Silver Sponsors for the event and were the only sponsoring African open source geospatial solutions company. Tim Sutton was also on the local organising committee. Kartoza was further represented at the event by Gavin Fleming (Kartoza co-founder), Christian Christelis, Admire Nyakudya, Anita Hapsari and Rizky Nugraha. It was a fun-packed week of learning and sharing.&lt;/p></description></item><item><title>Adding Elevation to a Line from a DEM in PostGIS and Maintaining Accurate Measures</title><link>https://kartoza.github.io/kartoza-website/blog/adding-elevation-to-a-line-from-a-dem-in-postgis-and-maintaining-accurate-measures/</link><pubDate>Wed, 22 Aug 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/adding-elevation-to-a-line-from-a-dem-in-postgis-and-maintaining-accurate-measures/</guid><description>&lt;p>This is the second in a three part series on the behind-the-scenes GIS work that can go into planning a complex event, in this case the Cape Town Marathon.&lt;/p>
&lt;p>Following on from &lt;a
href="http://kartoza.com/en/blog/how-to-create-a-point-distance-marker-layer-along-a-line-in-postgis/"
target="_blank"
rel="noopener"
>creating point markers along a line in PostGIS&lt;/a> this post delves into 4D coordinates, PostGIS functions and rasters in PostGIS.&lt;/p>
&lt;p>What I show here is about meeting two requirements of the marathon route planning team:&lt;/p>
&lt;ul>
&lt;li>Automatically update the length of a route after each edit with the most accurate calculation possible&lt;/li>
&lt;li>Enable a QGIS user to query the distance along a line at any point by clicking on it&lt;/li>
&lt;/ul>
&lt;p>For the first one, we want to calculate the length along the spheroid, which is easy enough, but we can make it even more accurate by taking into account elevation as the route goes up and down hills.&lt;/p></description></item><item><title>How to Create a Point Distance Marker Layer Along a Line in PostGIS</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-create-a-point-distance-marker-layer-along-a-line-in-postgis/</link><pubDate>Thu, 09 Aug 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-create-a-point-distance-marker-layer-along-a-line-in-postgis/</guid><description>&lt;p>This is part 1 of a 3-part series.&lt;/p>
&lt;p>If you look at the &lt;a
href="http://maps.kartoza.com/CapeTownMarathon/"
target="_blank"
rel="noopener"
>Cape Town Marathon interactive web map&lt;/a> you&amp;rsquo;ll see kilometre markers along the race routes. Creating these is not as straighforward as you might think. For the team planning the marathon and the other routes, it used to involve a painstaking manual process in Google Earth.&lt;/p>
&lt;ul>
&lt;li>The routes are edited fairly often leading up to the event&lt;/li>
&lt;li>They don&amp;rsquo;t want to manually create points each time they edit the route&lt;/li>
&lt;li>They need the distances to be as accurate as possible. After all, the Marathon is an IAAF Gold event. However, even the best map won&amp;rsquo;t have 100% accurate distance because of mapping errors and elevation changes. To establish the official finish line position, a cyclist measures the route along the path a runner would take. That&amp;rsquo;s why the end distance markers aren&amp;rsquo;t exactly at the end of the route.&lt;/li>
&lt;/ul>
&lt;p>I had my eye on a solution involving &lt;a
href="https://en.wikipedia.org/wiki/Linear_referencing"
target="_blank"
rel="noopener"
>linear referencing&lt;/a> from the start and tried a couple of approaches before settling on the one I describe in detail below. I did find solutions using &lt;a
href="https://grass.osgeo.org/grass74/manuals/v.segment.html"
target="_blank"
rel="noopener"
>v.segment&lt;/a> from GRASS and the QGIS &lt;a
href="http://blazek.github.io/lrs/"
target="_blank"
rel="noopener"
>LRS plugin&lt;/a> but I felt these were too complex for a non-GIS specialist and they also involve several steps.&lt;/p></description></item><item><title>Setting up Geogig in a Production Environment</title><link>https://kartoza.github.io/kartoza-website/blog/setting-up-geogig-in-a-production-environment/</link><pubDate>Mon, 25 Jun 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/setting-up-geogig-in-a-production-environment/</guid><description>&lt;p>GIS practitioners and developers have long been interested in versioning spatial data. Luckily the folk at &lt;a
href="https://www.locationtech.org/"
target="_blank"
rel="noopener"
>LocationTech&lt;/a> have enabled us to do so through the provision of &lt;a
href="http://geogig.org/"
target="_blank"
rel="noopener"
>GeoGig&lt;/a> (formerly geogit). Moreover, Geogig can interact with &lt;a
href="http://geoserver.org/"
target="_blank"
rel="noopener"
>GeoServer&lt;/a> seamlessly. At Kartoza we use &lt;a
href="https://www.docker.com/"
target="_blank"
rel="noopener"
>Docker&lt;/a> for orchestration of our services and as such it will form the backbone of this article.&lt;/p>
&lt;p>GeoGig inherits its core functions from the code-versioning principles of &lt;a
href="https://git-scm.com/"
target="_blank"
rel="noopener"
>git&lt;/a>.&lt;/p>
&lt;p>In this sample Docker configuration we link GeoGig to a PostGIS database and a GeoServer instance. We assume you have already built the GeoServer image following the recipe at &lt;a
href="https://github.com/kartoza/docker-geoserver/"
target="_blank"
rel="noopener"
>docker-geoserver&lt;/a>.&lt;/p></description></item><item><title>How to Setup SSL on Nginx Using LetsEncrypt</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-setup-ssl-on-nginx-using-letsencrypt/</link><pubDate>Thu, 21 Jun 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-setup-ssl-on-nginx-using-letsencrypt/</guid><description>&lt;h3 id="introduction">Introduction&lt;/h3>
&lt;p>Another doc about SSL? Maybe&amp;hellip; We are writing this to explain our trial and error on setup SSL on the servers. You might have read somewhere about setting up SSL (so have we, and it&amp;rsquo;s painful).&lt;br>
Our blog is based on hands-on experience and hopefully you can learn something from it.&lt;/p>
&lt;p>We assume that you already have your web server up and running. Suppose that your domain name is: example.com. You are thinking that it&amp;rsquo;s time for you to enhance the web server&amp;rsquo;s security by adding the SSL protocol.&lt;/p></description></item><item><title>Using a SAMBA/CIFS Mount as a Docker Volume</title><link>https://kartoza.github.io/kartoza-website/blog/using-a-samba-cifs-mount-as-a-docker-volume/</link><pubDate>Sat, 07 Apr 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/using-a-samba-cifs-mount-as-a-docker-volume/</guid><description>&lt;p>I preface this article by saying that what I am showing here is probably not best practice and you should test to see if it works reliably for you before taking this route. I should also mention that this is a hacky approach because it breaks our ‘never log on to a server’ rule, so it is not a long-term solution - it is a short-term hack until Hetzner adds a cloud storage offering to their cloud platform.&lt;/p></description></item><item><title>Some QGIS 3 Browser Improvements - Small Things Matter</title><link>https://kartoza.github.io/kartoza-website/blog/some-qgis-3-browser-improvements-small-things-matter/</link><pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/some-qgis-3-browser-improvements-small-things-matter/</guid><description>&lt;p>Well, QGIS 3 has been out for a couple of weeks now with lots of new functionality. While you are still feeling your way around all the new features I thought I could highlight some of the improvements to the browser panel that will make you fall further in love with QGIS.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>1. Ability to load QGIS projects from the browser. We now have a Project Home Menu which will list all your QGIS project for easy loading. You can load the project by just dragging it&lt;/th>
&lt;th>onto the map canvas or right click and choose Add Project.&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/rax7dkb.png" alt="">&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>2. Permanently delete files from the file system using the browser dialog.| &lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/GGGiXzU.png" alt="">&lt;br>
3. Add XYZ (or ZXY) tile layers into QGIS . Example for South African Topographical maps : &lt;a
href="https://htonl.dev.openstreetmap.org/ngi-tiles/tiles/50k/%7bz%7d/%7bx%7d/%7b-y%7d.png"
target="_blank"
rel="noopener"
>https://htonl.dev.openstreetmap.org/ngi-tiles/tiles/50k/{z}/{x}/{-y}.png&lt;/a>| &lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/0gwZjjX.png" alt="">&lt;br>
4. Connect QGIS to a GeoNode Instance running QGIS server backend.|&lt;/p></description></item><item><title>An Intern's Perspective on Her Working Experience at Kartoza During the Summer Vacation</title><link>https://kartoza.github.io/kartoza-website/blog/an-intern-s-perspective-on-her-working-experience-at-kartoza-during-the-summer-vacation/</link><pubDate>Mon, 05 Feb 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/an-intern-s-perspective-on-her-working-experience-at-kartoza-during-the-summer-vacation/</guid><description>&lt;p>As a leading Open Source GIS company, Kartoza aims to introduce people and organisations to the world of Open Source GIS in South Africa. The majority of educational institutions in South Africa still teach students GIS and Remote Sensing using proprietary software. During the last few years, there has been a steady increase in institutions migrating to using Open Source GIS systems.&lt;/p>
&lt;p>Kartoza is always on the lookout for young and talented students to enroll them in our vacation work or internship program with a possibility of employment. The following story is the experience from our most recent intern, Natalia Dambe, a Master&amp;rsquo;s Student at the University of Cape Town. In her words:&lt;/p></description></item><item><title>An Intern's Perspective on Her Working Experience at Kartoza During the Summer Vacation</title><link>https://kartoza.github.io/kartoza-website/blog/an-interns-perspective-on-her-working-experience-at-kartoza-during-the-summer-vacation/</link><pubDate>Mon, 05 Feb 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/an-interns-perspective-on-her-working-experience-at-kartoza-during-the-summer-vacation/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">An Intern&amp;#39;s Perspective on Her Working Experience at Kartoza&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Education&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="8a8d55f9d0a01c40" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="8a8d55f9d0a01c40" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
Kartoza, a Free and Open Source GIS organisation in South Africa, actively recruits talented students for internship and vacation work programs.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Kartoza, a Free and Open Source GIS organisation in South Africa, actively recruits talented students for internship and vacation work programs. The company aims to promote open-source geospatial solutions in regions where proprietary software dominates educational institutions.&lt;/p></description></item><item><title>A New Plugin to Manage Land (survey) Parcels in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/a-new-plugin-to-manage-land-survey-parcels-in-qgis/</link><pubDate>Fri, 02 Feb 2018 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/a-new-plugin-to-manage-land-survey-parcels-in-qgis/</guid><description>&lt;h4 id="kartoza-releases-the-cogo-plugin-for-qgis">Kartoza releases the CoGo Plugin for QGIS&lt;/h4>
&lt;p>Kartoza recently published the CoGo Plugin (aka Parcel Plugin) in the QGIS plugin repository. This plugin expands the group of plugins designed to manage SDI (Spatial Data Infrastructure). CoGo (&amp;lsquo;coordinate geometry&amp;rsquo;) refers to its ability to handle both types of coordinates used in land surveying, namely cartesian coordinates (x,y; long/lat) and polar coordinates (bearing and distance).&lt;/p>
&lt;p>Kartoza began development of the plugin in 2012 as part of a project commissioned by &lt;a
href="http://spatialmatrix.com/"
target="_blank"
rel="noopener"
>Spatial Matrix&lt;/a> to facilitate the digitising of cadastral property records in Ogun State, Nigeria, where it was (and still is) successfully used in production. In 2016 the plugin was updated by Kartoza and deployed in Niger state, again by Spatial Matrix. In production use, it also helped identify surveying problems eg. land parcels that are overlapping and gaps between land parcels.&lt;/p></description></item><item><title>Changing the Line Direction of Line Features Using the Geometry Generator in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/changing-the-line-direction-of-line-features-using-the-geometry-generator-in-qgis/</link><pubDate>Tue, 17 Oct 2017 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/changing-the-line-direction-of-line-features-using-the-geometry-generator-in-qgis/</guid><description>&lt;p>I have been playing around with roads layers and wanted to change the line directions for some of my features. I looked around for solutions to do this in QGIS and saw that I could use the swap vector direction plugin in QGIS or ST_reverse in PostgreSQL. But I wanted to find a non destructive way to do this as I did not want to alter my data. I decided to try the geometry generator in QGIS.&lt;/p></description></item><item><title>How to Resolve Issues with QGIS 3 Processing Dialog Layouts on MacOS</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-resolve-issues-with-qgis-3-processing-dialog-layouts-on-macos/</link><pubDate>Sat, 07 Oct 2017 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-resolve-issues-with-qgis-3-processing-dialog-layouts-on-macos/</guid><description>&lt;p>If you are using QGIS 3 master builds on MacOS and encounter issues with the display of processing dialog layouts like this:&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/screen_shot_2017-10-06_at_23.49.39.png" alt="">&lt;/p>
&lt;p>The problem is caused by the custom designer widgets python module for QGIS. To fix it you should rename or remove this file&lt;/p>
&lt;p>&lt;code>mv /usr/local/lib/python3.6/site-packages/PyQt5/uic/widget-plugins/qgis_customwidgets.py \&lt;/code>&lt;/p>
&lt;p>&lt;code>/usr/local/lib/python3.6/site-packages/PyQt5/uic/widget-plugins/qgis_customwidgets.py_&lt;/code>&lt;/p>
&lt;p>The actual location of this file may vary depending on your system. After removing the file, restart QGIS and you should see the dialog layout restored again:&lt;/p></description></item><item><title>Create a Custom Reference Grid in QGIS Composer</title><link>https://kartoza.github.io/kartoza-website/blog/create-a-custom-reference-grid-in-qgis-composer/</link><pubDate>Thu, 05 Oct 2017 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/create-a-custom-reference-grid-in-qgis-composer/</guid><description>&lt;p>If you need to create a reference grid like this for your map, here&amp;rsquo;s a simple method.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/j06Zzei.png" alt="">&lt;/p>
&lt;p>Create one grid to show the lines with intervals in cm. The CRS setting has no effect.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/VQNoK9E.png" alt="">&lt;/p>
&lt;p>Create another grid to show the labels in the centre of the visible grid cells. Again, the CRS setting has no effect. Note the offset is set to half the interval and we don&amp;rsquo;t draw the lines.&lt;/p></description></item><item><title>Kartoza at GeoNode Summit 2016</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-at-geonode-summit-2016/</link><pubDate>Wed, 30 Nov 2016 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-at-geonode-summit-2016/</guid><description>&lt;p>Four of the Kartoza team (Tim, Etienne, Ismail and Rizky) attended the GeoNode Summit in Rome held in November 2016. The World Food Programme provided the venue for the event and our attendance was funded by the WorldBank/GFDRR. The event was a really great opportunity to interact with the GeoNode community. We used the opportunity to learn about the upcoming plans for GeoNode and discuss some of our own plans.&lt;/p></description></item><item><title>Introducing the First Tangible Landscape in Africa</title><link>https://kartoza.github.io/kartoza-website/blog/introducing-the-first-tangible-landscape-in-africa/</link><pubDate>Wed, 12 Oct 2016 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/introducing-the-first-tangible-landscape-in-africa/</guid><description>&lt;p>As part of Kartoza&amp;rsquo;s outreach programme, I recently helped the geography department at St Johns College in Johannesburg set up a &lt;a
href="https://geospatial.ncsu.edu/osgeorel/tangible-landscape.html"
target="_blank"
rel="noopener"
>Tangible Landscape&lt;/a>, which to my knowledge is the first in Africa and possibly the first in a secondary school (most are at universities). I&amp;rsquo;ve been fascinated by these ever since I saw videos of them in action. So, when Samantha Jones and the rest of the St Johns geography department (Bridget Fleming-HOD, Brandon Louw and Keith Arlow), expressed a wish to have one in the department, Sam&amp;rsquo;s husband, Matt, went ahead and built a frame. That was all the motivation I needed. Peter Henning, the IT Manager at St Johns, gathered an old i5 PC with 4GB RAM (running Ubuntu Linux) and some old monitors and a projector and ordered a Microsoft Xbox Kinect. While Peter and Matt set up the infrastructure I set up up the software, mainly consisting of the Open Source GRASS GIS and the module that takes the point clouds coming in from the Kinect and converts them to raster digital elevation models (DEMs).&lt;/p></description></item><item><title>Mass reprojection of h5 Files using Gdal and Bash Tricks</title><link>https://kartoza.github.io/kartoza-website/blog/mass-reprojection-of-h5-files-using-gdal-and-bash-tricks/</link><pubDate>Fri, 08 Jul 2016 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mass-reprojection-of-h5-files-using-gdal-and-bash-tricks/</guid><description>&lt;p>I recently got hold of h5 files (Hierarchical Data Format (HDF)) and I tried to load them into QGIS and they were drawing in the wrong places.This was because they were not georeferenced. I set out to georeference them using GDAL. Since I was dealing with many h5 files I searched for an automated way to georeference them and could not find one complete solution hence I decided to do it myself with the help of Tim Sutton.&lt;/p></description></item><item><title>Report Back on the First QGIS User Conference in Nødebo, Denmark</title><link>https://kartoza.github.io/kartoza-website/blog/report-back-on-the-first-qgis-user-conference-in-n-debo-denmark/</link><pubDate>Sun, 31 May 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/report-back-on-the-first-qgis-user-conference-in-n-debo-denmark/</guid><description>&lt;p>I finally have some time to sit down and write up some thoughts on the QGIS User Conference and Developer Meeting (aka Hackfest) that we just held in Nødebo, Denmark. First up I need to thank Lene Fischer, who was the organiser and wowed us all with her relaxed and competent organisational approach to the conference. Thanks also to the University of Copenhagen School of Forestry - they sponsored the event by providing the venue and accommodation - and the venue was absolutely awesome with little cottages in the forest and all sorts of interesting diversions scattered around the forest.&lt;/p></description></item><item><title>Report Back on the First QGIS User Conference in Nødebo, Denmark</title><link>https://kartoza.github.io/kartoza-website/blog/report-back-on-the-first-qgis-user-conference-in-nodebo-denmark/</link><pubDate>Sun, 31 May 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/report-back-on-the-first-qgis-user-conference-in-nodebo-denmark/</guid><description>&lt;section class="section">
&lt;div class="container notification is-primary "
>
&lt;div class="columns is-multiline is-gapless">
&lt;div class="column is-12">
&lt;div class="columns is-multiline">
&lt;div class="column has-text-left is-12 is-vcentered notification is-primary is-flex"
>
&lt;h1 class="title is-2 is-uppercase">Report Back on the First QGIS User Conference in Nødebo, Denmark&lt;/h1>
&lt;/div>
&lt;div class="column is-vcentered is-min-height is-8 is-flex">
&lt;div class="container has-text-left">
&lt;h2 class="subtitle is-4">Education&lt;/h2>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="column is-12">
&lt;div class="container box is-transparent has-ribbon has-second-ribbon has-second-ribbon-left">
&lt;div data-contentid="0f7fd3ec5e0546b4" class="ribbon is-medium is-primary pulldown-toggle is-clickable">
&lt;span class="icon">
&lt;i class="fas fa-angle-down" aria-hidden="true">&lt;/i>
&lt;/span>
&lt;/div>
&lt;div id="0f7fd3ec5e0546b4" class="box is-transparent content py-2 pt-6 notification is-hidden is-primary">
A comprehensive overview of the inaugural QGIS User Conference and Developer Meeting held in Nødebo, Denmark.
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;h2 id="content">Content&lt;/h2>
&lt;p>The author provides a comprehensive overview of the inaugural QGIS User Conference and Developer Meeting held in Nødebo, Denmark. He opens by extending gratitude to organiser Lene Fischer and the University of Copenhagen School of Forestry for hosting the event at their forest venue.&lt;/p></description></item><item><title>How to Run a Linux GUI Application on OSX Using Docker</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-run-a-linux-gui-application-on-osx-using-docker/</link><pubDate>Wed, 13 May 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-run-a-linux-gui-application-on-osx-using-docker/</guid><description>&lt;p>Ok so here is the scenario:&lt;/p>
&lt;blockquote>
&lt;p>You just got a nice new MacBook 15&amp;quot; Retina computer thinking it would work as nicely for Linux as your 13&amp;quot; MacBook did and then you discover that the hybrid Intel/Nvidia card support in Linux is a show stopper and the WebCam does not work under Linux.&lt;/p>
&lt;/blockquote>
&lt;p>Well that is what happened to me, so I decided to give working with OSX a try on this laptop with the help of docker for running all those essential apps that I use for development. One thing I was curious about was whether it would be possible to run native GUI (X11) applications from inside docker and have them show up on my OSX desktop. I turns out that it is fairly easy to do this - here is what I did:&lt;/p></description></item><item><title>7 tips for Making Productive use of Docker</title><link>https://kartoza.github.io/kartoza-website/blog/7-tips-for-making-productive-use-of-docker/</link><pubDate>Wed, 01 Apr 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/7-tips-for-making-productive-use-of-docker/</guid><description>&lt;p>I have been using and learning &lt;a
href="https://www.docker.com/"
target="_blank"
rel="noopener"
>docker&lt;/a> since the early days after it was announced. I really love using docker but there are some things I just wish I had cottoned onto at the start. Here are my top 7 tips to help new users to docker avoid making the same mistakes I did.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/aWe0OuE.jpg" alt="">&lt;/p>
&lt;ol>
&lt;li>​Docker is great when you want to densely pack many isolated services onto each server. If you prefer to take the approach of e.g. deploying many microservers (e.g. AWS micro instances) you might be better off looking at using a configuration management tool like ansible.​ Although even then docker still has some advantages as it is nice to be able to just check out an image onto a micro instance and spin it up knowing everything will &amp;lsquo;just work&amp;rsquo;.&lt;/li>
&lt;li>If you go with docker really avoid the temptation of treating docker containers like virtual machines. Even though you can run multiple services in each container (e.g. using supervisord) you should really architect your docker images so that they are virtual application appliances, with each appliance doing one thing only (like the old unix mantra eh?). So have a discrete appliance for postgis, another for uwsgi, another for mapserver, another for geoserver etc. rather than mixing things into the same service.&lt;/li>
&lt;li>You should do everything you can to make your containers stateless. Or put differently, you should be able to confidently destroy and redeploy a container as a fresh instance with no loss of data or configuration. This means that your investment should be in building the images on which your containers are based and not the containers themselves. In practice this means that you should e.g. mount your postgres cluster from a host volume, store your user uploaded files in a host volume and store no generated data inside the container itself.&lt;/li>
&lt;li>You should avoid the temptation to build your own container orchestration tools. Rather use a tool like fig (now part of docker as &amp;lsquo;docker compose&amp;rsquo;) that uses a simple yaml file to define your micro services architecture and can be used to reliably spin up a working configuration. I combine that with some simple makefiles because I am too lazy to remember the commands needed to administer the orchestrated application using fig.&lt;/li>
&lt;li>Lean how to publish your images into &lt;a
href="http://hub.docker.com/"
target="_blank"
rel="noopener"
>hub.docker.com&lt;/a> and have them build on push to your repo and build when the upstream container your docker image is based on gets an update (e.g. a security fix). Also invest the time in learning to tag different versions in hub so that you can have a known good working configuration against specific image versions.&lt;/li>
&lt;li>Build up your images in layers. Start with a standard base image e.g. &amp;lsquo;ubuntu:trusty&amp;rsquo; then add python and save that as a new standard image, then add django and save that as a new base image etc. This way each virtual application you create is defined by only the thinnest amount of configuration and software deployment possible, and you can share the underlying logic of the lower layers between as many images as possible.&lt;/li>
&lt;li>My last piece of advice is that when you are building services that need to span multiple nodes, you need to plan your architecture carefully - docker does not yet have great built in multi-host networking so you may want to look at using a virtual switch, socat, a third party tool like pipeworks (if I remember the name properly) etc. Or better yet define your architecture so that hosts can operate independently of each other as much as possible.&lt;/li>
&lt;/ol>
&lt;p>I should mention that I have pretty much broken all these mantras during my journey into docker and am still paying the price. However, when you do get things working nicely, it is incredibly cool being able to log into a machine, check out your repo and type &amp;lsquo;fig up -d&amp;rsquo; and seeing your application build and deploy itself.&lt;/p></description></item><item><title>Generating an XYZ ASCII File from a QGIS Raster</title><link>https://kartoza.github.io/kartoza-website/blog/generating-an-xyz-ascii-file-from-a-qgis-raster/</link><pubDate>Sun, 08 Mar 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/generating-an-xyz-ascii-file-from-a-qgis-raster/</guid><description>&lt;p>Someone wrote to me asking if it would be possible to generate an&lt;a
href="http://www.gdal.org/frmt_xyz.html"
target="_blank"
rel="noopener"
>XYZ ASCII&lt;/a> file from a single band raster layer in QGIS. No doubt there are more efficient ways (this approach is pretty slow but it works), but I thought it would be fun to show how you can iterate over a raster, writing out the value of each cell into a text file (along with the centroid coordinates for that cell).&lt;/p></description></item><item><title>How To Create a QGIS PDF Report with a Few Lines Of Python</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-create-a-qgis-pdf-report-with-a-few-lines-of-python/</link><pubDate>Sun, 01 Mar 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-create-a-qgis-pdf-report-with-a-few-lines-of-python/</guid><description>&lt;p>Sometimes you want to automatically generate a report to reflect the latest state of your data. For example you may be capturing spatial data into a PostGIS database and want a snapshot of that every few hours expressed as a pdf report. This example shows you how you can quickly generate a pdf based on a QGIS project (.qgs file) and a QGIS template (.qpt file).&lt;/p>
&lt;pre>&lt;code># coding=utf-8
# A simple demonstration of to generate a PDF using a QGIS project
# and a QGIS layout template.
#
# This code is public domain, use if for any purpose you see fit.
# Tim Sutton 2015
import sys
from qgis.core import (
   QgsProject, QgsComposition, QgsApplication, QgsProviderRegistry)
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge
from PyQt4.QtCore import QFileInfo
from PyQt4.QtXml import QDomDocument
gui_flag = True
app = QgsApplication(sys.argv, gui_flag)
# Make sure QGIS_PREFIX_PATH is set in your env if needed!
app.initQgis()
# Probably you want to tweak this
project_path = 'project.qgs'
# and this
template_path = 'template.qpt'
def make_pdf():
   canvas = QgsMapCanvas()
   # Load our project
   QgsProject.instance().read(QFileInfo(project_path))
   bridge = QgsLayerTreeMapCanvasBridge(
       QgsProject.instance().layerTreeRoot(), canvas)
   bridge.setCanvasLayers()
   template_file = file(template_path)
   template_content = template_file.read()
   template_file.close()
   document = QDomDocument()
   document.setContent(template_content)
   composition = QgsComposition(canvas.mapSettings())
   # You can use this to replace any string like this [key]
   # in the template with a new value. e.g. to replace
   # [date] pass a map like this {'date': '1 Jan 2012'}
   substitution_map = {
       'DATE_TIME_START': 'foo',
       'DATE_TIME_END': 'bar'}
   composition.loadFromTemplate(document, substitution_map)
   # You must set the id in the template
   map_item = composition.getComposerItemById('map')
   map_item.setMapCanvas(canvas)
   map_item.zoomToExtent(canvas.extent())
   # You must set the id in the template
   legend_item = composition.getComposerItemById('legend')
   legend_item.updateLegend()
   composition.refreshItems()
   composition.exportAsPDF('report.pdf')
   QgsProject.instance().clear()
make_pdf()
&lt;/code>&lt;/pre>
&lt;p>(See &lt;a
href="https://kartoza.com/en/admin/blog/blogpost/106/%5c%28see%20https://gist.github.com/timlinux/486793ad61db4c1dec9d%20for%20the%20latest"
target="_blank"
rel="noopener"
>here&lt;/a> for any updates we may publish for this example)&lt;/p></description></item><item><title>QGIS Course at AfQUA</title><link>https://kartoza.github.io/kartoza-website/blog/qgis-course-at-afqua/</link><pubDate>Sun, 08 Feb 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/qgis-course-at-afqua/</guid><description>&lt;p>Kartoza has just wrapped up a three-day Introduction to QGIS course that we gave &lt;em>pro bono&lt;/em> at The African Quaternary: Environments, Ecology and Humans conference in Cape Town (&lt;a
href="http://afqua2015.com/workshops/"
target="_blank"
rel="noopener"
>AfQUA2015&lt;/a>). Thank you to Kelly Kirsten from the local organising committee at the University of Cape Town for inviting us. Admire Nyakudya presented to about fifteen conference delegates from around the world. Attendees ran QGIS 2.6.1 on their own notebooks on the operating system of their choice.&lt;/p></description></item><item><title>How to Load a QGIS Project in Python</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-load-a-qgis-project-in-python/</link><pubDate>Wed, 21 Jan 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-load-a-qgis-project-in-python/</guid><description>&lt;p>Today in a project we are working on we wanted to load a QGIS project. It takes surprisingly few lines of code to make a small standalone application that loads a project and then shows it as a map in a window like this:&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/GC13lSo.png" alt="">&lt;/p>
&lt;p>Here is the code I wrote to produce this:&lt;/p>
&lt;p>The main bit of magic is the QgsLayerTreeMapCanvasBridge class which will convert your project into a layer tree so that the layers appear in the canvas. If you ever need to make a standalone python application with a nice map in it, consider using the QGIS API to do it!&lt;/p></description></item><item><title>A Quick Hack to Select All Multipart Features in QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/a-quick-hack-to-select-all-multipart-features-in-qgis/</link><pubDate>Tue, 13 Jan 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/a-quick-hack-to-select-all-multipart-features-in-qgis/</guid><description>&lt;p>Today we wanted to find all the multipart features in this layer:&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/onkgHjg.png" alt="">&lt;/p>
&lt;p>Here is a quick hack I did in QGIS to find them:&lt;/p>
&lt;p>Just make sure that a vector layer is active in the layer list, paste the above code into the python console and all multipart features will be highlighted for you.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/o445ZEN.png" alt="">&lt;/p></description></item><item><title>Kartoza Docker-helpers for Lazy Sysadmins</title><link>https://kartoza.github.io/kartoza-website/blog/kartoza-docker-helpers-for-lazy-sysadmins/</link><pubDate>Wed, 07 Jan 2015 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/kartoza-docker-helpers-for-lazy-sysadmins/</guid><description>&lt;p>Docker is really awesome but typing out all those commands can get tedious. I wanted to quickly share a small project on github I made some time back that tries to make your life easier when working with docker. The project is called &lt;a
href="https://github.com/kartoza/docker-helpers"
target="_blank"
rel="noopener"
>docker-helpers&lt;/a>. It is a collection of bash scripts that give you short cuts to various &amp;rsquo;every day&amp;rsquo; docker commands. Here is a quick listing of the different commands:&lt;/p></description></item><item><title>Orchestrating GeoServer with Docker and Fig</title><link>https://kartoza.github.io/kartoza-website/blog/orchestrating-geoserver-with-docker-and-fig/</link><pubDate>Sat, 27 Dec 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/orchestrating-geoserver-with-docker-and-fig/</guid><description>&lt;p>In this article I will detail how to set up a simple orchestrated system of docker containers using:&lt;/p>
&lt;ol>
&lt;li>PostGIS&lt;/li>
&lt;li>GeoServer&lt;/li>
&lt;li>Docker&lt;/li>
&lt;li>Fig&lt;/li>
&lt;/ol>
&lt;p>We assume that you already have a working knowledge of GeoServer and PostGIS in this article. Docker is a tool that allows you to run applications in containers which are isolated from the host system. One of the great things about docker is that you can publish pre-made recipes for applications in their central repository. At &lt;a
href="http://kartoza.com/"
target="_blank"
rel="noopener"
>Kartoza.com&lt;/a> we publish a number of docker containers on at &lt;strong>&lt;a
href="https://registry.hub.docker.com/repos/kartoza/"
target="_blank"
rel="noopener"
>https://registry.hub.docker.com/repos/kartoza/&lt;/a>****.&lt;/strong>&lt;/p></description></item><item><title>Setting up a Fedora 21 QGIS Workstation</title><link>https://kartoza.github.io/kartoza-website/blog/setting-up-a-fedora-21-qgis-workstation/</link><pubDate>Wed, 24 Dec 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/setting-up-a-fedora-21-qgis-workstation/</guid><description>&lt;p>I have been a long time Ubuntu user (I have actually been using it since Ubuntu 4.10 &amp;lsquo;Warty Warthog&amp;rsquo;) - the first official release. The advent of Ubuntu saw an end to my distro hopping whilst looking for the &amp;lsquo;perfect linux distro&amp;rsquo;.&lt;/p>
&lt;p>Recently though, Ubuntu has been losing momentum in my opinion - especially in terms of supporting the latest Gnome desktop editions and catering for those of us who like to use a leading edge platform for our developer workstations. I was particularly curious to see if QGIS runs nicely under Wayland, the next-generation graphics environment for Linux.&lt;/p></description></item><item><title>Gary Sherman Wins the Sol Katz Award</title><link>https://kartoza.github.io/kartoza-website/blog/gary-sherman-wins-the-sol-katz-award/</link><pubDate>Fri, 12 Sep 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/gary-sherman-wins-the-sol-katz-award/</guid><description>&lt;p>This year &lt;a
href="https://geoapt.net/"
title="GeoApt home page"
target="_blank"
rel="noopener"
>Gary Sherman&lt;/a> won the annual &lt;a
href="http://www.osgeo.org/solkatz"
title="Sol Katz Award page"
target="_blank"
rel="noopener"
>Sol Katz&lt;/a> award. To quote the OSGEO page about the award:&lt;/p>
&lt;blockquote>
&lt;p>The Sol Katz Award for Geospatial Free and Open Source Software (GFOSS) is awarded annually by OSGeo to individuals who have demonstrated leadership in the GFOSS community. Recipients of the award will have contributed significantly through their activities to advance open source ideals in the geospatial realm. The hope is that the award will both acknowledge the work of community members, and pay tribute to one of its founders, for years to come.&lt;/p></description></item><item><title>WMS Legend Plugin for Leaflet</title><link>https://kartoza.github.io/kartoza-website/blog/wms-legend-plugin-for-leaflet/</link><pubDate>Tue, 26 Aug 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/wms-legend-plugin-for-leaflet/</guid><description>&lt;p>This weekend I was updating our map gallery at &lt;a
href="http://maps.kartoza.com"
target="_blank"
rel="noopener"
>http://maps.kartoza.com&lt;/a> and I wanted to have WMS legends in my maps. The maps are mostly generated using QGIS server which also produces a nice looking graphic for its getLegendGraphic requests. Since Leaflet does not seem have a legend control out of the box, I wrote a small leaflet plugin to do it.&lt;/p>
&lt;p>&lt;img src="https://kartoza.github.io/kartoza-website/img/blog/erpnext/uB3CjmJ.png" alt="">&lt;/p>
&lt;p>In the future I may extend the control to automatically fetch getLegendGraphics from all loaded WMS layers, but for now it simply takes a complete legend graphic URI as parameter.&lt;/p></description></item><item><title>Nodeenv: How to Install Nodejs in a Python Virtualenv</title><link>https://kartoza.github.io/kartoza-website/blog/nodeenv-how-to-install-nodejs-in-a-python-virtualenv/</link><pubDate>Sun, 24 Aug 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/nodeenv-how-to-install-nodejs-in-a-python-virtualenv/</guid><description>&lt;p>Here at Kartoza, working in python virtual environments is our default modus operandi when embarking on any python development. For some time we have been enjoying &lt;a
href="https://github.com/yui/yuglify"
title="Yuglify home page"
target="_blank"
rel="noopener"
>yuglify&lt;/a>, &lt;a
href="https://www.mapbox.com/tilemill/"
title="Tilemill Home Page"
target="_blank"
rel="noopener"
>tilemill&lt;/a> and other &lt;a
href="http://nodejs.org/"
title="NodeJS Home Page"
target="_blank"
rel="noopener"
>node.js&lt;/a> based applications as part of our workflow, and early on in my use of these technologies I discovered &lt;a
href="https://github.com/ekalinin/nodeenv"
title="Node Env Repo"
target="_blank"
rel="noopener"
>nodeenv&lt;/a> - mainly because I had been bitten on the ass by different node applications on the same host expecting to have different versions of node.js. Nodeenv provides a python virtualenv like environment for sandboxing your node applications so that each can run under its own discrete version of node.js. It operates very much like python virtualenv does and in fact it requires virtualenv so for pythonistas it is a very good fit! In this article I document the steps needed to get node running under such an environment.&lt;/p></description></item><item><title>Playing with Foreign Data Wrappers in PostgreSQL</title><link>https://kartoza.github.io/kartoza-website/blog/playing-with-foreign-data-wrappers-in-postgresql/</link><pubDate>Sat, 16 Aug 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/playing-with-foreign-data-wrappers-in-postgresql/</guid><description>&lt;p>Recently I set out to try out the PostgreSQL &lt;a
href="https://wiki.postgresql.org/wiki/Foreign_data_wrappers"
target="_blank"
rel="noopener"
>foreign data wrapper &lt;/a>(FDW) because I needed access to data that was in MySQL tables. The main reason I needed to play around was to expose my data to a range of PostgreSQL functions that are better and more recent that MySQL. I also needed to use MySQL data for views and lookups and data-driven styling for some Geoserver layers. FDWs allow remote access to tables or queries from various external third-party databases or file structures.&lt;/p></description></item><item><title>MyCOE GCE TechCamp</title><link>https://kartoza.github.io/kartoza-website/blog/mycoe-gce-techcamp/</link><pubDate>Sun, 03 Aug 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/mycoe-gce-techcamp/</guid><description>&lt;p>The AAG (American Association of Geographers) and US State Department, through &lt;a
href="http://eis-africa.org"
target="_blank"
rel="noopener"
>EIS Africa&lt;/a>, ran the South Africa edition of the &lt;a
href="http://www.aag.org/cs/techcamps/overview"
target="_blank"
rel="noopener"
>GCE MyCOE Youth TechCamp&lt;/a> from 13-23 July 2014. Kartoza and its former incarnation Afrispatial, were brought on board to lead the technical and educational aspects of the TechCamp. The TechCamp was ten days of cultural exchange coupled with hands-on GIS learning around a theme of climate change. The main goal of the programme was to stimulate the role of Geography in the students and to teach how new technologies are advancing the use of Geography in the real world to solve problems.&lt;/p></description></item><item><title>How to Quickly Transform a Bounding Box from One CRS to Another Using QGIS</title><link>https://kartoza.github.io/kartoza-website/blog/how-to-quickly-transform-a-bounding-box-from-one-crs-to-another-using-qgis/</link><pubDate>Thu, 24 Jul 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/how-to-quickly-transform-a-bounding-box-from-one-crs-to-another-using-qgis/</guid><description>&lt;p>Today I needed to convert a bounding box for a &lt;a
href="https://www.mapbox.com/tilemill/"
target="_blank"
rel="noopener"
>tilemill&lt;/a> project that I want to bring into &lt;a
href="http://qgis.org"
target="_blank"
rel="noopener"
>QGIS&lt;/a> as a tile layer (more on that in a future post if I get it to work&amp;hellip;). I needed to convert a bounding box from EPSG:4326 (&amp;lsquo;Geographic&amp;rsquo;) coordinates to EPSG:3857 (Spherical Mercator). Fortunately it is a fairly trivial process if you don&amp;rsquo;t mind writing a few lines of python in the QGIS python console:&lt;/p></description></item><item><title>Running QGIS Desktop in a Docker Container</title><link>https://kartoza.github.io/kartoza-website/blog/running-qgis-desktop-in-a-docker-container/</link><pubDate>Wed, 16 Jul 2014 00:00:00 +0000</pubDate><guid>https://kartoza.github.io/kartoza-website/blog/running-qgis-desktop-in-a-docker-container/</guid><description>&lt;p>I love using &lt;a
href="http://docker.io/"
target="_blank"
rel="noopener"
>docker&lt;/a> - I have been tracking and learning docker since soon after it was announced and believe it is going to be a real game changer. I&amp;rsquo;ve been playing around with the different things one can do in a docker container and of course it is only natural that a &amp;lsquo;QGIS guy&amp;rsquo; such as myself would start to think about using docker with QGIS. QGIS server in a docker container seems like a natural fit, but how about QGIS Desktop? Last night &lt;a
href="http://zuidt.nl"
target="_blank"
rel="noopener"
>Richard Duivenvoorde&lt;/a> and I were sitting around drinking tea and we thought we would give it a quick go - in fact it only took about half an hour to get something working&amp;hellip;.&lt;/p></description></item></channel></rss>