Welcome to Planet OSGeo

October 20, 2026

In water resources administration, the difference between reactive management and sustainable governance lies in data quality, process efficiency, territorial vision, and technological autonomy. With the launch of our new dedicated website at sirh.icarto.es, we want to highlight the main reasons why river basin authorities choose the Water Resources Information System (SIRH) by iCarto.

1. GIS Power and a Geospatial “Single Source of Truth”

Many public institutions suffer from scattered data stored in physical files, paper registries, and disconnected spreadsheets across departments. SIRH stems from the integration of administrative management and Geographic Information Systems (GIS). It centralizes water administration into a single geospatial database, enabling authorities to locate, analyze, and query abstraction points, discharges, distribution networks, agricultural plots, and administrative boundaries on interactive maps within a unified operational environment.

2. Technological Sovereignty and 100% Open Source Philosophy

Governing a strategic resource like water should not entail vendor lock-in or prohibitive recurring software licensing fees. With SIRH, 100% of code and data ownership remains strictly with the institution. This means zero recurring license costs and total freedom to scale the number of users, servers, or regional offices without financial penalties, all built on open standards and leading open-source GIS technologies.

3. Complete Lifecycle Coverage: From Permitting to Revenue Collection

SIRH connects spatial insights with every administrative stage necessary to ensure the operational and financial sustainability of river basins. It enables automated workflows and transparent tracking for application status, renewals, and official permit issuance, combined with automated consumption estimates based on institutional and spatial parameters. Furthermore, it professionalizes revenue collection through batch invoicing and payment tracking by geographic zones or basins.

4. A Methodology Focused on Real-World Adoption

Most technology projects in the public sector fail not because of code, but due to a lack of day-to-day user adoption. At iCarto, we do not deliver off-the-shelf or rigid software: we configure the platform alongside technical teams through collaborative co-design and dedicate 40% to 50% of total project effort to hands-on workshops and capacity building. Our three-phase roadmap (Registry & Mapping, Procedures, and Billing) ensures a gradual rollout tailored to local institutional and territorial realities.

5. Scalable Ecosystem Built for Field and User Engagement

Once the core registry and billing foundation is consolidated, SIRH expands through advanced modules. SIRH Mobile, a field inspection tool leveraging GPS positioning for paperless data collection synchronized with the central database, and the Digital Customer Portal, a web environment where water users can transparently check permit statuses, submit online applications, and review billing statements.

6. Proven Track Record and Documented Impact

SIRH brings 10 years of experience enhancing spatial management for water concessions and users. Its effectiveness is proven through consolidated national and regional deployments across 2 countries (Mozambique since 2018 and Eswatini since 2024), supporting 5 water authorities. Today, SIRH manages over 5,000 georeferenced licenses, 4,000+ registered water users, and 100+ active institutional users.

Explore All the Details on Our New Website!

We invite you to explore SIRH’s modular architecture, view GIS map interface previews, and learn more about our ongoing projects at https://sirh.icarto.es.


La entrada Why Choose SIRH for Integrated Water Resources Management? se publicó primero en iCarto.

by iCarto at October 20, 2026 08:06 AM

October 19, 2026

Prezados leitores,

Sempre que preciso instalar uma nova instância do GeoNode, sigo os procedimentos que já compartilhei aqui no blog:

– Instalação do GeoNode 5 no Ubuntu 24.04
– Instalação do Certificado SSL no GeoNode

O passo a passo ajuda bastante, mas, a cada instalação, lá estava eu novamente: preparando o servidor, instalando dependências, criando o projeto, ajustando configurações e habilitando o HTTPS.

Ao preparar um ambiente para mais um curso, pensei: por que não automatizar esse processo?

A ideia foi transformar essa sequência em um instalador reutilizável. Agora, basta preencher um arquivo de configuração e executar um comando para iniciar a instalação.

Testei o procedimento em uma máquina nova, utilizando o GeoNode 5.1.0, e o resultado foi a aplicação funcionando com HTTPS habilitado.

Vamos ver como utilizar!

1. O que o instalador faz?

O instalador utiliza o projeto Docker oficial do GeoNode e automatiza as principais etapas de preparação do ambiente:

  • Instala as dependências do sistema, o Docker e o plugin Docker Compose.
  • Cria um usuário dedicado para os arquivos do projeto.
  • Obtém a versão selecionada do geonode-project.
  • Gera a estrutura da aplicação e o .env do GeoNode.
  • Cria senhas aleatórias para os serviços.
  • Configura as URLs de acesso e a emissão do certificado HTTPS.
  • Aplica ajustes iniciais de memória e quantidade de processos.
  • Constrói as imagens e inicia os containers.
  • Verifica a resposta da aplicação, o certificado e o estado dos principais serviços.

O pacote contém um script de entrada em Bash, o instalador em Python, um arquivo de parâmetros e as instruções de uso.

2. Antes de começar

Esta versão foi preparada para uma máquina nova com Ubuntu 24.04, arquitetura x86_64 e aproximadamente 16 GB de RAM.

Para instalar com HTTPS, você também precisará de:

  • Um domínio ou subdomínio apontando para o IP público do servidor.
  • Portas TCP 80 e 443 liberadas.
  • Acesso administrativo por SSH.
  • Conexão com a internet para baixar os pacotes e as imagens.

O instalador prepara o software dentro da máquina. A criação do servidor, os registros de DNS e a liberação das portas devem ser feitos previamente.

Utilize uma máquina nova, sem outra aplicação ocupando as mesmas portas.

3. Baixe e descompacte o pacote

Baixe o arquivo geonode-installer-0.1.2.zip, disponibilizado junto a este post, e transfira-o para o servidor. Em seguida:

unzip geonode-installer-0.1.2.zip
cd geonode-installer-0.1.2

4. Configure a instalação

Abra o arquivo de parâmetros:

nano geonode-install.env

Ele contém as seguintes opções:

GEONODE_PROJECT_REF=5.1.0
GEONODE_VERSION=5.1.0
DJANGO_BOOTSTRAP_VERSION=5.2

SYSTEM_USER=geonode
PROJECT_NAME=curso_geonode
INSTALL_DIR=/opt/geonode/curso_geonode

HOSTNAME=geonode.seudominio.com.br
ENABLE_HTTPS=true
LETSENCRYPT_EMAIL=contato@seudominio.com.br
SERVER_IPV4=

GEOSERVER_XMS=2G
GEOSERVER_XMX=4G
UWSGI_PROCESSES=4
CELERY_WORKERS=2
WAIT_SECONDS=1800

Para uma instalação semelhante à deste exemplo, os principais campos a alterar são:

Parâmetro O que informar
HOSTNAME Domínio ou subdomínio, sem https://
e sem barra no final.
LETSENCRYPT_EMAIL Seu endereço de e-mail.
SERVER_IPV4 Opcional: IP público da VM para conferir sua
presença na resolução DNS.
PROJECT_NAME Nome do projeto, usando letras minúsculas,
números e underscore (_).
INSTALL_DIR Diretório da instalação dentro de /opt.
SYSTEM_USER Usuário que será criado para os arquivos do projeto.

Atenção à versão do Django: DJANGO_BOOTSTRAP_VERSION controla apenas o Django utilizado para gerar a estrutura inicial do projeto. A versão que executa dentro dos containers é determinada pelas dependências da aplicação.

Os parâmetros de versão permitem selecionar outras referências, mas isso não garante compatibilidade automática entre todas as combinações. A instalação apresentada neste post foi testada com o GeoNode 5.1.0.

5. Confira a configuração

Antes de instalar, execute:

python3 instalar.py --env geonode-install.env --check

Esse comando valida os parâmetros e consulta a resolução DNS do endereço informado, sem instalar pacotes.

Se você preencher SERVER_IPV4, ele também confere se esse IP aparece na resolução do domínio.

Essa checagem não testa a liberação das portas nem o acesso externo ao servidor.

6. Inicie a instalação

Com os parâmetros preenchidos, execute:

sudo bash instalar-geonode.sh --env geonode-install.env

Pronto! A partir desse ponto, o instalador executa as etapas automaticamente.

A primeira construção das imagens pode demorar, dependendo do processamento da máquina e da velocidade dos downloads. Mantenha a sessão SSH aberta enquanto acompanha a execução.

Embora o comando seja iniciado com sudo, o download do projeto e sua geração são executados com o usuário definido em SYSTEM_USER. As operações administrativas, como instalar pacotes e executar o Docker, continuam sob responsabilidade do root.

O usuário criado não recebe senha habilitada, acesso ao sudo ou inclusão automática no grupo Docker.

7. E o certificado SSL?

Com esta configuração:

ENABLE_HTTPS=true

o instalador gera as URLs HTTPS e habilita o mecanismo de emissão de certificados Let’s Encrypt incluído no projeto Docker.

Assim, não é necessário executar separadamente a instalação do Certbot no host nem copiar manualmente os certificados para o Nginx.

O domínio precisa estar apontando corretamente para o servidor, e a porta 80 deve permanecer acessível para a validação e renovação do certificado. Se houver um registro DNS IPv6, ele também precisa estar correto.

8. Posso instalar em localhost?

Sim! Para usar HTTP localmente, configure:

HOSTNAME=localhost
ENABLE_HTTPS=false
LETSENCRYPT_EMAIL=
SERVER_IPV4=

Nesse caso, a solicitação de certificado fica desativada e o endereço será:

http://localhost/

Os requisitos de sistema operacional e memória desta versão do instalador continuam sendo os mesmos.

Lembre-se de que localhost se refere à própria máquina. Se o GeoNode estiver em uma VM e você quiser acessá-lo de outro computador, configure o endereço pelo qual essa VM será acessada.

9. Como acessar pela primeira vez?

Após a conclusão, abra no navegador o domínio configurado.

O usuário inicial é:

admin

A senha é gerada automaticamente e fica no .env da aplicação. Para consultá-la, considerando o diretório deste exemplo:

sudo awk -F= '/^ADMIN_PASSWORD=/{print $2}' \
  /opt/geonode/curso_geonode/.env

Existem, portanto, dois arquivos com funções diferentes: geonode-install.env contém os parâmetros do instalador; o .env criado no diretório da aplicação contém as configurações e senhas dos serviços. Não compartilhe esse segundo arquivo.

10. Como acompanhar os serviços?

No diretório da instalação, consulte os containers:

cd /opt/geonode/curso_geonode
sudo docker compose ps -a

Para acompanhar o consumo de recursos:

sudo docker stats

E, se precisar investigar algum problema:

sudo docker compose logs --tail=100 \
  django geoserver celery geonode letsencrypt

Se ocorrer uma interrupção, o instalador permite tentar novamente com o mesmo arquivo de parâmetros, preservando o projeto já gerado. Ele não executa atualização automática de versão nem apaga volumes para recomeçar.

11. Do servidor vazio ao GeoNode funcionando

Na instalação que motivou este post, utilizei uma máquina nova e o GeoNode 5.1.0. Ao final, o portal estava acessível pelo navegador com HTTPS funcionando.

Antes de utilizar o ambiente em um curso ou projeto, vale realizar os testes do seu fluxo: carregar camadas, abrir os dados, criar mapas e dashboards e conferir as permissões de acesso.

A automação reduz o trabalho repetitivo de preparar o ambiente. A validação com os dados e as atividades que serão utilizados continua sendo uma etapa importante.

Agora, na próxima instalação, o procedimento será bem mais curto: preencher o arquivo de configuração, executar o comando e acompanhar a criação do ambiente.

Até o próximo post!

by Fernando Quadro at October 19, 2026 08:07 PM

GeoServer 3.0.2 release is now available with downloads (bin, war, windows), along with docs and extensions.

This is a stable release of GeoServer recommended for production use. GeoServer 3.0.2 includes the latest GeoTools 35.2, GeoWebCache 2.0.2, along with mapfish-print-v2 2.5.2 and ImageN 0.9.3. There is a new GeoServer Cloud 3.0.2 release - representing the first time an updated GeoServer Cloud is made available on release day.

Thanks to Jody Garnett (GeoCat) for making this release, Andrea Aime (GeoSolutions) for testing, and Gabriel Roldan (Camptocamp) for the GeoServer Cloud release.

Security Considerations

This release addresses security vulnerabilities and is an important upgrade for production systems. Details about the fixes will be provided at the start of November.

See project security policy for more information on how security vulnerabilities are managed.

OGC API Maps 1.0

The OGC API Maps community module has been aligned with the final OGC API - Maps 1.0.0 standard.

  • Dataset map: Draw several collections into a single map, choosing and ordering them with the collections parameter. The map preview provides a palette to select collections, the first one drawn at the bottom.

    OGC API Maps dataset map preview

  • Filtering: Maps can be filtered using CQL2 Text, CQL2 JSON or ECQL, using the queryable attributes of each collection.

    OGC API Maps preview with filter

  • Conformance: Each optional conformance class (subsetting, scaling, background, crs, output formats, and more) can be enabled or disabled from the Services > Mapping settings page. Invalid parameters are now reported as a bad request rather than an internal error.

    OGC API Maps CQL2 conformance table

For more information see OGC API Maps in the user manual.

Thanks to Andrea Aime (GeoSolutions) for the OGC API - Maps development, and Jody Garnett (GeoCat) for the 3.0.x backport and improvements to the conformance table editor.

GeoFence for GeoServer 3

The GeoFence extensions are now available for GeoServer 3, completing Milestone 4: Integration of the GeoServer 3 crowdfunding campaign.

GeoFence has been updated to Jakarta EE, Spring Framework 7 and Hibernate 7:

  • The geofence plugin now communicates with a standalone GeoFence server using REST, as Spring remoting is no longer available.
  • The embedded geofence-server requires a PostgreSQL / PostGIS database, H2 is no longer supported.
  • The GeoFence admin page is found under the Security menu, showing the active engine and GeoFence services URL.

GeoFence admin page general settings

Existing GeoFence users should review the migration guide before upgrading, as the datasource configuration file has been renamed and the GeoFence authentication provider has been removed.

Thanks to Emanuele Tajariol (GeoSolutions) for this work, and to the GeoServer 3 crowdfunding sponsors for making it possible.

GeoServer 3 is supported by the following organisations:


Individual donations: Abhijit Gujar, Hennessy Becerra, Ivana Ivanova, John Bryant, Jason Horning, Jose Macchi, Peter Smythe, Sajjadul Islam, Sebastiano Meier, Stefan Overkamp.

FIPS

GeoServer 3.0.2 comes with a new FIPS community module. FIPS 140-3 is a United States government standard for cryptography modules, and many federal agencies and their suppliers are only allowed to run software that uses a validated one. In summary:

  • The FIPS module replaces the regular BouncyCastle library with the FIPS-validated one and runs it in approved-only mode.
  • Passwords are stored with AES-GCM.
  • A new FIPS tab under Server Status shows the overall cryptographic setup (see screenshot below).

FIPS status page

Keep in mind that the module works on Linux only and needs a new data directory: there is no migration tool yet for an existing one.

  • GEOS-12178 FIPS community module
  • GEOS-12123 Login failure in FIPS mode for GeoServerDigestPasswordEncoder

Release notes

New Feature:

  • GEOS-12180 Add support for multi-layer tile caching (coalescing) in GWC

Improvement:

  • GEOS-10029 Use XML schema in applicationContext files
  • GEOS-12154 Improve URL validation in SLD processing
  • GEOS-12170 Centralize CRS list management across OGC APIs
  • GEOS-12176 Encrypt URL parameters with AES instead of DES
  • GEOS-12177 Do not hardcode algorithms in the security tests
  • GEOS-12179 Name the keystore file after its format, and refuse a mismatched one
  • GEOS-12183 CSS can trigger a bean loading circularity during startup
  • GEOS-12184 WCS Img coverage encoders subtly depend on gt-image
  • GEOS-12187 GeoJSON vector tiles are empty when the layer is meta-tiled
  • GEOS-12195 Refactoring of service resolution in Dispatcher
  • GEOS-12198 Support single-tenant Microsoft Entra ID authentication
  • GEOS-12199 Apply the catalog’s entity resolver consistently to stored query parsing
  • GEOS-12203 OIDC: let the identity provider assert the built-in “admin” account
  • GEOS-12205 Support GDAL 3.12+ new Raster Attribute Table data types
  • GEOS-12207 Layer preview feature info works poorly with long attribute names/values
  • GEOS-12208 RAT table view does not scroll any longer
  • GEOS-12209 Allow admins to request all layers from CSW endpoints
  • GEOS-12211 WPS: clean up GDAL configuration parsing
  • GEOS-12218 The print extension ships with a snapshot jar
  • GEOS-12231 Extension lookups take a global fair lock to read the JSONP setting
  • GEOS-12234 Report invalid connection settings when saving JDBC user/group, role and authentication services
  • GEOS-12235 Centralize remote IP resolution into a servlet filter
  • GEOS-12237 The style editor layer preview breaks with invalid chars in style names
  • GEOS-12238 CSW: Clearer exception in DirectDownload invalid requests
  • GEOS-12239 Read JDBC user and role property values as text
  • GEOS-12240 Clearer stored query error messages when query id is too long

Bug:

  • GEOS-12053 OGCAPI Features unable to disable core or enable draft / community standards
  • GEOS-12056 OGC API CQL conformance URIs are wrong
  • GEOS-12123 Login failure in FIPS mode for GeoServerDigestPasswordEncoder
  • GEOS-12143 Cannot create a tiled layer from the “tile caching” layer tab any longer
  • GEOS-12159 ReprojectingFeatureCollection throws ClassCastException reprojecting per-feature geometry between two Geographic 3D CRSs
  • GEOS-12172 Some testcases have overly verbose logging
  • GEOS-12174 Blob store creation fails under containerd — missing depends-on on gwcBlobStoreAggregator
  • GEOS-12193 “Encode coordinates measures” gives different geometries per GML version
  • GEOS-12200 GS3: Style Editor Color Helper layout broken
  • GEOS-12206 WMTS Multidim operations (DescribeDomains/GetHistogram/…) do not honor datasecurity
  • GEOS-12213 Changing the workspace of a WMS/WMTS cascaded store does not update its layers
  • GEOS-12216 Datadir loader fails on cross-workspace resource references
  • GEOS-12225 Session ID rotates on every request when the admin password is still the default
  • GEOS-12229 Backup and restore: after a job has been stopped, later backups and restores end STOPPED
  • GEOS-12230 Backup and restore: a full restore loses cascaded WMS/WMTS layers and workspace layer groups, and can empty its own archive

Task:

  • GEOS-11975 MapML extension / GeoServer 3.0 SNAPSHOT with MapML extension won’t start
  • GEOS-12160 Add URL checks to wps-download-plugin
  • GEOS-12171 Update to ImageN 0.9.3
  • GEOS-12181 Update gs-web-app to jetty.ee11 testing
  • GEOS-12186 Update to JakartaEE Servlet
  • GEOS-12188 GS3: jetty e11 de-dup warnings due to servlet-api compile scope
  • GEOS-12192 GeoFence: align to GeoServer3
  • GEOS-12241 MapFish Print 2.5.2 Update

For the complete list see 3.0.2 release notes.

Community Updates

Community module development:

  • GEOS-12161 Align OGC API Maps to v1.0.0
  • GEOS-12163 Expose filtering in OGC API Maps
  • GEOS-12167 Add dataset map support in OGC API Maps
  • GEOS-12178 FIPS community module
  • GEOS-12182 Support Azure SAS token authentication for COG stores
  • GEOS-12191 GS3: TilesServiceInfoImpl and ImagesServiceInfoImpl both configure tiles.xml
  • GEOS-12219 Remove the gwc-sqlite community module
  • GEOS-12221 WPS Longitudinal Profile: compute distances on the ground
  • GEOS-12222 JWT-Header: Improvements and documentation clarifications
  • GEOS-12236 Support conformance classes in OGC API Styles

Community modules are shared as source code to encourage collaboration. If a topic being explored is of interest to you, please contact the module developer to offer assistance.

About GeoServer 3.0 Series

Additional information on GeoServer 3.0 series:

Release notes: ( 3.0.2 | 3.0.1 | 3.0.0 )

by Jody Garnett at October 19, 2026 12:00 AM

GeoServer 2.28.6 release is now available with downloads (bin, war, windows), along with docs and extensions.

This is a maintenance release of GeoServer providing existing installations with minor updates and bug fixes. GeoServer 2.28.6 includes GeoTools 34.6 and GeoWebCache 1.28.6. GeoServer Cloud 2.28.6 is also available alongside today’s release.

Thanks to Peter Smythe (AfriGIS) for making this release, Andrea Aime (GeoSolutions) for testing, and Gabriel Roldan (Camptocamp) for the GeoServer Cloud release.

Security Considerations

This release addresses security vulnerabilities and is an important upgrade for production systems. Details about the fixes will be provided at the start of November.

See project security policy for more information on how security vulnerabilities are managed.

Release notes

New Feature:

  • GEOS-12180 Add support for multi-layer tile caching (coalescing) in GWC

Improvement:

  • GEOS-12099 GWC backup deadlock caused by DefaultTileLayerCatalog FileSystem
  • GEOS-12127 Fix flaky tests causing non-deterministic CI failures
  • GEOS-12139 GSIP 241 - GeoWebCache Security-Aware Tile Caching
  • GEOS-12154 Improve URL validation in SLD processing
  • GEOS-12183 CSS can trigger a bean loading circularity during startup
  • GEOS-12187 GeoJSON vector tiles are empty when the layer is meta-tiled
  • GEOS-12195 Refactoring of service resolution in Dispatcher
  • GEOS-12198 Support single-tenant Microsoft Entra ID authentication
  • GEOS-12199 Apply the catalog’s entity resolver consistently to stored query parsing
  • GEOS-12203 OIDC: let the identity provider assert the built-in “admin” account
  • GEOS-12205 Support GDAL 3.12+ new Raster Attribute Table data types
  • GEOS-12209 Allow admins to request all layers from CSW endpoints
  • GEOS-12211 WPS: clean up GDAL configuration parsing
  • GEOS-12218 The print extension ships with a snapshot jar
  • GEOS-12234 Report invalid connection settings when saving JDBC user/group, role and authentication services
  • GEOS-12235 Centralize remote IP resolution into a servlet filter
  • GEOS-12237 The style editor layer preview breaks with invalid chars in style names
  • GEOS-12238 CSW: Clearer exception in DirectDownload invalid requests
  • GEOS-12239 Read JDBC user and role property values as text.
  • GEOS-12240 Clearer stored query error messages when query id is too long

Bug:

  • GEOS-12065 WMS Layer REST PUT always returns 500 due to Collections.emptySet() in getRemoteStyleInfos()
  • GEOS-12100 Use SyncTaskExecutor to prevent deadlock in backup/restore tasklets
  • GEOS-12159 ReprojectingFeatureCollection throws ClassCastException reprojecting per-feature geometry between two Geographic 3D CRSs
  • GEOS-12193 “Encode coordinates measures” gives different geometries per GML version
  • GEOS-12206 WMTS Multidim operations (DescribeDomains/GetHistogram/…) do not honor datasecurity
  • GEOS-12213 Changing the workspace of a WMS/WMTS cascaded store does not update its layers
  • GEOS-12216 Datadir loader fails on cross-workspace resource references

Task:

  • GEOS-12136 IOTestUtils.createRandomDirectory() replacing mkdir call to more recent java.nio.files API
  • GEOS-12160 Add URL checks to wps-download-plugin

For the complete list see 2.28.6 release notes.

Community Updates

Community module development:

  • GEOS-12182 Support Azure SAS token authentication for COG stores
  • GEOS-12219 Remove the gwc-sqlite community module
  • GEOS-12221 WPS Longitudinal Profile: compute distances on the ground
  • GEOS-12222 JWT-Header: Improvements and documentation clarifications

Community modules are shared as source code to encourage collaboration. If a topic being explored is of interest to you, please contact the module developer to offer assistance.

About GeoServer 2.28 Series

Additional information on GeoServer 2.28 series:

Release notes: ( 2.28.6 | 2.28.5 | 2.28.4 | 2.28.3 | 2.28.2 | 2.28.1 | 2.28.0 )

by Jody Garnett at October 19, 2026 12:00 AM

GeoServer 2.27.7 release is now available with downloads (bin, war, windows), along with docs and extensions.

This series has previously reached end-of-life, with this release issued to address an urgent bug or security vulnerability. Please apply this update as a mitigation measure only, and plan to upgrade to a stable or maintenance release of GeoServer.

GeoServer 2.27.7 is made in conjunction with GeoTools 33.7.

Thanks to Peter Smythe (AfriGIS) for making this release, and Andrea Aime (GeoSolutions) for testing.

Security Considerations

This release addresses security vulnerabilities and is an important upgrade for production systems. Details about the fixes will be provided at the start of November.

It is worth repeating that the 2.27 series has reached end-of-life. While we understand that this is the last series supporting Java 8 please update to the supported 2.28 or 3.0 releases.

See project security policy for more information on how security vulnerabilities are managed.

Release notes

Improvement:

  • GEOS-12099 GWC backup deadlock caused by DefaultTileLayerCatalog FileSystem
  • GEOS-12127 Fix flaky tests causing non-deterministic CI failures
  • GEOS-12154 Improve URL validation in SLD processing
  • GEOS-12195 Refactoring of service resolution in Dispatcher
  • GEOS-12199 Apply the catalog’s entity resolver consistently to stored query parsing
  • GEOS-12211 WPS: clean up GDAL configuration parsing
  • GEOS-12234 Report invalid connection settings when saving JDBC user/group, role and authentication services
  • GEOS-12235 Centralize remote IP resolution into a servlet filter
  • GEOS-12237 The style editor layer preview breaks with invalid chars in style names
  • GEOS-12238 CSW: Clearer exception in DirectDownload invalid requests
  • GEOS-12239 Read JDBC user and role property values as text.
  • GEOS-12240 Clearer stored query error messages when query id is too long

Bug:

  • GEOS-12100 Use SyncTaskExecutor to prevent deadlock in backup/restore tasklets

Task:

  • GEOS-12136 IOTestUtils.createRandomDirectory() replacing mkdir call to more recent java.nio.files API
  • GEOS-12160 Add URL checks to wps-download-plugin

For the complete list see 2.27.7 release notes.

Community Updates

Community module development:

  • GEOS-12219 Remove the gwc-sqlite community module
  • GEOS-12222 JWT-Header: Improvements and documentation clarifications

Community modules are shared as source code to encourage collaboration. If a topic being explored is of interest to you, please contact the module developer to offer assistance.

About GeoServer 2.27 Series

Additional information on GeoServer 2.27 series:

Release notes: ( 2.27.7 | 2.27.6 | 2.27.5 | 2.27.4 | 2.27.3 | 2.27.2 | 2.27.1 | 2.27.0 )

by Jody Garnett at October 19, 2026 12:00 AM

A student finishes a QGIS exercise, saves the project and sends the file to the instructor. The analysis is complete—but the map is still difficult to share with a colleague, a client or the public.

That last step, taking a desktop GIS project onto the web, is increasingly part of practical GIS training. A review of publicly listed courses turns up examples around the world that include QGIS Cloud in their teaching: from publishing a first web map to working with cloud databases and web GIS.

October 19, 2026 12:00 AM

October 16, 2026

After writing about being laid off in April, I went almost five months without paid work. As I wrote in that post, I started with some severance. After that, I learned how to participate in Colorado's unemployment insurance benefits system. Just before reaching that program's limits, I was offered a position at Colorado State University, and I accepted. Colorado recorded 2,400 people hired in September 2026, and I was one of them.

Surprisingly, I found the job posting on the Larimer County Economic and Workforce Development Program's current job openings list, using "python" as a keyword. Not on LinkedIn. Not in my professional network. The algorithms were feeding me nothing but jobs at defense contractors with cringey names stolen from Tolkien, and my personal network was not hiring. I stumbled onto a local job on a local job board and nailed the interviews. It was not how I imagined that I would find a new position.

I've benefited from good luck. I'm lucky to have found the posting in a local listing. I'm lucky that the hiring team was open minded about an older and perhaps over-qualified applicant. I'm lucky that I have a nice list of accomplishments that are recent enough to be relevant and old enough to have been plausibly earned through actual interest and perseverance. I'm lucky to have friends who will answer the phone and attest to me being a decent person.

It's a tough time to be unemployed in the USA, which has uneven and often meager benefits, and is banking on magical AI/LLM solutions to all our problems. Hit me up if you're having trouble navigating Colorado's unemployment insurance system and have nowhere else to go for help.

by Sean Gillies at October 16, 2026 03:36 AM

As I alluded to in my previous post, I've got a new job. I'm a research associate at Colorado State University, working at the Cooperative Institute for Research in the Atmosphere (CIRA). For the first time in over 20 years, I'm working for a local organization, the biggest local institution, in fact. Riding my bike to the office, learning to pack a lunch, all the things. I'm helping several research projects use satellite imagery to derive global cloud properties in near real-time.

Yesterday I attended an orientation session for new CSU employees. I've been married to a CSU professor for 21 years and already know everything there is to know about the school. Joining the employee union was a new experience. I wish there had been more of us.

by Sean Gillies at October 16, 2026 02:48 AM

October 15, 2026

October 14, 2026

A few people have asked how the scoring works, and one or two have asked, a bit pointedly, why their pin 40 km from Lagos only got half marks. Here’s the longer version of the info box: how to play, how the points add up, and where it all comes from.

The basics

Every day you get 5 cities. For each one you drop a pin on a map with no labels: no names, no roads, just coastlines, borders, rivers and lakes. Then you answer 3 multiple-choice questions about the city.

  • Pin first, then questions. It’s that way round on purpose, because the questions would give the country away.
  • Zoom in before you commit. You can drag the pin around as much as you like until you press confirm. On a phone, pinch to zoom.
  • The daily quiz is the same for everyone. New cities arrive at midnight your time, so players in Sydney get each quiz about 11 hours before I do. When you complete the quiz you will see a message telling you when the next one will be published.
  • No repeats for at least 20 days. There are 328 cities in the pool, so it’ll be a while before you see the same one again and even if you do, the questions will be different.

Scoring

Each city is worth up to 100 points, so a perfect day is 500.

  • Right country: 12 points. Land anywhere inside the right country and the 12 are yours. There’s a little leeway near borders, as my outlines are simplified.
  • Pin: up to 40 points. Within 10 km of the city centre you get the full 40. After that you lose the same amount every time the distance doubles, down to nothing at 1,000 km. In a middling country such as France or Thailand:
    • 10 km = 40
    • 30 km ≈ 30
    • 100 km = 20
    • 300 km ≈ 10
    • 1,000 km = 0
  • Big countries are more forgiving. Being 100 km out in Belgium isn’t the same as being 100 km out in Canada, so the distances stretch for large countries, up to 3 times. In the USA, Russia, Brazil or Australia, you get full marks within 30 km and still score something up to 3,000 km away. Small countries are never made harsher than the table above.
  • Questions: 16 points each.

And a sting in the tail:

  • Wrong country, but next door: no pin points, but no penalty either.
  • Wrong country and not even a neighbour: minus 10. Yes, a city can score below zero. Putting Lagos in Kenya deserves it.

When you’re stuck

Two kinds of help, both at a price:

  • Location clue. A circle appears around the right area, with the countries inside it named. It ranges from about 300 km across for small countries to about 1,500 km for the giants. Using it halves your pin points and you lose the 12 for the right country, so you’re paying for the help.
  • Remove a wrong answer. On any question you can knock out a wrong answer, which halves that question to 8 points. The first one to go is always the most tempting wrong answer, so it’s a proper helping hand. A second removal halves it again, to 4 points. It’s never zero, so it’s always worth having a go.

The bonus round

Score 325 or more and you unlock a bonus round of 2 hard cities. It’s scored separately, so it doesn’t change your daily score, but it’s worth it for the bragging rights.

Practice

If you want a warm-up there are 2 practice sets, which you can replay as often as you like:

  • Easy: the same mix as the daily quiz, 3 easy cities and 2 medium.
  • Hard: 3 medium and 2 hard. It does what it says.

Your progress, your passport and the leader board

  • When you finish, you’ll see your streak, a countdown to the next quiz and, once enough people have played that day, how you compare with everyone else.
  • The passport keeps a record of every city you’ve met. It’s surprisingly satisfying to watch it fill up and also to see the cities on a world map.
  • The share button sends your score card and a link (on a phone it shares the picture as well). It never names the cities, so no spoilers for your friends.
  • No accounts, no email, no names. Your streak and passport live only in your browser. When you finish the daily quiz, the date, your score and a random number your browser made up get sent to the site, so it can work out your place. That’s all. The catch is that if you clear your browser data or switch devices, your streak starts again.

Where the cities and questions come from

  • The cities started as a list of the world’s populated places from Natural Earth. I ranked them by how often people read their Wikipedia articles, with quotas per continent so it isn’t all Europe and North America, then tidied the list by hand. That gave 328 cities: 108 easy, 114 medium and 106 hard.
  • The questions (2,993 of them, 6 to 10 per city) were written by Claude from each city’s English Wikipedia article. A script then checked every correct answer against a sentence in that article. The wrong answers weren’t checked the same way at first, though they’ve since had a second check. If you still think a “wrong” answer is actually right, you may have a point, so tell me in the comments below.
  • The city centre is wherever Wikipedia puts the pin. For sprawling cities that can feel a bit arbitrary, but it’s the same for everyone.

Borders

The map uses Natural Earth’s borders, with one change: Crimea is shown as part of Ukraine. In disputed areas such as Kashmir I don’t label anything. The borders are there for the game and aren’t a statement about who does or should own what.

The small print

It’s a personal project, free and with no adverts. The questions come from Wikipedia under its CC BY-SA licence, and every city links back to its article, which is worth a read when a question catches you out.

Play today’s quiz at knowwhereconsulting.co.uk/quiz/cities/

Change Log

  • 16 October 2026: You told me the questions were too hard, and you were right. Every question now has one tempting wrong answer and two you can rule out, the quiz picks easier questions first, and I’ve retired about 270 of the most obscure ones. Asking for help now removes the most tempting wrong answer.

<p>The post KnowWhere Cities Quiz – how it works first appeared on KnowWhere.</p>

by Steven at October 14, 2026 05:39 PM

LLMs for spatial data discovery

Exploring how Large Language Models can Improve Search in Spatial Data Infrastructures

Every day, a huge amount of spatial data is produced by public agencies, research institutes, companies, and other data providers. Spatial Data Infrastructures (SDIs) have been set up at local, national and international levels to bring these data and its metadata together and make it easier to find. Metadata standards have matured and been adopted along the way. And yet, users still struggle to find the right datasets.

Can you remember the last time you were looking for a dataset? Perhaps you had to visit several geoportals or open data portals, each with its own interface and layout. You typed a few keywords and hoped they matched something in the metadata. Woe unto you if you used a synonym! Searching for “global warming datasets” will not necessarily find a record described as “greenhouse effect data”. Your chances are even worse if you searched in English while the metadata was written in German, French or any other different language. And if you did get a keyword right, you probably faced a long, poorly ranked list of results and had to open each one and check whether it’s relevant.

If you can relate to these frustrations, you are not alone. Many users spend a lot of time searching for data before they can use it. This brings us to this week’s challenge:

How can Large Language Models (LLMs) improve data discovery in SDIs?

LLMs have become popular thanks to their advanced language processing abilities. You have probably used ChatGPT, Gemini, or Mistral to explain a concept, find some information, translate text, generate code or even build an app. There is no doubt that their capabilities are impressive. So why not just ask an LLM to find a particular dataset?

Unfortunately, that doesn’t work reliably. An LLM stores what it learned during training in its internal parameters. Its internal knowledge is fixed until the LLM is re-trained or updated, and until that happens, the model knows nothing about datasets published after its training period. Modern LLMs have internet search tools and can find popular, widely used datasets. However, many datasets in SDIs sit in catalogues that have not been indexed by search engines, so they remain invisible to the model.

Now ask an LLM for datasets  covering a very specific area, for instance, “Forest data for Hamburg”. Metadata usually describes a dataset’s spatial extent as bounding box coordinates, not as place names. LLMs are trained primarily on text and don’t always handle geographic reasoning well. Unless the place name is mentioned in the dataset’s title or description, the LLM struggles to translate bounding box coordinates to place names you used in your search query.

In short, using an LLM for data discovery has two limitations: outdated or incomplete knowledge and poor geographic reasoning.

Bringing the metadata to the model

An update to the model would be required with every newly published or updated dataset. Hence, re-training or fine-tuning the model are too time-consuming and resource-intensive approaches. Instead, when a user makes a request, we give the LLM immediate access to the latest metadata in an SDI. The model does not access all information at once to avoid overloading the context window. The model only accesses a subset of the information that is relevant to the user query. This approach is called Retrieval-Augmented Generation (RAG).

Conceptual overview: semantic search and geographic matching narrow down SDI metadata before the LLM generates the answer.Figure 1: Conceptual overview: semantic search and geographic matching narrow down SDI metadata before the LLM generates the answer.

Figure 1 shows the main components of the system. The first building block is semantic search. Datasets are retrieved based on a similarity analysis of the user query and the metadata rather than exact matching of keywords. To make this work, both the user’s query and the metadata records are transformed into embeddings: vectors of numbers that encode what a text means. Two words with a similar meaning end up close together  even when they share no words at all. A request for global warming data can therefore find a record about the greenhouse effect. You can describe the dataset you are looking for in your own words, even in a different language from the metadata, and the system is more likely to find it.

But wait! What about the second problem, poor geographic reasoning? Embeddings are excellent at matching meaning, but they are not built for spatial reasoning. To them, the word “Münster” and a bounding box around 7.6° E, 52.0° N have nothing in common. This is where geographic matching comes in. Geocoding translates the place name mentioned in a query into coordinates, and spatial indexing compares those coordinates with the bounding boxes of the metadata. Only datasets whose extent fits the area of interest make it into the results.

Finally, the LLM receives the matching metadata records and uses them to answer the user’s query in plain language. It no longer has to rely only on what it learned during training.  The LLM can also re-rank the identified datasets to align them more closely to the user’s needs.

Here is how this could look in practice: you ask, in English, for “Renewable energy potential in Germany”. Semantic search finds records related to renewable energy, including those whose metadata talks about “Solarpotential” and “Geothermiepotential”. Geographic matching then keeps only the datasets whose bounding box overlaps with Germany. Instead of a long, unsorted list, you get a short list of datasets that fit both your topic and your area (see Figure 2). The response includes links to the actual datasets that you could then use or explore further.

A sample query and the LLM’s responseFigure 2: A sample query and the LLM’s response

Of course, this is no magic wand. The system can only find what the metadata describes. Good metadata remains the foundation of any SDI or data discovery workflow. Poor or vague metadata will make both the semantic search and the geographic matching less effective, and datasets can remain undiscovered.

Less searching, more analyzing

So, how can you bring this kind of search to your users? 52°North can develop a customized, AI-enabled data discovery solution for your SDI or data repository. The users of your data should spend less time hunting for data and more time where it matters: analyzing the data they find and deriving insights from it.

Do you have questions or are you curious how this would work with your own catalogue? Don’t hesitate to get in touch with us!

See you next week.

by James Ondieki at October 14, 2026 07:53 AM

Stem op OSGeo.nl voor de Geo Prestige Award!

TLDR; Direct stemmen via https://geomares.typeform.com/to/YUyu9jo8 .

De vakvereniging Geo-Informatie Nederland (GIN) reikt jaarlijks vakprijzen uit, de Geo Prestige Awards. Er zijn drie categorieën: Professional, Startup en Organisatie. OSGeo.NL is genomineerd in Organisatie.

Genomineerd…, maar nu willen we natuurlijk ook winnen! En aangezien wij de enige community-organisatie zijn (de andere genomineerden zijn bedrijven), vragen we iedereen om op ons te stemmen!

Stemmen gaat via een klassiek internet-formulier. Op https://geoinformatienederland.nl/over-ons/gin-awards/geo-prestige-award-2026-de-genomineerden zie je de genomineerden. Kijk vooral ook bij de andere categorieën, 3DGI is daar onze favoriete startup en Britta Ricker bevelen we aan in Professional!
Dus: laat je stem niet verloren gaan.

October 14, 2026 07:00 AM

October 13, 2026

Everyone knows the QGIS Plugin Repo but have you had a look at the QGIS Hub yet?

It’s similar to the plugin repository in that it allows sharing of resources between community members, but it so many different types of resources, that warrants multiple blog posts: from styles and projects all the way to processing scripts.

Today, I want to have a look at the (a little cryptic) QLR option.

The QGIS Layer Definition (QLR) format makes it possible to share “complete” QGIS layers with other QGIS users. QLR files contain links to the data sources and all the QGIS style information necessary to style the layer.

To test the features, I uploaded QLRs for the two BEV basemap COGs I first wrote about a few weeks ago.

The cool thing about sharing the COGs like this is that: 1. users don’t have to mess with the COG URLs and 2. the QLR stores styling information such as the recommended raster resampling settings which were previously only available in the dataset documentation.

To use the resources from the hub in QGIS, you’ll want to install the QGIS Hub plugin:

Once installed, this plugin will show you all the resources published on the hub:

As you can see, we are only just starting out and there are not many QLRs uploaded yet.

So I’d like to encourage you join our efforts and share, for example, your national basemap layer definition files with the QGIS community.

It’s never been so easy.

To create a QLR, just right-click a layer in QGIS and go to Export | Save as Layer Definition File.

To share a QLR, head to hub.qgis.org, log in, and upload.

And there is good news regarding logins: besides the good old OSGeo account, you can now use third party accounts from Github or Google (I think more options are to come) to log into the hub:

Big thanks to the QGIS infrastructure team who have been working on this feature during the contributor meeting last week!

by underdark at October 13, 2026 04:35 PM

OSGeo.nl has been nominated for the most prestigious geo-award within The Netherlands: the Geo Prestige Award 2026. This is a callout to our community: vote for us!

TL;DR: Vote directly via https://geomares.typeform.com/to/YUyu9jo8 or click image above, or use QR. Sorry, form is in Dutch.

The professional association Geo-Informatie Nederland (GIN) presents annual industry awards known as the Geo Prestige Awards. There are three categories: Organization, Professional and Startup. OSGeo.NL has been nominated in the Organization category.

We’ve been nominated... but naturally, we want to win! And since we are the only community-based organization (the other nominees are companies), we’re asking everyone to vote for us! We have been active, an assocation since 2011, in many respects, most notably our anual FOSS4G.nl

Voting takes place via a standard online form. You can view all nominees here .

Be sure to check out the other categories too:

So, don't let your vote go to waste. And, of course, we warmly invite you to share this message with others.

Thanks in advance! We’d love to take the stage at GeoBuzz on Nov 16, 2026!

October 13, 2026 04:24 PM

GeoNode 5.1.0 new release graphic with the GeoNode logo

Dear Reader,

Here is a closer look at GeoNode 5.1.0, the first feature release built on top of the renewed 5.0 architecture. The release notes list everything in detail. Where GeoNode 5 was about rebuilding foundations, 5.1.0 is about putting those foundations to work. It significantly broadens the range of data GeoNode can catalogue and publish, and it tightens the controls around how that data is shared.

Two themes run through this release. The first is reach: GeoNode now handles data that has no geometry at all, and data that never leaves the remote server it is hosted on. The second is control: permissions, authentication for external resources and default access rules all received substantial attention. Alongside these, metadata internationalisation has been generalised across the platform, and the documentation has begun its move to a new MkDocs-based site.

Documents as map layers

Documents can now be placed directly on a map. Geolocation can be set manually from the "Location" tab of the resource panel, or, for images carrying EXIF metadata, GeoNode picks up the coordinates automatically.

A new "Add documents layer" button opens a dedicated resource browser where documents can be searched and filtered by type. Selecting one or several documents and confirming the action creates a "Document Layer" on the map, with one feature for each document chosen. Every document is shown as a marker positioned at the centre of its location, and clicking a marker opens a preview of the resource in the sidebar.

This turns the map into a browsable index of related material, such as photos, reports and scans, anchored to the places they belong to, without leaving the map view to go looking for them.

[caption id="attachment_13873" align="aligncenter" width="704"]GeoNode map with the documents catalog open and document markers placed on the map Documents on Map[/caption]

Beyond geometry: support for non-spatial datasets

GeoNode can now manage tabular data with no geographic component. Non-spatial CSV files can be uploaded and registered in the GeoNode catalogue through the standard resource-management workflow, with the same metadata, permissions, search and download behaviour as any spatial layer.

This opens GeoNode to a much wider set of use cases, where attribute tables, lookup tables and statistical datasets live alongside spatial layers rather than in a separate system.

The resource preview shows the tabular data with filter and export tools. The main catalogue filter panel also offers a new "Tabular" checkbox that allows filtering non-spatial data.

[caption id="attachment_13864" align="aligncenter" width="687"]Preview of a tabular resource in GeoNode with filter and export tools Tabular resource preview[/caption]

Cloud-native resources: COG and FlatGeobuf remote assets

GeoNode 5.1.0, in cooperation with MapStore (the framework behind the GeoNode client), adds support for two cloud-native formats, both in the client and as remote resources in the catalogue. In both cases, the pattern is the same: you provide a URL, and GeoNode reads only what it needs.

  • Cloud Optimized GeoTIFF (COG): register large raster datasets hosted externally simply by providing their URL. Rather than downloading the whole file, GeoNode uses HTTP range requests to read metadata such as CRS and spatial extent directly from the remote source. The result is efficient, cloud-native raster access without storing massive files locally.
  • FlatGeobuf (FGB): register external FlatGeobuf datasets as remote vector layers by URL. As with COG, HTTP range requests fetch metadata (CRS, extent, attributes) directly from the source, with graceful fallback when a server does not support range requests.

For organisations already publishing data to object storage, this removes a duplication step that was previously unavoidable: the authoritative file stays where it is, and GeoNode catalogues and serves it in place.

XLSX upload and download

Microsoft Excel (XLSX) is now a supported format for both ingestion and export. Users can upload spreadsheets as datasets and download existing datasets as XLSX, complementing the CSV and other export options introduced previously.

The upload of XLSX files is an optional feature that can be activated as a system setting, so administrators can decide whether to expose it.

Together with non-spatial dataset support, this makes GeoNode a considerably more natural destination for the spreadsheet-shaped data that most organisations actually have in circulation.

Multilingual metadata support

The metadata internationalisation mechanism has been refactored and generalised, so that localised labels and descriptions are no longer confined to the GeoNode app. Metadata fields can now carry translations across the platform.

[caption id="attachment_13865" align="aligncenter" width="685"]Multilingual metadata editor in GeoNode Multilingual editor[/caption]

On the API side, a new opt-in parameter (include_i18n) lets resource APIs (datasets, documents, maps and others) return all available translations alongside the default value, for example, title, title_en and title_fr. Because it is opt-in, full backward compatibility is preserved for existing clients: nothing changes unless you ask for it.

[caption id="attachment_13867" align="aligncenter" width="670"]GeoNode resource API response with translated fields returned via include_i18n Multilingual API[/caption]

Related improvements include generic use of sparse metadata fields, used to store and handle custom metadata, and improvements to thesaurus management.

The developers' documentation now includes a dedicated section on metadata management and customisation.

Faithful handling of multi and mixed geometries

GeoNode now correctly handles datasets that mix geometry types (Points, MultiPoints, LineStrings, MultiLineStrings, Polygons and MultiPolygons) within the same layer. Previously, upserting data with mixed geometries could leave the stored geometries out of sync with the source. The new handling ensures that source data is reflected in storage and display after update and replace operations, which matters directly for the dataset update workflows introduced in GeoNode 5.

Permissions and security

Authentication for external resources

A generic authentication layer decouples how authentication settings are stored from how they are applied to outgoing requests, via a unified AuthConfig model supporting multiple types: Basic, Token and signed/SAS URLs. Credentials can be reused across integrations instead of being hardcoded per use case. They are used, for example, when generating map thumbnails from datasets hosted on authenticated remote servers.

Default permissions for registered members

Administrators can now configure baseline permissions (view, download, edit, manage) for all authenticated users, mirroring the existing anonymous-user settings. This closes a long-standing asymmetry in how default access was expressed.

Tighter controls on remote resources

Creation of remote resources is restricted to administrators by default, and Remote Services creation actions are hidden in the UI when the user lacks the required permissions. A related fix removes an unexpected password prompt on private datasets.

Documentation moves to MkDocs

The documentation revision announced with GeoNode 5 is now underway in public. The GeoNode documentation has begun migrating from Sphinx to MkDocs, with a refreshed and easier-to-navigate site. This is still a work in progress, and it can be followed at https://docs.geonode.org/en/latest/.

Software updates

GeoNode 5.1.0 also moves the stack forward:

  • The reference version of GeoServer is 2.28.4 (from 2.27.3)
  • The GeoNode client application is aligned to the new features from MapStore v2026.01.02
  • Django has been updated to version 5.2.15
  • pyCSW has been upgraded to the 3.0 series

Improvements and fixes

Beyond the headline features, 5.1.0 collects a range of smaller improvements across the UI, the admin and the API:

  • The UI language selection is now synchronised with the user profile settings.
  • Thumbnails can be uploaded through the UI for remote spatial datasets.
  • The label thesaurus is reloaded when thesauri change.
  • Inline links were added inside the Django admin pages for datasets and documents.
  • Resource endpoints now also return dirty resources.
  • The regenerate_xml management command has been improved.
  • Missing entries when searching with the new indexing have been fixed.
  • EXIF metadata extraction from documents was fixed, with support for further media types.
  • A new update-bbox endpoint is available for datasets.
  • Updating permissions through a PUT request now replaces them instead of merging them.
  • requirements.txt has been dropped, with dependencies moved to pyproject.toml.

The full list of changes and bug fixes for GeoNode can be found in the changelog.

If you are interested in learning about how we can help you achieve your goals with open source products like GeoServer, MapStore and GeoNode, make sure to talk to us!

The GeoSolutions team

320x100_eng

by Giovanni Allegri at October 13, 2026 02:32 PM

During a bit of football banter about League 1 over the weekend, Ken said to me “I bet you’ve never been to any of those places either. All a bit far north” – it turned out I had visited 18/24 of the places in the League. That prompted an idea for a geography quiz, could I make a quiz that combined pinning the locations of cities on a map with some general knowledge questions about those cities?

I started out with this prompt:

  • I want to make a geography quiz about cities in the world. For each city the user should have to put a pin on an unlabeled map and score points for how close the pin is to the centre of the city. I was thinking about 2-300 cities around the world with each quiz being 10 random cities.
  • For each city the user should be presented with 3 questions each with a choice of say 4 answers (number of choices to be refined later). There should be 10 questions about each city so that if the city appears again there will be different questions. Could questions be sourced from wikipedia?
  • There should be a scoring model that combines the closeness of the map pin to it’s location, a point for in the right country and points for correct answers. We can work on the scoring later.
  • Could we have different difficulty modes? Maybe based on the size of the city e.g. Capital cities are easiest
  • I’d like the quiz to have a daily version so that people can share their scores on social media, I guess that will need an email sign up and basic gdpr and unsubscribe
  • Needs to work on mobile and laptop
  • Can you suggest any other approaches/ideas?
  • Tell me how you build the data and questions

Claude replied that it was very buildable and outlined how it would build the data from Wikipedia with cities being ranked by how frequently the Wiki page was accessed and adjusted to ensure distribution across all continents.

Claude built a prototype with 20 cities and a set of questions and answers which quickly let me refine the brief for the agents that would construct the 328 sets of questions and answers and work through most of the functionality

Decisions that changed along the way

  • No email sign-up. Sharing works by copying a result, Wordle-style, so the whole thing runs without accounts.
  • 10 cities per quiz became 5 once I played it because 10 took too long, there may even be a case for reducing to 3 cities in the future depending on user feedback.
  • My usual basemap has labels, so the map is drawn directly from Natural Earth data with labels switched off.
  • 3 difficulty levels became 1 daily quiz with a bonus round of 2 “hard” cities for scores over 350/500.
  • I added a passport feature that tracks all the cities that you have visited in the quiz and your scores (stored on your device)

Choosing the cities

There are 328 cities across 149 countries, selected by how often their Wikipedia page is read, not by population. I set targets per continent and a cap per country to try and get a good distribution. City names that gave the country away were reworded e.g. “Kingston, Jamaica” became “Kingston (Caribbean)”

Writing 3,266 questions

Writing 3000+ questions and 12,000 answers (9,000 of which are wrong but believable) meant reading a mass of Wikipedia content. Once we had prototyped the questions and answers and selected the cities Claude set a string of agents working to read the articles and compose the questions while I went to sleep. I hit my session/token limit part way through and had to restart in the morning to finish the process.

Every question had to quote the sentence it came from, and a script checked each quote really is in the article. I relaxed the requirement for 10 questions for a few cities with shorter Wikipedia articles .The wrong answers come from Claude’s general knowledge and are not source-checked but they seem pretty good in my tests.

Scoring

100 points a city: 30 for the pin, 10 for the right country, 20 for each question.

A pin in the wrong country scores nothing for accuracy; a country that doesn’t even border the right one costs a penalty of 10 points (that required some proximity checking on the fly). Pin points slide with distance, and the distances stretch for big countries, so in smaller countries (e.g. Thailand) you have to place the pin within 10km of the city centre to score the full 30 points while in large ones (e.g. USA) 30km will score maximum points.

Activating help reduces the points available:

  • A large circle showing very roughly where the city is plus the country labels switched on costs the 10 point correct country score and halves the proximity score.
  • Users can ask for 1 or 2 wrong answers to a question to be removed, each help halves the question score.

Borders and politics

While testing I hit some inevitable geopolitical disputes. I tried to adopt a neutral position on disputes about the cities in the quiz. Jerusalem accepts either Israel or Palestine, Nicosia is classed as being in Cyprus (both), Crimea is drawn as part of Ukraine, Kashmir follows the line of control. The info panel says borders are a guide for the game and imply no political position.

What I Learnt

A lot of this project was decisions, not code: what counts as a fair question, how harsh the scoring should be, how to select and classify cities. From idea to launch took 2 days with some agents whirring in the background.

The quiz runs with no server at all, apart from a small script for the anonymous daily leader board so it should be pretty scalable if it gets a lot of interest.

<p>The post World Cities Quiz first appeared on KnowWhere.</p>

by Steven at October 13, 2026 01:37 PM


Laax, Switzerland, 10 October 2026. More than 420 people from over 30 countries and five continents gathered in Laax from 4 to 9 October for the QGIS User Conference 2026, the largest event ever held on Crap Sogn Gion at 2222 metres above sea level.


Two conference days at the Galaaxy venue carried around 90 talks and six keynotes. Swiss MP Gerhard Andrey opened with Switzerland’s turn towards open source, ETH Zurich cartography professor Lorenz Hurni spoke on maps as instruments of power, Anita Graser on AI in the QGIS ecosystem, and Johannes Kanonier on fifteen years of QGIS at the State of Vorarlberg. Ivan Minčík, Lova Andriarimalala and Tim Sutton made the case for sustaining the infrastructure the whole project depends on. Twelve short hands-on workshops ran alongside the talks across those two days.


Wednesday brought ten full-day workshops in the valley with 120 participants, ranging from point clouds and data processing to plugin development, workflow automation, team collaboration and field data infrastructure with QFieldCloud and Mergin Maps, alongside the QField Day, where 71 participants mapped the area around Laax in guided groups using QField, the mobile companion app born a few kilometres away in Sagogn. From Wednesday to Friday the 29th QGIS Contributor Meeting put developers, documenters and translators around the same tables to work on the software itself.


The recurring theme of the week was what happens when decision makers and developers share a room.
Procurement officers, cantonal GIS leads, researchers and core developers spent three days in the same
corridors, and the conversations that followed are the kind that rarely happen over a mailing list.


“Digital sovereignty is not a slogan, it is what you get when the people who fund the software and
the people who build it actually meet. That is what this week was for.”
Marco Bernasocchi, Chair,
QGIS.org Association


OPENGIS.ch was the lead organiser of the conference, together with QGIS.org and QGIS Switzerland. The
week was made possible by its sponsors, whose support kept ticket prices within reach of public bodies and
students alike: Happy Survey on platinum, EBP and Lutra Consulting on gold, Arx iT, Ocean Winds and the
Province of South Holland on silver, together with the bronze sponsors and supporters. The conference was also financially supported by QGIS.org using funds provided by its donors and sustaining members.


About QGIS

QGIS is a free and open source geographic information system for creating, editing, analysing and publishing
spatial data. It runs on desktop, server, web and mobile, is released under the GNU General Public License, and
is used worldwide by public administrations, companies, universities and NGOs. It is built by an international
community of volunteers and companies and governed by the QGIS.org Association. qgis.org

by Tim Sutton at October 13, 2026 11:10 AM

October 12, 2026

October 11, 2026

October 07, 2026

We see loads in the news about oil prices, the potential shortages caused by wars involving Iran and Russia and whether the UK should licence further oil extraction from existing oil fields in the North Sea. I wondered whether there was a mappy project opportunity around oil production and consumption. I started out with this prompt:

  • “I want to make a map based dashboard about oil production, consumption, refining and the flows between countries. before we start can you research what data is available at country level”

Claude found me these sources:

  • US EIA (public domain) for production and consumption
  • JODI for refinery throughput (free, with a required citation)
  • UN Comtrade for trade between countries (I asked; they replied that no licence was needed)
  • World Bank for population
  • Natural Earth for boundaries.

Claude reminded me that I needed to double check that open data was actually open for my use case after the debacle with IUCN data for my Endangered Species map and even drafted the request emails for me. The Energy Institute’s Statistical Review would have been very useful but it only allows “brief quotation”, so I used it just to cross-check my data. There are trade data for 211 countries, 1993–2024, 32 yearly trade files, all rebuilt by two Python scripts that I can rerun. Nobody publishes refinery capacity by country for free, so the map shows what refineries actually processed using the JODI data.

While I was waiting for the data approvals, Claude suggested that we build a prototype with some fake data to explore how the dashboard and map might interact. This helped me to realise early on that this would be more dashboard with the map showing trade flows and being a way of selecting countries in the dashboard. As I asked for more variables and measures (eg oil consumption per capita) and percentages of world totals and rankings the dashboard became more complex and needed a slight redesign to make it more intuitive (I am sure that there is more to do on this). I decided that I didn’t need base map tiles, because plain country shapes are enough and there is no reason to want to zoom into city level or below.

The initial build was pretty simple because most of the decisions had been worked out in the prototyping and turning that into an app with all the real data only took a few minutes as Claude knows my pretty simple architectural choices and just gets on with it. Most of the functional testing got done by Claude and it was pretty amazing to watch Claude open a browser tab and start whizzing through a series of tests, I found a few issues that needed a rerun but they were pretty minor.

I had a good functional working release tested on desktop and mobile (slightly more emphasis on the dashboard on mobile version) but it was a bit bland. I asked Claude to liven it up and it gave me 3 options, I ended up choosing a hybrid of 2 of the options and changing the font.

The data isn’t perfect and additionally doesn’t always mean exactly what a lay person might expect.

  • “Production” means all liquids (crude, NGLs, biofuels), not just crude. That’s why the US looks 22% of world output but is only 13.2 mb/d on crude alone.
  • Trade data comes from customs records but Russia stopped reporting in 2022, additionally sanctioned oil gets relabelled.
  • Oil passing through hubs is counted twice.
  • Weights are converted from tonnes using fixed barrels-per-tonne figures, so volumes are estimates.
  • Consumption includes ships’ fuel and chemical feedstock, which inflates places like Singapore.
  • My “refining balance” (does a country have sufficient refining capacity for all of its needs) idea didn’t survive contact with the data: the consumption total includes liquids that never see a refinery. So I built “own fuel supply” from trade data instead.

My stance: “It’s the best open data I could find, and I’ll swap it if you can point me at better open data.”

Surprising Oil Facts

  • China was almost self-sufficient in 1993 (a gap of −0.1 mb/d) and now imports about 11 mb/d. In the same year the US was the biggest importer (−7.6); today it has a surplus (+2.4).
  • Russia’s pivot: in 2021 Germany and the Netherlands were top buyers of Russian oil. In 2023 China took 2.0 mb/d and India 1.8, and the only European buyers left were the pipeline-fed ones.
  • Iran’s oil exports show as zero in 2024, and Malaysia appears to export 1.7 mb/d while producing 0.57. The missing barrels reach China relabelled.
  • Venezuela produced 3.4 mb/d in 1998 and 0.9 in 2024.
  • Singapore uses about 90 barrels per person a year, (this may be because of its role as a refuelling hub) against a world average of 4.6. Canada slightly beats the US (22.3 vs 22.0), and Australia uses double the UK.
  • India refines 9× its own crude and exports fuel
  • Nigeria exports crude but imports 46% of its fuel.
  • On crude alone the top producers reorder: the US, then Russia, then Saudi Arabia.
  • Global crude trade grew from 28 to 47 mb/d between 1993 and 2024.

<p>The post World Oil – who pumps it, who burns it and where it goes first appeared on KnowWhere.</p>

by Steven at October 07, 2026 05:27 PM

GeoSolutions at FOSS4G North America 2026, Sacramento, CA, November 2-4, 2026

Dear Reader,

From November 2 to 4, 2026, GeoSolutions will be at FOSS4G North America 2026 in Sacramento, California, at the Sheraton Grand Sacramento. Simone Giannecchini and Andrea Aime will be there for the whole conference, from Monday to Wednesday. You will find them at our table in the exhibit area, where GeoSolutions is present as a Bronze sponsor, and in the session rooms for our four talks. If you want to talk about GeoServer, MapStore or GeoNode, write to sales@geosolutionsgroup.com and we will book a slot.

Our talks

This year we bring four talks, all in the Technical track and all presented by Simone and Andrea. Times are Pacific Time. The schedule can still change, so please check the official schedule before you go.

  • AI-dministering GeoServer and MapStore, Tuesday, November 3, 2026 at 10:30 AM. An early look at the Model Context Protocol servers we are building for GeoServer and MapStore. They let today's AI assistants help with real administration tasks, such as publishing layers, tuning caches and diagnosing issues, with guardrails to keep production deployments safe.
  • State of GeoServer, Tuesday, November 3, 2026 at 11:00 AM. New features, community updates and recent developments of GeoServer, for expert users, developers and anyone curious about what GeoServer can do for them.
  • GeoServer VS GeoServer: fight!, Wednesday, November 4, 2026 at 2:00 PM. GeoServer benchmarked against itself. Each experiment measures the real performance cost of a common operator decision: data formats, security, logging, CRS handling, JVM settings and scaling.
  • Precision farming with GeoServer: lessons learned and future directions, Wednesday, November 4, 2026 at 3:30 PM. Ten years of experience ingesting, managing and disseminating drone, Earth observation and agricultural machinery data at scale for the precision farming industry, with GeoServer deployed in the cloud.

Come and talk to us

Beyond the talks, we will be at our table from the Welcome Icebreaker on Monday evening to the end of the exhibit hours on Wednesday. We are available for technical discussions of any depth: GeoServer performance and tuning, deployments at scale on premises and in the cloud, raster and Earth observation data, MapStore and GeoNode, and the AI work we present on Tuesday. Bring your questions and your use cases.

To fix a meeting in advance, write to sales@geosolutionsgroup.com.

About FOSS4G North America

FOSS4G North America is the North American edition of FOSS4G, the conference for free and open source software for geospatial. The theme of this year's edition is "Resilience and Innovation". Monday is dedicated to hands-on workshops, followed by two days of plenaries and concurrent sessions across four tracks: Technical, Application, Community of Practice and Business of Open Source. Registration is open at www.foss4gna.org.

As always, call on us, the core code developers and experts on:

  • GeoServer, the leading open source server to publish geospatial data at scale.
  • MapStore, our modular open source WebGIS product to create and publish geospatial data as maps, dashboards and geo stories.
  • GeoNode, the open source GIS platform to create a complete and interoperable spatial data infrastructure.

If you are interested in learning more about how we can help you achieve your needs with MapStore, GeoServer, GeoNode and GeoNetwork through our Enterprise Support Services, Professional Training Services and Subscription Services please contact us!

The GeoSolutions team,

320x100_eng

See also

by simone giannecchini at October 07, 2026 09:18 AM

5 Initiatives for Building Open Research Environment

How to establish an Open Science ecosystem at research-performing organizations?

Two weeks ago, we explored Open Science capacity building in our blog post. We highlighted that the burden of responsibility shouldn’t fall solely on the researchers, noting the crucial role universities play in establishing policies and guidelines. In this week’s post, we carry this thought a bit further and address the challenge:

How to establish an Open Science ecosystem at research-performing organizations?

As you can see in Figure 1, Open Science principles can play a role in every step of the research cycle. That said, we should not leave researchers to adopt these principles on their own. Instead, we need to establish an environment that actively supports, acknowledges, and mandates Open Science activities (cf. [1]). In the following paragraphs, we introduce five initiatives for establishing an Open Science ecosystem within research-performing organizations. While it might seem weird at first glance, even private companies driven by commercial interests can benefit from an open environment. More on this later, let’s get started!

Figure 1: Open Science principles throughout the research cycle. [Generated by Gemini]
Initiative 1: Status Quo and Requirement Analysis

It’s not unlikely that existing Open Science activities are underway at your academic organization – whether led by the library or the IT department. Maybe some dedicated faculty members striving for greater openness in research and teaching launched an activity? Rather than establish yet another service, the final goal should be to connect existing efforts and identify service gaps. At times, it may be more important to focus on visibility and findability; hence, a useful first step is getting an overview of these activities, interlinking them, and connecting with the individuals in charge.

At this stage it is also important to check which policies and guidelines are provided on the university or faculty level. Open science can gain more momentum if the leadership of the research institution promotes an Open Science strategy and commits to Open Access, Open Data or the FAIR principles [2]. The successful implementation of Open Science principles requires both bottom-up and top-down initiatives.

The next logical step is to initiate a requirement analysis. This can be accomplished using online questionnaires for a broader reach, conducting semi-structured interviews with selected department representatives for in-depth feedback, and hosting focus group discussions to elaborate on ideas to address identified gaps in Open Science services. Possible questions are:

  • Which Open Science practices would you like to learn more about?
  • Which obstacles prevent you from doing Open Science?
  • At which stage of the research process do you need support regarding Open Science?

Initiative 2: Open Science Knowledge Hub

A central entry point is essential for researchers, research support staff, and anyone else seeking guidance on Open Science. A web portal can navigate users to relevant resources and services. As people become increasingly used to interacting with artificial intelligence technologies, a chatbot could be a useful tool. However, direct access to specialists like an Open Science officer remains invaluable, particularly for those at the beginning of their Open Science journey who might not know what to search for. Such a website can collect requests, similar to software issue tracking. No need to search for the expert, the tickets will be assigned automatically! This hub can integrate services and consulting across Open Access, open and FAIR data management, repositories, and reproducibility.

Initiative 3: Open Educational Resources

The concept of Open Educational Resources (OER) is twofold: First, they complement the services identified in Initiatives 1 and 2 with learning materials, which are – surprise, surprise – openly accessible! Guidelines, recommendations, best practices, checklists, templates, and successful, real-world examples can be very helpful and address many needs. In addition, self-paced instructional videos allow learners to study at their own pace. Ideally, these materials are designed such that they can be reused or integrated into educational curricula, which brings us to the second aspect. Education is a core university function and publishing open educational materials can enhance its reputation, as seen in, for instance, the popular MIT OpenCourseWare. To achieve this, educators might need support with open licensing, metadata standards, and open-source tools software.

Initiative 4: Open Science Communities

The idea of so-called Open Science Communities originated in the Netherlands. The aim was to connect researchers and research support staff interested in Open Science through local networks. These communities foster collaboration and increase the visibility of existing expertise within research organizations by hosting webinars, hands-on workshops, and showcases of success stories. It’s a great way to share needs, concerns, doubts, address knowledge gaps, and discover solutions developed by other researchers. Today, many Open Science Communities thrive in different cities and countries alongside related initiatives, such as the Reproducibility Network.

Initiative 5: Funding

Whether we like it or not, Open Science is rarely considered during the execution of research projects. Consequently, researchers lack the time to release their data or software openly, as they write papers or finish their next grant proposals. Providing small funds can be very helpful to enable tangible Open Science activities, such as preparing data to align with the FAIR principles or creating software documentation to facilitate reuse. Furthermore, funding calls increasingly require dedicated Open Science sections in proposals to make sure that research outputs remain accessible and reusable after the project ends. Experts can assist researchers in drafting these sections and designing implementation strategies for Open Science principles.

All of the concepts summarized in these five initiatives center on the implementation of Open Science principles within research-performing organizations. However, private companies driven by commercial interests can also benefit from these principles. Many of them need to collect some sort of data, develop software, and write reports. Ideally, this should be done in a way that enables reusability. This is precisely where Open Science principles can help. Why shouldn’t we strive to make a company “more open internally”?

Figure 2: Summary of five initiatives for building an Open Science ecosystem. [Generated by Gemini]
To sum up, building an open environment within research-performing organizations requires understanding what researchers actually need and how to make the work of research support staff easier. Instead of developing yet another parallel service, the focus should be on increasing the visibility of existing services and integrating them into an all-comprising Open Science ecosystem. Of course, new services are necessary where gaps are identified. A central entry point (a central portal) serves as an effective starting point, while Open Educational Resources contribute to capacity building. Finally, whereas Open Science Communities can drive culture change, funding acts as a direct incentive for researchers.

If you want to learn more or need support to foster these initiatives, don’t hesitate to contact us!

See you next week!

References

  1. Konkol, M., Chang, L., Da Silva Mano, A., Deon, F., Koelen, M. T., Korringa, D., Mettinkhof, R., Nelson, A., Ostermann, F. O., Rietbroek, R., Werff, H. van . der ., Venus, V., & Zurita Milla, R. (2021). ITC’s Strategic Plan for Open Science 2021-2025 – Towards an Open Future. Zenodo. https://doi.org/10.5281/zenodo.5113578
  2. Wilkinson, M., Dumontier, M., Aalbersberg, I. et al. The FAIR Guiding Principles for scientific data management and stewardship. Sci Data 3, 160018 (2016). https://doi.org/10.1038/sdata.2016.18

by Markus Konkol at October 07, 2026 07:00 AM

October 06, 2026

October 05, 2026

Quando uma infraestrutura geoespacial começa a ser utilizada por diferentes equipes de uma organização, chega um momento em que manter usuários e senhas diretamente no GeoNode deixa de ser uma boa estratégia.

O usuário já possui uma identidade corporativa. Ele já entra em outros sistemas com a mesma conta. Em muitos casos, seus grupos e perfis também já são gerenciados centralmente.

Nesse cenário, uma alternativa interessante é integrar o GeoNode a um provedor de identidade utilizando OpenID Connect (OIDC).

O objetivo deste artigo é mostrar um exemplo genérico de integração de um GeoNode 5 com um provedor OIDC, incluindo não apenas o login, mas também a utilização das claims retornadas pelo provedor para associar automaticamente o usuário aos grupos do GeoNode.

A arquitetura é aproximadamente esta:

O detalhe interessante é que o GeoNode não precisa saber como o Identity Provider (IdP) autenticou o usuário. Por trás do IdP pode existir LDAP, Active Directory, outro diretório corporativo ou até outro serviço de identidade. Para o GeoNode, isso é transparente.

OIDC, OAuth 2.0 e autenticação

É comum OAuth 2.0 e OpenID Connect aparecerem juntos, mas eles não representam exatamente a mesma coisa.

  • OAuth 2.0 foi criado principalmente para autorização.
  • OpenID Connect acrescenta uma camada de identidade e autenticação sobre o OAuth 2.0.

É por isso que em uma integração OIDC normalmente aparecem informações como: authorization_endpoint, token_endpoint, userinfo_endpoint, jwks_uri, issuer. Além de scopes como: openid, profile e email.

Para aplicações corporativas, frequentemente aparecem também scopes ou claims relacionadas a grupos e roles.

Ambiente utilizado neste exemplo

Este artigo considera uma instalação do GeoNode 5 baseada no geonode-project e executada com Docker Compose.

Os comandos docker compose devem ser executados no diretório raiz do projeto, onde está o arquivo docker-compose.yml.

Nos exemplos abaixo, utilizarei geonode_project como nome do pacote Django. Caso seu projeto utilize outro nome, substitua geonode_project pelo nome correspondente.

1. O Discovery Document

Uma das primeiras informações que devemos solicitar à equipe responsável pelo Identity Provider é a URL de discovery do OIDC. Normalmente ela segue este padrão:

https://idp.exemplo.org/.well-known/openid-configuration ou https://idp.exemplo.org/security/.well-known/openid-configuration

Ao acessar essa URL, recebemos um JSON semelhante a:

{
  "issuer": "https://idp.exemplo.org/",
  "authorization_endpoint": "https://idp.exemplo.org/connect/authorize",
  "token_endpoint": "https://idp.exemplo.org/connect/token",
  "userinfo_endpoint": "https://idp.exemplo.org/connect/userinfo",
  "jwks_uri": "https://idp.exemplo.org/.well-known/jwks",
  "scopes_supported": [
    "openid",
    "profile",
    "email",
    "roles"
  ]
}

Esse documento funciona praticamente como um mapa da integração.

2. Registrar o GeoNode como client

No lado do Identity Provider, o GeoNode precisa ser registrado como uma aplicação/client. De maneira simplificada, teremos algo como:

Client ID:
geonode

Client Secret:
**************

Redirect URI:
https://geo.exemplo.org/account/oidc/corp-idp/login/callback/

A URL de callback deve coincidir exatamente com a rota exposta pela versão do GeoNode/django-allauth utilizada. Confirme a URL do seu ambiente antes de registrá-la no Identity Provider.

O nome corp-idp neste artigo é apenas um exemplo. Esse identificador será utilizado posteriormente pelo django-allauth para identificar o provedor. Um cuidado importante: o Client Secret não deve ficar diretamente no código-fonte nem ser enviado ao Git. O ideal é mantê-lo em variável de ambiente:

OIDC_CLIENT_ID=geonode
OIDC_CLIENT_SECRET=xxxxxxxxxxxxxxxx
OIDC_DISCOVERY_URL=https://idp.exemplo.org/.well-known/openid-configuration

3. Criando settings específicos

Uma estratégia que considero interessante é não alterar diretamente o settings.py original do GeoNode. Podemos criar, por exemplo: src/geonode_project/corporate_settings.py com o seguinte conteúdo:

import os

from .settings import *


OIDC_CLIENT_ID = os.getenv(
    "OIDC_CLIENT_ID",
    "geonode",
)

OIDC_CLIENT_SECRET = os.getenv(
    "OIDC_CLIENT_SECRET",
    "",
)

OIDC_DISCOVERY_URL = os.getenv(
    "OIDC_DISCOVERY_URL",
    "",
)

E então definir no ambiente:

DJANGO_SETTINGS_MODULE=geonode_project.corporate_settings

Isso facilita bastante manutenção, deploy e rollback.

4. Habilitando o provider OpenID Connect

O GeoNode utiliza django-allauth para parte da integração com contas sociais/federadas. O código atual do projeto continua trazendo um GenericOpenIDConnectAdaptere mecanismos próprios para extrair atributos e sincronizar grupos. Podemos registrar o provider desta forma:

OIDC_PROVIDER_APP = (
    "allauth.socialaccount.providers.openid_connect"
)

if OIDC_PROVIDER_APP not in INSTALLED_APPS:
    INSTALLED_APPS += (OIDC_PROVIDER_APP,)


SOCIALACCOUNT_PROVIDERS = dict(
    SOCIALACCOUNT_PROVIDERS
)

SOCIALACCOUNT_PROVIDERS["openid_connect"] = {
    "OAUTH_PKCE_ENABLED": True,

    "SCOPE": [
        "openid",
        "profile",
        "email",
        "roles",
    ],

    "APPS": [
        {
            "provider_id": "corp-idp",

            "name": "Login Corporativo",

            "client_id": OIDC_CLIENT_ID,

            "secret": OIDC_CLIENT_SECRET,

            "settings": {
                "server_url": OIDC_DISCOVERY_URL,
            },
        }
    ],
}

O scope roles utilizado neste exemplo não é obrigatório no padrão OIDC. Os scopes e claims disponíveis dependem do Identity Provider. Alguns provedores retornam grupos/roles com outros scopes ou apenas pelo endpoint userinfo.

Também podemos permitir criação automática da conta local:

SOCIALACCOUNT_AUTO_SIGNUP = True

Durante homologação, particularmente prefiro manter o login local disponível:

SOCIALACCOUNT_ONLY = False

Assim, caso algo dê errado com o IdP, ainda existe uma forma administrativa de entrar no GeoNode.

5. Primeiro teste: autenticação apenas

Neste momento eu ainda não me preocuparia com grupos. O primeiro objetivo é provar apenas este fluxo:

Depois de reiniciar a aplicação:

docker compose up -d --build django celery

Valide:

docker compose exec django python manage.py check

Podemos também acompanhar o log:

docker compose logs -f --tail=200 django

Ao clicar em Login Corporativo, devemos ser redirecionados ao IdP e, após a autenticação, voltar para algo semelhante a: /account/oidc/corp-idp/login/callback/

Se o usuário for criado e entrar no GeoNode, a primeira etapa está concluída.

6. O que o Identity Provider enviou?

Depois da autenticação, uma das etapas mais importantes é verificar o conteúdo recebido. Um conjunto de claims pode ser parecido com:

{
  "sub": "5d823759-3dc0-4414-a936-2ef659829321",

  "name": "Fernando Quadro",

  "preferred_username": "fernando.quadro",

  "email": "fernando.quadro@exemplo.org",

  "given_name": "Fernando",

  "family_name": "Quadro",

  "role": [
    "gestores"
  ]
}

O campo mais importante do ponto de vista de identidade é normalmente o sub, ou Subject Identifier, que é o identificador estável daquele usuário dentro do provedor. Nome, username e até e-mail podem mudar. O sub não deveria.

7. Consultando as claims armazenadas pelo GeoNode

Podemos verificar exatamente o que ficou armazenado no SocialAccount. Por exemplo:

docker compose exec django python manage.py shell -c "
import json

from allauth.socialaccount.models import SocialAccount

for account in (
    SocialAccount.objects
    .filter(provider='corp-idp')
    .select_related('user')
):
    print('GeoNode:', account.user.username)
    print('UID/sub:', account.uid)

    print(
        json.dumps(
            account.extra_data,
            indent=2,
            ensure_ascii=False
        )
    )

    print()
"

Esse comando é extremamente útil durante uma homologação. Antes de escrever qualquer lógica de grupos, vale confirmar:

  • sub
  • email
  • preferred_username
  • given_name
  • family_name
  • role / roles
  • groups

E principalmente os tipos desses atributos. Uma role pode chegar como: “role”: “gestores” ou “role”: [“gestores”]

Essas diferenças parecem pequenas, mas fazem bastante diferença no código.

8. GeoNode já possui mecanismo para sincronizar grupos

Aqui existe uma parte interessante do GeoNode que nem sempre é muito conhecida. O projeto possui um mecanismo de Profile Extractors. A própria classe base explica que extractors customizados podem ser registrados através de: SOCIALACCOUNT_PROFILE_EXTRACTORS

Existe também um OpenIDExtractor. Entre outras coisas, ele possui:

def extract_groups(self, data):
    return data.get("groups", "")

def extract_roles(self, data):
    return data.get("roles", "")

Perceba um detalhe. Ele procura roles no plural. Mas nosso Identity Provider fictício retorna role no singular. É exatamente aí que um pequeno extractor customizado pode ser útil.

9. Criando um extractor específico

Vamos criar esse extractor na pasta src/geonode_project/corporate_auth.

Primeiro o arquivo profileextractors.py:

import logging

from geonode.people.profileextractors import (
    OpenIDExtractor,
)


logger = logging.getLogger(__name__)


class CorporateOpenIDExtractor(OpenIDExtractor):

    ROLE_MAPPING = {
        "publico": "publico",
        "analistas": "analistas",
        "gestores": "gestores",

        # Compatibilidade com outra nomenclatura
        "role_publico": "publico",
        "role_analistas": "analistas",
        "role_gestores": "gestores",
    }

    def extract_roles(self, data):

        roles = data.get("role", [])

        if isinstance(roles, str):
            roles = [roles]

        mapped_roles = [
            self.ROLE_MAPPING[role]
            for role in roles
            if role in self.ROLE_MAPPING
        ]

        unknown_roles = [
            role
            for role in roles
            if role not in self.ROLE_MAPPING
        ]

        if unknown_roles:
            logger.warning(
                "OIDC retornou roles não mapeadas: %s",
                unknown_roles,
            )

        return mapped_roles

Perceba que esse código não implementa autenticação. Ele também não implementa a associação ao grupo. Sua única responsabilidade é:

claim do IdP
↓
normalização
↓
slug conhecido pelo GeoNode

10. Registrando o extractor

Vamos registrar o extractor no arquivo src/geonode_project/corporate_settings.py:

SOCIALACCOUNT_PROFILE_EXTRACTORS = dict(
    SOCIALACCOUNT_PROFILE_EXTRACTORS
)

SOCIALACCOUNT_PROFILE_EXTRACTORS[
    "corp-idp"
] = (
    "geonode_project."
    "geonode.corporate_auth."
    "profileextractors."
    "CorporateOpenIDExtractor"
)

Para testar se funcionou, você pode usar o comando abaixo:

docker compose exec django python manage.py shell -c "
from geonode.people.adapters import get_data_extractor

extractor = get_data_extractor('corp-idp')

print(
    extractor.__class__.__module__
    + '.'
    + extractor.__class__.__name__
)
"

O resultado esperado é: geonode_project.corporate_auth.profileextractors.CorporateOpenIDExtractor

Por último, vamos validar o adapter:

docker compose exec django python manage.py shell -c "
from django.conf import settings
from geonode.people.adapters import get_data_extractor

print(
    'SETTINGS:',
    settings.SETTINGS_MODULE
)

print(
    'ADAPTER:',
    settings.SOCIALACCOUNT_ADAPTER
)

print(
    'EXTRACTOR:',
    get_data_extractor('corp-idp')
)
"

O resultado esperado é:

SETTINGS:
geonode_project.corporate_settings

ADAPTER:
geonode.people.adapters.GenericOpenIDConnectAdapter

EXTRACTOR:
<...CorporateOpenIDExtractor object...>

11. Criando os grupos no GeoNode

No GeoNode, acesse Grupos → Criar um Novo Grupo e crie Público, Analistas e Gestores, garantindo que os slugs sejam respectivamente publico, analistas e gestores.

Agora criamos os GroupProfile: Público, Analistas e Gestores com os seguintes slugs: publico, analistas e gestores. Esse detalhe é importante. O mecanismo de associação procura o grupo pelo slug, não pelo título visual.

Então: role = gestores

Precisa resular em: slug = gestores

12. O que acontece no login?

O GeoNode possui uma rotina interna para sincronizar grupos provenientes da conta social. O código atual busca o extractor correspondente ao provider, extrai groups ou roles, localiza o GroupProfile pelo slug e executa join(user).

O GenericOpenIDConnectAdapter chama essa sincronização tanto na criação da conta quanto em logins posteriores. GitHub O fluxo fica:

É uma solução interessante porque aproveita a infraestrutura que já existe no GeoNode em vez de criar um segundo sistema paralelo de autorização.

13. Sincronização em logins seguintes

Essa parte é especialmente importante em ambientes corporativos. Imagine:

Na segunda-feira o usuário “fernando.quadro” foi colocado na role analistas. O usuário acessa o GeoNode e é inserido no grupo Analistas. Posterior a essa data o administrador alterar o perfil desse usuário para a role gestores.

No próximo login, a associação pode ser sincronizada novamente. Na versão atual do código do GeoNode, inclusive, existem estratégias explícitas para sincronização dos grupos sociais, e o adapter continua executando essa lógica no pre_social_login.

Isso permite tratar o provedor corporativo como fonte da verdade da associação de grupos.

⚠ Atenção

Na estratégia nativa apresentada, durante o login social o GeoNode pode remover os
GroupProfile atualmente associados ao usuário e recriar as associações com base nos grupos ou roles recebidos do Identity Provider.

Portanto, esta abordagem é apropriada quando o Identity Provider é realmente
a fonte de verdade dos grupos corporativos
. Se a mesma conta também precisar
pertencer a grupos do GeoNode administrados localmente e que não são enviados pelo IdP, a estratégia de sincronização deverá ser customizada.

14. E administradores?

Eu separaria duas coisas: grupo funcional e privilégio administrativo do GeoNode. Um grupo chamado Gestores não significa necessariamente que esse usuário tem privilégios de Staff e/ou Superusuário.

Você pode criar uma role especial chamada admin, com isso é possível implementar uma pequena lógica adicional, por exemplo usando um signal do django-allauth, para controlar explicitamente:

user.is_staff = True
user.is_superuser = True

Essa separação evita transformar um grupo corporativo em sinônimo de superusuário da aplicação.

O tratamento de administradores é uma política adicional e não faz parte da configuração mínima necessária para autenticação OIDC e sincronização de grupos deste artigo.

15. Verificando usuários e grupos

Depois da implementação acima, é interessante realizar alguns testes de auditoria rápida:

docker compose exec django python manage.py shell -c "
from allauth.socialaccount.models import (
    SocialAccount,
)

for account in (
    SocialAccount.objects
    .filter(provider='corp-idp')
    .select_related('user')
):
    user = account.user
    data = account.extra_data or {}

    print(
        user.username,
        '| role(s):', data.get('role') or data.get('roles'),
        '| grupos:',
        [
            (g.title, g.slug)
            for g in user.group_list_all()
        ],
        '| staff:', user.is_staff,
        '| superuser:', user.is_superuser,
    )
"

A saída será algo semelhante a:

fernando.quadro
| role(s): ['gestores']
| grupos: [('Gestores', 'gestores')]
| staff: False
| superuser: False

Isso permite verificar em uma única consulta claim recebida, role, grupo no GeoNode e status administrativo.

16. Conclusão

Integrar o GeoNode a um Identity Provider via OpenID Connect não precisa significar criar uma grande camada customizada de autenticação. Boa parte da infraestrutura já existe no próprio GeoNode e no django-allauth. O ponto mais importante é entender o contrato entre os dois sistemas:

  • Qual provider?
  • Qual callback?
  • Quais scopes?
  • Quais claims?
  • Qual identificador do usuário?
  • Como chegam grupos e roles?
  • Qual slug existe no GeoNode?

A partir daí, um pequeno extractor pode ser suficiente para adaptar as claims corporativas à estrutura de grupos utilizada pelo GeoNode.

O resultado é uma arquitetura em que a identidade fica centralizada no serviço corporativo e o GeoNode continua responsável pelo que faz melhor: controlar o acesso aos recursos geoespaciais.

by Fernando Quadro at October 05, 2026 09:54 PM

October 03, 2026

Dear QGIS community


We know that many of you were waiting patiently for the next LTR release based on QGIS 4.x and Qt6.

However, there are still a number of issues with the 4.x builds which leave us hesitant to assign LTR status to a 4.2.x release as originally planned. To address this, we will be taking the following steps:

  • Create a new LTR 4.x Blocker tag for issues that need to be resolved
  • Request developers to tag any breaking features with the new blocker tag so we have a clear sense of what needs to be done
  • Keep feature freeze until all blockers are gone.
  • Stick to current schedule — but QGIS 4.2 will no longer be LTR
  • Extend the QGIS 4.4 paid bug fixing period to 6 weeks instead of 4 (and retain 4 week feature freeze)
  • Disable broken features if needed and communicate the feature regressions as part of the changelog
  • If there are still remaining blockers that we cannot simply disable at the end of the 6 weeks we will extend the release (last resort option)

As per the table above, the currently anticipated date for the QGIS 4.4.4 release (which is scheduled to become LTR) is 5 March 2027.

For now, future LTR releases are keeping their original schedule. Please watch the news feed in QGIS for further updates if you want to keep track of our progress. You can also follow our plans on the release roadmap page.

Thank you,

Tim Sutton, on behalf of the QGIS PSC

by Tim Sutton at October 03, 2026 02:25 PM