Welcome to Planet OSGeo

August 14, 2026

TorchGeo 0.10.0 Release Notes

TorchGeo 0.10 is the largest release in TorchGeo history, with a record 220 PRs from a record 29 contributors over the last 6 months. It includes full time series support, fiscal sponsorship, and security hardening, among many other exciting new features!

Highlights of this release

Full time series support

The last two years have seen a dedicated effort to add full time series support to TorchGeo. As of this release, TorchGeo contains dozens of time series benchmark datasets:

  • Temporal classification: CropHarvest
  • Temporal regression: Air Quality (new), Western USA Live Fuel Moisture
  • Change detection: BRIGHT, CaBuAr, ChaBuD, Copernicus-Bench, LEVIR-CD, LEVIR-CD+, OSCD, xBD, xBD DistShift (new)
  • Spatiotemporal classification: Copernicus-Bench, Digital Typhoon, QuakeSet
  • Spatiotemporal regression: Digital Typhoon, SKIPP'D, SustainBench, QuakeSet
  • Spatiotemporal segmentation: Benin Cashew Plantations, Copernicus-Bench, FLAIR-HUB (new), Kenya Crop Type, PASTIS, Rwanda Field Boundary, SeasoNet, South Africa Crop Type, Substation, ZueriCrop
  • Spatiotemporal pixelwise regression: BioMassters, Copernicus-Bench

and a dozen time series models:

  • 1D time series: L-TAE, Presto, Tessera
  • 3D change detection: BTC, ChangeStar, ChangeViT, FC-Siamese Networks
  • 3D SITS: ConvLSTM, Conv3dLSTM (new), OlmoEarth (new), Satlas
  • 4D ocean and atmosphere: Aurora

We also now have temporal and spatiotemporal tasks for PyTorch Lightning integration:

  • 1D: temporal regression (new)
  • 3D: change detection, spatiotemporal segmentation (new), spatiotemporal pixelwise regression (new)

This release required a complete redesign of our samplers, replacing our old file-based samplers with separate spatial and temporal samplers. In particular, TorchGeo now provides several spatial sampling strategies:

RandomPatchSamplerGriddedPatchSampler

and temporal sampling strategies:

RandomTimestampSamplerSequentialTimedeltaSampler

Users can also take the cross-product of any two spatial and temporal samplers to support spatiotemporal sampling. For example, a training and inference pipeline for crop type mapping using Landsat and CDL might start with:

# Datasets
landsat7 = Landsat7(..., time_series=True)  # B x T x C x H x W - dynamic
landsat8 = Landsat8(..., time_series=True)  # B x T x C x H x W - dynamic
cdl = CDL(..., time_series=False)  # B x H x W - static mosaic

dataset = (landsat7 | landsat8) & cdl
train_dataset, test_dataset = random_grid_cell_assignment(dataset, [0.6, 0.4])

# Samplers
spatial_random = RandomPatchSampler(train_dataset, size=224) 
temporal_random = RandomPeriodSampler(train_dataset, freq='Y')  # annual frequency
train_sampler = spatial_random @ temporal_random

spatial_sequential = GriddedPatchSampler(test_dataset, size=224, stride=112)
temporal_sequential = SequentialPeriodSampler(test_dataset, freq='Y')  # annual frequency
test_sampler = spatial_sequential @ temporal_sequential

# Data loaders
train_dataloader = DataLoader(train_dataset, sampler=train_sampler)
test_dataloader = DataLoader(test_dataset, sampler=test_sampler)

All GeoDatasets and GeoSamplers are compatible with full time series support. We're excited to see what new research directions our users come up with using these new flexible sampling strategies!

Fiscal sponsorship and new projects

The TorchGeo organization is now a fiscally sponsored program of Radiant Earth, a 501(c)(3) public charity. This means you can now sponsor maintenance needs, bug fixes, new features, or an annual TorchGeo workshop, and it's all tax-deductible (at least in the US)! See https://github.com/sponsors/torchgeo to make a monthly or one-time donation and help advertise your organization or gain a seat on our Technical Steering Committee.

image

Several new related projects joined the TorchGeo organization, including:

We also welcomed two new TSC members and one new maintainer:

Security hardening

LLMs have made keeping up with security... a fun challenge. This release includes a number of important steps to harden security across TorchGeo:

  • Clarifications to our security policy (#3952)
  • Datasets: checksum by default (#3930)
  • Models: checksum by default (#3929)
  • Convert many datasets from MD5 to SHA256 checksums (#3428, #3894, #3899, #3946)
  • Always use torch.load(weights_only=True) (#3893, #3957)

All users are recommended to update to the latest version of TorchGeo, especially if they expose its datasets or trainers to external users or like to load checkpoints from random strangers online...

Backwards-incompatible changes

Warning

This release contains a number of backwards-incompatible changes in preparation for an upcoming 1.0 release.

The torchgeo.trainers subpackage was renamed to torchgeo.tasks and the Task suffix was dropped. This puts us more inline with the naming scheme of other libraries like TerraTorch and Lightning Flash. It also removes confusion between torchgeo.trainers and lightning.pytorch.Trainer. See #996 for discussion.

Tip

To migrate, change imports like:

from torchgeo.trainers import ClassificationTask

to:

from torchgeo.tasks import Classification

The torchgeo.samplers subpackage underwent a complete redesign. All prior file-based samplers are now deprecated in favor of the new spatial and temporal samplers. See #3552 for discussion. Note that some samplers like RandomBatchGeoSampler and PrechippedGeoSampler do not have an exact replacement.

Tip

To migrate, change imports like:

from torchgeo.samplers import RandomGeoSampler
from torchgeo.samplers import GridGeoSampler

to:

from torchgeo.samplers import RandomPatchSampler
from torchgeo.samplers import GriddedPatchSampler

The Sample returned by all TorchGeo datasets is now consistently of type dict[str, Tensor]. All non-Tensor return values have either been converted to a Tensor (when possible) or removed (when not). This ensures that all TorchGeo datasets are compatible with PyTorch's default collate_fn and Lightning's default transfer_batch_to_device. See #985 for discussion. In particular:

  • Copernicus-Pretrain: remove JSON metadata (#3458)
  • MMEarth: remove avail_bands metadata (#3464)
  • SKIPP'D: remove date key (#3438)
  • SkyScript: caption is now tokenized (#3788)
  • VHR-10: do not return empty list of annotations for samples without objects (#3481)

In order to unify much of TorchGeo's plotting logic, a new PlottingMixin was introduced to standardize more features. In particular, all_bands and rgb_bands are now consistently a list of str band names and cmap is now compatible with matplotlib.pyplot.imshow. See #3774 for discussion.

Other minor backwards-incompatible changes include:

  • ConvLSTM: remove batch_first parameter (#3280)
  • MMEarth: several helper functions are now private (#3497)
  • OSCD: alpha parameter of plot method is now deprecated (#3571)
  • Semantic segmentation: time-series input is now deprecated (#3648)
  • Type-related errors were changed from ValueError to TypeError (#3907)

Dependencies

New dependencies

Changes to existing dependencies

  • geopandas: 1+ is now required (#3444)
  • jsonargparse: 4.39+ is now required (#3742)
  • jsonargparse: jsonnet signature is now required (#3742)
  • lightly: 1.5.1+ is now required (#3521)
  • lightning: 2.4+ is now required (#3444)
  • myst-parser: 5.1+ is now required (#3708)
  • pydata-sphinx-theme: 0.18+ is now required (#3726)
  • pytest: fix support for 10+ (#3835)
  • ruff: 0.16+ is now required (#3898)
  • sphinx: 8+ is now required (#3726)
  • torchmetrics: 1.5+ is now required (#3668)
  • torchmetrics: detection extra is now required (#3563)
  • webdataset: 0.2.101+ is now required (#3957)

Removed dependencies

Datasets

New datasets

Changes to existing datasets

  • AgriFieldNet: fix filehandle leak (#3795)
  • AgriFieldNet: add res parameter (#3795)
  • ChesapeakeCVPR: don't download prior unless necessary (#3955)
  • ChesapeakeCVPR: fix under-sized patches at raster edges (#3688)
  • Clay Embeddings: add support for v1.5 NAIP embeddings (#3518)
  • Inria Aerial Image Labeling: fix obscure regex replacement bug (#3537)
  • Landsat 4/5 TM: fix default bands (#3956)
  • NCCM: fix download URL (#3943)
  • OSCD: improved plotting (#3571)
  • PASTIS: support custom band subsets (#3647)
  • PASTIS: better normalization during plotting (#3646, #3881)
  • PASTIS 100: add to docs (#3641)
  • Sentinel-2: extract true valid data footprint from .SAFE metadata (#2991, #3847)
  • SkyScript: tokenize caption, add tokenizer parameter (#3788)
  • USAVars: fix download URL (#3955)
  • VHR-10: derive length dynamically instead of hard-coding (#3989)

Changes to dataset base classes

  • GeoDataset: list files in VSI paths (#1399)
  • IntersectionDataset: fix obscure bug when intersecting many datasets (#3722)
  • PlottingMixin: add mixin to reduce duplicated plotting code (#3775, #3789, #3831)
  • RasterDataset: store valid data footprint in geometries (#2903)
  • RasterDataset: add ability to override nodata value (#3847)
  • RasterDataset: decouple index CRS and read CRS (#3804)
  • RasterDataset: support georeferences via GCPs (#3404)
  • XarrayDataset: add support for upside down rasters (#3849)

Utilities

  • Add a progress bar to dataset downloads (#3961)
  • Add a user-agent to dataset downloads (#3732)
  • Add utility to compute valid-data footprints from raster masks (#3663)
  • Add utility for quantile normalization (#3451, #3652)

Data modules

New data modules

Changes to existing data modules

  • Inria Aerial Image Labeling: remove time series dimension hack (#3538)
  • OSCD 100: correct normalization values (#3532)

Models

New models

Changes to existing models

  • BTC: derive feature channels statically to improve throughput (#3758)
  • ConvLSTM: add classification head, forward_features (#3280)
  • CROMA: support non-float32 dtypes (#3974)
  • DOFA: support non-float32 dtypes (#3975)
  • DOFA: document Sentinel-1 wavelength convention (#3942)
  • L-TAE: fix backpropagation bug due to inplace operations (#3737)
  • RCF: support non-float32 dtypes (#3976)
  • Tessera: document correct Sentinel-2 band order (#3673)

Profilers

Samplers

  • Refactor and add time series support (#3552, #3787)

Tasks

New tasks

  • MAE (#3521)
  • Spatiotemporal pixelwise regression (#3086)
  • Spatiotemporal segmentation (#3962)
  • Temporal regression (#3668)

New mixins

Changes to existing tasks

  • BYOL: fix decoupling between student and teacher networks (#3954)
  • MoCo: fix support for non-default augmentations (#3935)
  • SimCLR: fix support for non-default augmentations (#3935)

Transforms

Documentation

API docs

  • Refactor torchgeo.tasks docs (#3749, #3805)
  • Add changelog (#3425)
  • Add descriptions to type aliases (#3510)
  • Add link to GitHub source code (#3572)
  • Fix version switcher (#3693)
  • Fix broken links (#3752, #3607, #3971)
  • Remove duplicate type hints (#3466)

User docs

  • Add uv installation instructions (#3546, #3702, #3753)
  • Contributing: document files to modify when adding new models (#3526)
  • Glossary: clarify difference between 'index' and 'query' (#3829)

Related libraries

  • Add AIDE (#3589)
  • Add py4dgeo (#3846)
  • Add rs-embed (#3627)
  • DeepForest has a CLI, switched to Kornia (#3468)
  • TorchGeo now has time-series support (#3980)
  • TorchGeo STAC support is a WIP (#3523)
  • Update metrics (#3980)

Tutorials

  • Add change detection tutorial (#3222)
  • Add NAIP road segmentation tutorial (#3446, #3745)
  • Update earth surface water tutorial (#3377, #3480)
  • Use pretrained weights in CLI tutorial (#3527)
  • Convert installs from pip to uv (#3756)

Governance

  • Adopt AI policy (#3632, #3830)
  • Add CODEOWNERS (#3467, #3661)
  • Add new maintainer (#3657)
  • Update maintainer affiliation (#3501, #3604)
  • Document criteria for becoming a maintainer (#3509)
  • Fix typos in governance docs (#3598)
  • Move images/logo directories to docs/_static (#3427)
  • Add sponsorship badge (#3639, #3833)
  • Add Zenodo badge (#3638)
  • Add Hugging Face logo (#3726)

Testing

Contributors

This release is made possible thanks to the following contributors:

by adamjstewart at August 14, 2026 08:09 PM

GeoServer 3.0.1 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.1 is made in conjunction with GeoTools 35.1, and GeoWebCache 2.0.1.

Thanks to Andrea Aime (GeoSolutions) and Jody Garnett (GeoCat) for making this release.

Security Considerations

This release addresses security vulnerabilities and is an urgent update for production systems.

  • GHSA-mqjf-5f49-2fjh Unauthenticated SQL injection in the jsonArrayContains filter function against PostGIS layers (High)

    This releases includes the GeoTools 35.1 resolution of the above SQL Injection vulnerability that: requires a Text or JSON column; affects PostGIS 12 and up.

    We would like to thank those who reported the problem following our coordinated vulnerability disclosure policy; unfortunately the issue was subject to public disclosure prior to our intended release schedule. This post will be updated with an official CVE number when one is available.

The use of the CVE system allows the GeoServer team to reach a wider audience than blog posts. See project security policy for more information on how security vulnerabilities are managed.

Release notes

New Feature:

  • GEOS-12158 Keycloak Role Service for use alongside OIDC Extension

Improvement:

  • GEOS-12095 LDAP: conversion from group-member-username to user-search username
  • GEOS-12124 Make GWC seeder thread pool sizes configurable via gwc-gs.xml and environment variables
  • GEOS-12139 GSIP 241 - GeoWebCache Security-Aware Tile Caching
  • GEOS-12140 Improve CoverageAccessLimits’s RasterFilter masking on SecureGridCoverage2DReader reading
  • GEOS-12141 WMS nearest match machinery can issue queries that are guaranteed to return an empty result
  • GEOS-12151 Allow caching small images used by ImageMosaic in memory
  • GEOS-12154 Improve URL validation in SLD processing
  • GEOS-12169 Update MapML viewer to v0.18.0

Bug:

  • GEOS-11373 Geometry type mismatch in WFS 1.1.0
  • GEOS-12144 “application/vnd.ogc.fg+json” output format fails when requesting non-geographical datasets
  • GEOS-12145 Missing spatial filter in GeoFenceAccessManager SQL query when only CLIP is applied
  • GEOS-12146 Wrong CRS axis order used in SecuredFeatureSource when clipping features for WFS 2.0.0 requests
  • GEOS-12149 GeoServer WMTS capabilities put query parameters in the wrong place in generated URLs
  • GEOS-12165 GeoServer does not start when fileLockProvider is set: lock wait times out

Sub-task:

For the complete list see 3.0.1 release notes.

Community Updates

Community module development:

  • GEOS-12173 Remove the REST module profile from community modules as the module does not exist here

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.1 | 3.0.0 )

by Jody Garnett at August 14, 2026 12:00 AM

GeoServer 2.28.5 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.5 is made in conjunction with GeoTools 34.5, and GeoWebCache 1.28.5.

Thanks to Andrea Aime (GeoSolutions) and Jody Garnett (GeoCat) for making this release.

Security Considerations

This release addresses security vulnerabilities and is an urgent update for production systems.

  • GHSA-mqjf-5f49-2fjh Unauthenticated SQL injection in the jsonArrayContains filter function against PostGIS layers (High)

    This releases includes the GeoTools 35.1 resolution of the above SQL Injection vulnerability that: requires a Text or JSON column; affects PostGIS 12 and up.

    We would like to thank those who reported the problem following our coordinated vulnerability disclosure policy; unfortunately the issue was subject to public disclosure prior to our intended release schedule. This post will be updated with an official CVE number when one is available.

The use of the CVE system allows the GeoServer team to reach a wider audience than blog posts. See project security policy for more information on how security vulnerabilities are managed.

Release notes

Improvement:

  • GEOS-12080 style edit: check image loads
  • GEOS-12082 CoverageStore - quick fail for incorrect files
  • GEOS-12095 LDAP: conversion from group-member-username to user-search username
  • GEOS-12140 Improve CoverageAccessLimits’s RasterFilter masking on SecureGridCoverage2DReader reading
  • GEOS-12141 WMS nearest match machinery can issue queries that are guaranteed to return an empty result
  • GEOS-12151 Allow caching small images used by ImageMosaic in memory

Bug:

  • GEOS-11373 Geometry type mismatch in WFS 1.1.0
  • GEOS-11571 The geoserver-2.26.0-printing-plugin is missing some dependend libraries
  • GEOS-12138 Improve DescribeDomains expandLimit validation
  • GEOS-12145 Missing spatial filter in GeoFenceAccessManager SQL query when only CLIP is applied
  • GEOS-12146 Wrong CRS axis order used in SecuredFeatureSource when clipping features for WFS 2.0.0 requests
  • GEOS-12149 GeoServer WMTS capabilities put query parameters in the wrong place in generated URLs
  • GEOS-12165 GeoServer does not start when fileLockProvider is set: lock wait times out

Task:

  • GEOS-12137 Update OSHI from 6.8.2 to 7.3.0
  • GEOS-12148 Update GetFeatureInfo to list features (rather than as a table)

Sub-task:

For the complete list see 2.28.5 release notes.

Community Updates

Community module development:

  • GEOS-12129 Longitudinal profile positive altitude includes first elevation as ascent from zero
  • GEOS-12173 Remove the REST module profile from community modules as the module does not exist here

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.5 | 2.28.4 | 2.28.3 | 2.28.2 | 2.28.1 | 2.28.0 )

by Jody Garnett at August 14, 2026 12:00 AM

GeoServer 2.27.6 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.6 is made in conjunction with GeoTools 33.6.

Thanks to Andrea Aime (GeoSolutions) and Jody Garnett (GeoCat) for making this release.

Security Considerations

This release addresses security vulnerabilities and is an urgent update for production systems.

  • GHSA-mqjf-5f49-2fjh Unauthenticated SQL injection in the jsonArrayContains filter function against PostGIS layers (High)

    This releases includes the GeoTools 35.1 resolution of the above SQL Injection vulnerability that: requires a Text or JSON column; affects PostGIS 12 and up.

    We would like to thank those who reported the problem following our coordinated vulnerability disclosure policy; unfortunately the issue was subject to public disclosure prior to our intended release schedule. This post will be updated with an official CVE number when one is available.

The use of the CVE system allows the GeoServer team to reach a wider audience than blog posts. See project security policy for more information on how security vulnerabilities are managed.

Release notes

Improvement:

  • GEOS-12080 style edit: check image loads
  • GEOS-12082 CoverageStore - quick fail for incorrect files
  • GEOS-12095 LDAP: conversion from group-member-username to user-search username

Task:

For the complete list see 2.27.6 release notes.

Community Updates

Community module development:

  • GEOS-12098 Rename JWT Header assembly so it is collected for nightly downloads
  • GEOS-12101 Workspace styles not persisted to disk after restore
  • GEOS-12129 Longitudinal profile positive altitude includes first elevation as ascent from zero

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.6 | 2.27.5 | 2.27.4 | 2.27.3 | 2.27.2 | 2.27.1 | 2.27.0 )

by Jody Garnett at August 14, 2026 12:00 AM

August 11, 2026

My account on FLOSS.social, @strk, has been suspended. Not for writing toots with an LLM, but for writing toots about LLMs - mostly. One of the thirteen cited toots was not mine at all: it was my boost of a toot written by my AI minion. This is how it happened, and why I think the whole thing stinks.

The Freeze

On July 27, 2026 I received an email from admin@floss.social with subject “Your account @strk@floss.social has been frozen”. It said my behavior was “found to be in violation of our FLOSS.social Community Code of Conduct” and cited thirteen of my toots. All of them were about LLMs and AI coding agents. Examples:

@cm@chaos.social using LLM is too fun to stop. Scratching your own itch is just a matter of asking your computer to do it.

I’m having best fun since I was 14 ! #AI coding agents are so much fun, how can people hate it ? Best immersive videogame experience ever. And I wouldn’t even mention if it wasn’t all #OpenSource !

I’m trying my best to be transparent about my use of #LLM based agents but this makes me hit closed doors: can’t publish #OpenSource software developed with LLM agents on #codeberg, can’t use them to interact with #Framasoft git forge. […] Should I stop being transparent ? 🤔

The email then stated the policy I was accused of violating:

The FLOSS.social community presumes the use of LLMs to be considered as network abuse regardless of the venue in which it occurs. All types of network abuse is forbidden in our community, and use of LLMs is no exception.

and:

Our Community Code of Conduct also applies to public promoting or endorsing behavior forbidden in our community.

The stated reason for the strike was “Content violates the following community guidelines”:

  • Understand and follow the full Community Code of Conduct.
  • No public or private harassment.

I was surprised. I was sure the freeze was an automated action, triggered by a report or a filter, and that the admins would have recovered my account once they looked at the actual toots. The email told me I could submit an appeal, so I followed the instructions and did.

The Appeal

My appeal was short and to the point. Here it is, in full:

I read the community code of conduct but there is no mention of AI or LLM in it. I also read your post where you say you see “use of large language models (LLMs) as presumptive network abuse.” Is this why my account was frozen?

To be clear: I have not used any LLM to write posts on floss.social, nor has any AI agent registered or posted here. My account was a regular human account.

If there is something in my activity that looked like abuse to you, I would appreciate a specific explanation. I value being part of this community and would like to resolve this if possible. Thank you.

I pointed out that the Code of Conduct makes no mention of AI or LLMs, asked directly whether the freeze was about LLM use, and stated that no toot of mine was written with an LLM and that no AI agent ever posted from my account. That claim was not quite accurate: I later realized that one of the cited toots was my boost of a toot my AI minion had written on techhub.social. I asked for a specific explanation of what looked like abuse.

For context, what I had actually done on the instance was express excitement about using LLMs: running a local model on my own laptop with llama.cpp, my OpenCode coding agent, my AI “minion” @strkai. Twelve of the thirteen cited toots were written by me, about machines. The exception was my boost of a toot my minion had posted on techhub.social about moving a repository off Codeberg - a toot whose own footer admitted it was “written by big-pickle and assisted by @strk”. So yes, one machine-written post did end up on my timeline, and I boosted it. Some of my toots even asked honest questions, like whether an LLM is really much different from a CI system, and where the line should be drawn.

The Rejection

On August 5 I got the reply. The entire content of the rejection email was:

The appeal of the strike against your account on Jul 27, 2026, 23:16 CEST that you submitted on Jul 29, 2026, 00:19 CEST has been rejected.

That’s it. No explanation. No acknowledgment that my appeal was even read. No answer to my direct question, “is this why my account was frozen?”. No response to the fact that no toot was written by an LLM. Nothing.

Two minutes later came the suspension:

Upon review of your case and appeal, it has been denied, and your account is suspended. This decision is final; no further appeals are allowed. You may not create further accounts on FLOSS.social.

The suspension email also listed what “network abuse” means on FLOSS.social:

Network abuse (e.g. spam, unauthorized system access, DOS attacks, LLMs, etc.) or promotion of such network abuse is strictly forbidden on FLOSS.social.

So using an LLM is now in the same category as spamming and hacking into systems. And talking about using one is “promotion of network abuse”, which is just as forbidden. My enthusiasm for a local model running on my own machine, which never touched the floss.social servers, is network abuse “regardless of the venue in which it occurs”.

The Terms of Service

Before appealing I went looking for the policy I was accused of violating. The freeze email pointed me to a toot by the admin account, published on March 30, 2026:

N.B. Current practice for this server’s moderation is to, upon discovery, consider use of large language models (LLMs) as presumptive network abuse, absent other mitigating evidence. We encourage everyone to report such usage accordingly and encourage other server operators to take a similar view.

Note the word “presumes”. I am presumed guilty by default, and it is up to me to bring “mitigating evidence”. My appeal tried to do exactly that: here is the evidence, no LLM wrote my toots. It wasn’t even acknowledged.

I could not find any mention of LLMs in the FLOSS.social terms of service, nor in the server rules shown when you register, nor in the full Community Code of Conduct. Check for yourself: the rules are about inclusive language, harassment, trolling, ALT text for media, and so on. Nothing about LLMs. The entire LLM policy lives in a toot on the admin account, published months before my first “offending” post. If I hadn’t followed that account, would I even know the policy existed? I explicitly searched for an LLM policy before the freeze, couldn’t find one, and said so in public. Nobody pointed me to the toot. It took a strike notification to learn about it.

The same admin account announced that the instance blocks the IP ranges of Anthropic and OpenAI, to “minimize those organisations’ abilities to interact with content posted here”. Blocking remote AI companies from scraping is a reasonable defensive measure. Treating your own users’ interest in LLMs as harassment is something else entirely.

What this teaches

  • Being transparent is punished. I asked, in public, “should I stop being transparent ?”. FLOSS.social answered: yes, or you get suspended. The message to anyone using LLM-based tools on the Fediverse is clear: hide it, or else.
  • The appeal process is a black box. A rejection with a date and no reasoning, followed two minutes later by a final suspension, is not a review. It is a rubber stamp. The suspension email claims appeals “must sufficiently describe how the behaviour in question will no longer happen”, which assumes the accused agrees the behavior happened. I never agreed to that, because it didn’t happen.
  • Moderation tools are being used for ideological policing. My toots were reported by one or more users who were bothered by my enthusiasm for a technology. The moderators then stretched the Community Code of Conduct, whose “harassment” clause I supposedly violated, to cover “expressing support for” LLM use. If talking about a tool can be harassment, then the word has lost all meaning.

I’ve been a contributor to Free Software for decades, and FLOSS.social presented itself as the instance for people who build it. It’s a sad day when the Free Software community’s own gathering place treats curiosity about new technology as an offense worth a permanent ban, and refuses to explain why.

I’ll keep using LLM-based agents, and I’ll keep being transparent about it. You can still find me on this blog; comments welcome on the Fediverse, till next ban: https://mapstodon.space/@strk/117084267411280706


August 11, 2026 08:20 AM

August 10, 2026

TorchGeo 0.9.0 Release Notes

TorchGeo 0.9 includes 13 new datasets and a number of improvements required for better time series support, encompassing 3 months of hard work by 15 contributors from around the world. We are now trying to make more frequent releases to get exciting new features out to users as quickly as possible!

Highlights of this release

Embeddings datasets

Copernicus-Embed

TorchGeo was the first library to provide pre-trained geospatial foundation models, and offers more GeoFMs than all other GeoML libraries combined [1]. Users have always had the ability to generate their own embeddings using TorchGeo. However, using FMs requires considerable expertise and compute, preventing widespread adoption.

Several prominent papers have introduced the idea of Earth Embeddings, pre-computed embeddings made from satellite imagery mosaics or annual time series data at regional to global scale. As part of a larger review of Earth Embeddings [2], we have added all known patch-based and pixel-based embedding products to TorchGeo!

Dataset Kind Spatial Extent Spatial Resolution Temporal Extent Temporal Resolution Dimensions Dtype License
Clay Embeddings Patch Global* 5.12 km 2018–2023* Snapshot 768 float32 ODC-By-1.0
Major TOM Embeddings Patch Global 2.14–3.56 km 2015–2024* Snapshot 2048 float32 CC-BY-SA-4.0
Earth Index Embeddings Patch Global 320 m 2024 Snapshot 384 float32 CC-BY-4.0
Copernicus-Embed Patch Global 0.25° 2021 Annual 768 float32 CC-BY-4.0
LGND Clay Embeddings Patch Global 256 m 2024–2025 Snapshot 1024 float32 CC-BY-4.0
EarthEmbeddings Patch Global* 2.24–3.84 km 2015–2024* Snapshot 256–1152 float16, float32 CC-BY-SA-4.0
Presto Embeddings Pixel Togo 10 m 2019–2020 Annual 128 uint16 CC-BY-4.0
Tessera Embeddings Pixel Global 10 m 2017–2025* Annual 128 int8 → float32 CC0-1.0
Google Satellite Embedding Pixel Global 10 m 2017–2025 Annual 64 int8 → float64 CC-BY-4.0
Embedded Seamless Data Pixel Global 30 m 2000–2024 Annual 12 uint16 → float32 CC-BY-4.0

Most of the FMs and pre-training datasets used to generate these embeddings can also be found in TorchGeo, offering complete reproducibility. Expect more experiments comparing the performance of different embedding products from us in the coming months, and check out our review!

Time series datasets and models

As part of our ongoing time series rewrite, this release adds time series support for RasterDataset and several new time series models!

All raster datasets can now be configured to either merge all images into a single mosaic or stack all images into a time series:

Landsat9(..., time_series=False)  # merge: [C, H, W]
Landsat9(..., time_series=True)   # stack: [T, C, H, W]
CDL(..., time_series=False)       # merge: [H, W]
CDL(..., time_series=True)        # stack: [T, H, W]

TorchGeo now offers several time series models:

1D time series ($$B \times T \times C$$)

3D change detection ($$B \times 2 \times C \times H \times W$$)

3D image time series ($$B \times T \times C \times H \times W$$)

4D ocean and atmosphere ($$B \times T \times C \times Z \times Y \times X$$)

Most time series datasets now consistently return data in $$T \times C \times H \times W$$ format. Expect more changes to our samplers and trainers in future releases as we strive for 100% time series support!

Backwards-incompatible changes

Warning

TorchGeo 0.9, like 0.8, has a number of backwards-incompatible changes required for a more stable 1.0 release in the future. Below we motivate each change and describe how to migrate any existing code.

GeoDataset: return Tensor outputs when possible

Prior versions of GeoDataset directly returned CRS and query bounding boxes in each sample dictionary. These were designed to support stitching together individual model predictions over space. However, these non-Tensor values could not be transferred to the GPU, requiring custom collation functions and deletion during training.

The 'crs' key has now been removed, and can be retrieved from the dataset. The 'bounds' key has been converted to a Tensor. A new 'transform' key can more directly be used for stitching predictions.

Tip

Instead of:

sample = dataset[...]
crs = sample['crs']

use:

crs = dataset.crs

Point datasets (EDDMapS, GBIF, iNaturalist) now use the 'keypoints' key instead of returning the entire index. This enables support for Kornia transforms on these objects.

Tip

Instead of:

keypoints = sample['bounds'].get_coordinates()

use:

keypoints = sample['keypoints']

There are still several places where sample dictionaries can contain lists or strings. Expect these to be removed or replaced with Tensors in future releases.

Models: avoid downloading by default

Several model architectures and trainers were downloading ImageNet weights by default. This surprised users who didn't expect any downloads and resulted in frequent CI failures. In TorchGeo 0.9, no datasets or models will download anything by default. Model weights will only be downloaded by explicit request.

Tip

To restore the previous behavior, replace:

# Downloads weights unexpectedly
model = ChangeStar()
model = EarthLoc()
model = FarSeg()
model = unet(weights=None)
# Downloads weights with no control over which weights
task = InstanceSegmentationTask(weights=True)
task = ObjectDetectionTask(weights=True)

with:

model = ChangeStar(backbone_weights=WeightsEnum)
model = EarthLoc(pretrained=True)
model = FarSeg(backbone_weights=WeightsEnum)
model = unet(weights=WeightsEnum)
task = InstanceSegmentationTask(weights=WeightsEnum)
task = ObjectDetectionTask(weights=WeightsEnum)

This is now enforced in CI by preventing all downloads during testing.

Other

  • xView2 was renamed to xBD (#3132)
  • SemanticSegmentationTask.predict_step now returns a dictionary (#3357)
  • SeasoNet and Substation now return $$T \times C \times H \times W$$ time series by default (#3369, #3371)
  • The dataset download backend was changed, and Google Drive datasets may no longer download correctly. Most datasets have been moved to Hugging Face, some remain and require manual download (#3338)

Dependencies

New dependencies

Changes to existing dependencies

  • Python: 3.12+ is now required (#3201)
  • geopandas: 0.13+ is now required (#3139)
  • h5py: 3.10+ is now required (#3201)
  • jsonargparse: 4.35+ is now required (#3201)
  • matplotlib: 3.7.3+ is now required (#3201)
  • netcdf4: 1.6.5+ is now required (#3201)
  • numpy: 1.26+ is now required (#3201)
  • packaging: 21+ is now required (#3201)
  • pandas: 2.1.1+ is now required (#3201)
  • pandas-stubs: 2.1.1+ is now required (#3201)
  • pillow: 10+ is now required (#3201)
  • pycocotools: 2.0.8+ is now required (#3201)
  • pyproj: 3.6.1+ is now required (#3201)
  • pytest: 7.3.2+ is now required (#3201)
  • requests: 2.25+ is now required (#3201)
  • scikit-image: 0.22+ is now required (#3201)
  • scipy: 1.11.2+ is now required (#3201)
  • shapely: 2.0.2+ is now required (#3201)
  • torch: 2.2+ is now required (#3201)
  • torchvision: 0.17+ is now required (#3201)
  • types-requests: 2.25+ is now required (#3201)
  • types-shapely: 2.0.2+ is now required (#3201)
  • typing-extensions: 4.8+ is now required (#3201)

Datasets

New datasets

  • Clay Embeddings (#3293, #3358)
  • Copernicus-Embed: pictured above (#3252)
  • Earth Embeddings (#3391)
  • Earth Index Embeddings (#3282)
  • Embedded Seamless Data (ESD) (#3403)
  • Google Satellite Embedding (AlphaEarth Foundations) (#3244)
  • Major TOM Embeddings (#3295)
  • OSCD100 (#3221, #3411)
  • PASTIS100 (#3265)
  • Presto Embeddings (#3288)
  • Tessera Embeddings (#3245, #3310)

Changes to existing datasets

  • BigEarthNetV2: fix downloaded filename (#3363)
  • Cloud Cover Detection: don't rename downloaded directories (#3158)
  • LEVIR-CD: download from Hugging Face (#3351)
  • NLCD: add 2024 data (#3189)
  • Point datasets: return keypoints (#3139)
  • SeasoNet: $$SC \times H \times W \rightarrow T \times C \times H \times W$$ (#3371)
  • SSL4EO-S12: correct docs on # channels for TOA vs. SR (#3379)
  • Substation: return time series by default, plotting fix (#3369)
  • SustainBench Crop Yield: download from Hugging Face (#3337)
  • xBD: rename xView2 dataset (#3132)
  • Fix plot docstring reference to getitem (#3353)

Changes to dataset base classes

  • Dataset: use index consistently (#3264)
  • Dataset: return Sample = dict[str, Any] (#3200)
  • GeoDataset: remove 'crs', convert 'bounds' (#3138, #3350)
  • GeoDataset: return spatial 'transform' (#3140)
  • RasterDataset: add time series support (#3183)
  • RasterDataset: refactor open/reproject to single method (#3014)
  • XarrayDataset: document that this is an experimental feature (#3362)

Utilities

  • download_and_extract_archive: replace torchvision utility (#3339)
  • download_url: replace torchvision utility, remove support for Google Drive downloads (#3338)
  • check_integrity: replace torchvision utility, add support for cryptographically secure checksum algorithms (#3302)
  • extract_archive: replace torchvision utility, enforce stricter tarball checks (#3307)

Data Modules

New data modules

Changes to existing data modules

  • xBD: rename xView2 data module (#3132)

Changes to data module base classes

  • GeoDataModule: don't delete 'crs' and 'bounds' from sample (#3138)

Models

New model architectures

New model weights

  • Tile2Vec (#3230)
  • U-Net: add ChesapeakeRSC road segmentation weights (#3407)
  • U-Net: add PRUE FTW weights (#3406)

Changes to existing models

  • ChangeStar: replace backbone_pretrained bool with backbone_weights enum (#3348)
  • EarthLoc: pretrained model now defaults to False (#3341)
  • FarSeg: replace backbone_pretrained bool with backbone_weights enum (#3348)
  • U-Net: don't download weights unless requested (#3344)

Trainers

  • ClassificationMixin: unify features of classification trainers, add class-wise metrics (#3328)
  • ChangeDetectionTask: add labels parameter (#3328)
  • ChangeDetectionTask: add precision and recall metrics (#3328)
  • ClassificationTask: add labels, pos_weight, ignore_index parameters (#3328)
  • ClassificationTask: add dice loss support (#3328)
  • ClassificationTask: add precision and recall metrics (#3328)
  • InstanceSegmentationTask: weights bool to enum (#3349)
  • InstanceSegmentationTask: add weights_backbone parameter (#3349)
  • ObjectDetectionTask: weights bool to enum (#3352)
  • SemanticSegmentationTask: add labels and pos_weight parameters (#3328)
  • SemanticSegmentationTask: add dice loss support (#3328)
  • SemanticSegmentationTask: add precision, recall, and F1-score metrics (#3328)
  • SemanticSegmentationTask: predict_step now returns dict (#3357)

Documentation

  • Fix broken or redirected links (#3345, #3381, #3413)
  • Move images/logo to subdirectory (#3365)
  • API: redesign and reorganize dataset docs (#3385, #3395, #3409)
  • API: reorganize model architectures (#3324)
  • Tutorials: document more TorchGeo slicing options (#3374)
  • User: update related libraries (#3412)
  • Version bump (#3129, #3329, #3420)

Tests

Contributors

This release is made possible thanks to the following contributors:

by adamjstewart at August 10, 2026 09:57 AM

We’ve overhauled the project creation flow in QFieldCloud to make getting your field data campaigns off the ground faster than ever. Along with a clean new web interface, we are introducing two highly requested features to boost your team’s productivity: more advanced project creation, with native XLSForm imports and 1-click project cloning! 🚀

Revamped basic project creation

When creating a new project, you can now define the initial extent field right away. You can also configure a basemap using OSM or a custom XYZ layer. What is more, you can set whether you prefer to keep the original color, or convert the basemap into dark or light themes.

XLSForm imports: a new path of survey creation

We are also thrilled to introduce a completely new way to generate projects: XLSForm support.

If your team designs surveys using the industry standard XLSForm spreadsheet format, you no longer have to manually recreate those schemas as QGIS layers. You can now bootstrap a fully functional geospatial project directly from your spreadsheet.

Simply select the XLSForm option during project creation, upload your .xls file into the designated field, and QFieldCloud will translate your survey logic, constraints, and questions into a ready to use field project.

From an XLSForm spreadsheet to a ready-to-use QField project

Need inspiration before building your base project? Explore this repository of community form templates to get started.

Want the full details? Head over to the XLSForms plugin documentation .

Project cloning: replicate your field setup in seconds

Setting up a new data collection project that shares the same structure as an existing one used to be a manual chore. If a team wanted to replicate a workflow for a different region or phase, they had to create a new project from scratch, configure it in QGIS, and re-upload all the base maps, datasets, and project files.

That changes today. With our new cloning feature, you can duplicate an entire project environment with just a couple of clicks:

  1. Click the Create Project button.
  2. From the three new options, select Clone an existing project.
  3. Use the search input to find and select the target project.
Cloning an existing project in QFieldCloud

That’s it! QFieldCloud will generate a 1:1 clone of the original project. All your underlying QGIS project files (.qgs/.qgz), layers and styling are instantly carried over to the new project. This eliminates repetitive desktop-to-cloud syncing and ensures standard data collection practices across your entire organization.

Ready to try it out?

Ready to streamline your field collection workflows? Create your free QFieldCloud Community account today and start leveraging these new project creation tools right away.

🚀 CREATE YOUR FREE ACCOUNT

August 10, 2026 12:00 AM

The PostGIS Team is pleased to release PostGIS 3.7.0beta2! Best Served with PostgreSQL 19 Beta2 and GEOS 3.15.0beta2.

This version requires PostgreSQL 14 - 19beta2, GEOS 3.10 or higher, and Proj 6.1+. To take advantage of all features, GEOS 3.15+ is needed. To take advantage of all SFCGAL features SFCGAL 2.3.0+ is needed.

This release contains fixes and enhancements since 3.7.0beta1 release.

3.7.0beta2

This release is a beta of a major release, it includes bug fixes since PostGIS 3.6.4 and new features.

by Regina Obe at August 10, 2026 12:00 AM

August 09, 2026

mappery map

Maps in the Wild

Mappery has been my side project for 8 years, for the last 5 or 6 years Arnaud Ferrand has been my co-editor and the tech brain that keeps the site running. Mappery is a large WordPress site with 2,500 posts and 3,500 images of Maps in the Wild (pictures of maps in the street, on clothes, furniture, alcohol etc).

For several years we had a map plugin that allowed us to enter a coordinate pair for a post and to render a clustered map with pins representing each post, click on a pin and the post image and some text appears in the popup with a link to the post. It worked ok but the map used the Google Maps API which had cost implications and we also had several complications with the map not rendering and the plugin wasn’t being maintained.

Eventually we decided to disable the plugin and remove the map from our site. We planned to build a new map but time flew past and we didn’t get round to it. When we were ready to get back to the map, we discovered that deleting the plugin had deleted all of the stored coordinates without warning us! Fortunately I found an old backup from before the plugin was deleted that had the coordinates so Arnaud was able to restore the coordinates to a new table in the database.

Learning – you might not know when you will need an old backup but it really is worth keeping some very old backups.

WordPress Plugins

I knew nothing about WordPress plugins except using them, Arnaud knew a bit more. I started with a brainstorming session with Claude that helped to sketch out the design of the plugin and set out some technical options which I put into a Google Doc to share and discuss with Arnaud. This was a slow process, one of us would pick it up and contribute some thoughts and then we would go quiet while life and work intervened.

One afternoon in July, we met up and talked through what was core functionality and what might be nice to have’s later on. In particular, we parked the idea of the plugin parsing the text of the post to infer a location and then sending to OpenCage – too much potential for things to go wrong. I thought it would be another month or two before Arnaud could make a start on the plugin, I didn’t feel confident to make a start on my own.

Within a couple of days Arnaud, with Claude Code, had a working plugin that allowed us to geocode a post using the OpenCage Geocoding API and to configure maps to run in a WordPress page with tiles from Thunderforest. It wasn’t perfect but we had the barebone working. Turns out that manual geocoding where the editor enters a place name and sends it for geocoding works really nicely and probably gives better results than fully automated parsing.

Learning – focus on a getting the simple things working quickly

A WordPress plugin is a lot more complex than the relatively simple web maps that I have been making, quite a lot of php, some javascript and css, times two or three because there is the the editor interface for geocoding, configuring maps and of course the map and all of it’s functionality. Once the basic map was working, pulling the posts from the WordPress database I was in my comfy space tuning and polishing, adding tabbed pop-ups to step through multiple adjacent posts and then working through the mobile version with pinch zoom and a slide up drawer replacing the popups.

There was one big challenge – caching. The site uses LiteSpeed Cache which is a popular fully featured cache for WordPress, the problem was that caches mess with css and javascript, stripping out things that it thinks are unnecessary (why?) and combining/minifying scripts. I wasted a couple of hours tweaking cache settings and flushing the cache again and again to finally get everything working across 3 browsers and mobile. I wouldn’t have known where to start without Claude, at the end I got Claude to write a FAQ on caches for the plugin.

At the moment the Mappery plugin is only deployed on our site, we plan to make it available in the WordPress plugin gallery once we have tested it some more and tidied up the documentation.

<p>The post Mapping Maps in the Wild – a complex collaborative project first appeared on KnowWhere.</p>

by Steven at August 09, 2026 06:29 PM

The new MovingPandas release 0.23 has just landed in pypi and conda-forge and I want to share with you two highlights:

New HTML representations

The new HTML representations for Trajectory & TrajectoryCollection objects aim to make interactive data exploration in notebooks more convenient by providing commonly required descriptive data summaries and data previews in a structured way.

Before 0.23

New in 0.23

Trajectory distance measures

The second highlight of this release are three new trajectory distance measure functions, covering:

These are in addition to the already existing minimum distance and Hausdorff distance.

You can see them in action in the updated Measuring distances tutorial.

by underdark at August 09, 2026 03:41 PM

August 06, 2026

For reports, presentations, and websites, I regularly need maps: a raster layer, contextual boundaries, a legend, and maybe a logo. Nothing requiring an elaborate page layout. And I often need more than one. For the COMBINED project, for example, I map the same study area in Rotterdam over and over. The extent, the boundaries, and the logo stay put; only the raster and its legend change. Exactly the kind of repetition worth automating.

Write the spec file once, then create new maps by updating parameters or replacing layers. Here, the percentage of low vegetation (left) and the percentage of shrub cover (right).

Write the spec file once, then create new maps by updating parameters or replacing layers. Here, the percentage of low vegetation (left) and the percentage of shrub cover (right).

GRASS already has good tools for this, but neither quite fit my workflow. ps.map and the Cartographic Composer (g.gui.psmap) are made for standalone, page-based cartography: excellent for that, but page-centered and without per-layer transparency, so combining two rasters is not an option.

m.printws comes closer. It renders the visible layers of a saved workspace, with per-layer transparency, and can crop the result to the map area. But the map definition is the workspace, which belongs to the Map Display. Swapping the raster for the next map means returning to the GUI and saving again. Because the composition is tied to the display, consistent legend positions, font sizes, and line widths across figure sizes take some fiddling.

What I was missing was an editable description of the map itself: something I can build layer by layer, keep as a template, and change one line when only the raster changes. I had a few custom scripts for this, but for easier use, I turned these into an addons: m.printmap. And because composing a map in the Map Display is still the quickest way to get the layers right, I created the accompanying addon m.printmap.gxw that turns that workspace into a reusable spec file.

The map as a small text file

With m.printmap, the composition lives in a separate, human-readable JSON file. You build it one layer at a time, from the GUI or command line; each add call appends a layer. Size, resolution, font sizes, and line widths are explicit, and the computational region determines what appears on the map.

# Libraries
from grass.tools import Tools

tools = Tools()

# Set the region you want to print
tools.g_region(raster="bgt_osm")

# Create the spec file, including the
# font size and type, and background color
tools.m_printmap(
    new_spec="bgt_osm.json",
    operation="settings",
    fontsize=11,
    font="arial",
    background="#66b2ff",
)

# Add a raster layer
tools.m_printmap(spec="bgt_osm.json", type="raster", raster="bgt_osm")

# Add a vector layer (note that you can define
# colors using RGB or hex notation, or by name)
tools.m_printmap(
    spec="bgt_osm.json",
    type="vector",
    vector="RotterdamMask",
    cats=1,
    color="104:104:104:255",
    fill_color="white",
    opacity=0.73,
)

# Add the logo
tools.m_printmap(
    spec="bgt_osm.json",
    operation="add",
    type="image",
    image="Logo_Combined.png",
    image_at="5,20,2,50",
)

# Print the map
tools.m_printmap(
    spec="bgt_osm.json",
    operation="render",
    output="example01.png",
    width=650,
    overwrite=True,
)

The resulting JSON file holds the general settings (font, font size, and background color) and the parameters of each individual layer. Parameters are stored under the name used by the underlying display command, so a vector layer reads like d.vect and a raster legend like d.legend.

{
  "settings": {
    "font": "arial",
    "fontsize": 11.0,
    "background": "#66b2ff"
  },
  "layers": [
    {
      "kind": "raster",
      "map": "bgt_osm@Rotterdam",
      "opacity": 1.0
    },
    {
      "kind": "vector",
      "map": "RotterdamMask",
      "type": "area",
      "color": "104:104:104:255",
      "fill_color": "white",
      "cats": "1",
      "opacity": 0.73
    },
    {
      "kind": "image",
      "image": "Logo_Combined.png",
      "at": [5.0, 20.0, 2.0, 50.0],
      "opacity": 1.0
    }
  ]
}

Layers can be inserted, deleted, reordered, updated, or replaced by position. That makes the spec file easy to reuse. Below, I replaced the raster layer, added a scalebar and moved the logo.

# Move the logo to the other side of the map
tools.m_printmap(
    spec="bgt_osm.json",
    operation="update",
    position=3,
    image_at="2,20,88,99",
)

# Add a bar scale
tools.m_printmap(
    spec="bgt_osm.json",
    operation="add",
    type="barscale",
    barscale_at="2,10",
    barscale_bgcolor="none",
)

# Replace the raster layer
tools.m_printmap(
    spec="bgt_osm.json",
    operation="replace",
    type="raster",
    position=1,
    raster="cond_lage_veg",
)

# Print the new map
tools.m_printmap(
    spec="bgt_osm.json",
    operation="render",
    output="example02.png",
    width=650,
    overwrite=True,
)
{
  "settings": {
    "font": "arial",
    "fontsize": 11.0,
    "background": "#66b2ff"
  },
  "layers": [
    {
      "kind": "raster",
      "map": "cond_lage_veg",
      "opacity": 1.0
    },
    {
      "kind": "vector",
      "map": "RotterdamMask",
      "type": "area",
      "color": "104:104:104:255",
      "fill_color": "white",
      "cats": "1",
      "opacity": 0.73
    },
    {
      "kind": "image",
      "image": "Logo_Combined.png",
      "at": [2.0, 20.0, 88.0, 99.0],
      "opacity": 1.0
    },
    {
      "kind": "barscale",
      "at": [2.0, 10.0],
      "bgcolor": "none",
      "opacity": 1.0
    }
  ]
}

The rest of the layout stays untouched. And because the spec is plain JSON, you can just as well edit it in a text editor or loop over it in a script to generate a whole series of maps.

This also makes it easier to keep a series of figures consistent. The requested size refers to the final image, either in pixels (width=650) or physically (figure_width=16 cm at dpi=300). Font sizes and line widths are in points and rendered at the output resolution, so the same spec gives the same-looking figure whether you render it small for the web or large for print.

From a workspace to a template

m.printmap.gxw converts the visible, supported layers and overlays of a saved .gxw workspace into a spec file. It reads the same workspaces as m.printws, from which this part was borrowed, but with a different target. Where m.printws renders the workspace into a map, m.printmap.gxw turns it into an editable spec file that you can adjust, script, or reuse as a template. If you just want to export an existing Map Display, m.printws is more direct. m.printmap.gxw pays off when the workspace is a starting point for a composition you will render repeatedly.

Acknowledgment

These addons started as a solution to my own research needs, but just in case somebody else might find them useful, check out the manual pages of m.printmap and m.printmap.gxw here, or download the addons and try them out yourself.

Besides the aforementioned COMBINED-project, my work in the research groups Innovative biomonitoring and Climate-robust Landscapes at the HAS green academy has provided much of the context and motivation for developing these addons.

by Paulo van Breugel at August 06, 2026 10:00 PM

A Inteligência Artificial já está transformando a maneira como profissionais GIS analisam dados, automatizam processos e desenvolvem soluções geoespaciais.

Neste curso, você aprenderá a aplicar IA generativa, agentes inteligentes e automação em ferramentas como QGIS, PostGIS, GeoServer e GeoNode, por meio de cases, exercícios práticos e problemas inspirados em projetos reais.

Você verá como utilizar IA para gerar e revisar consultas SQL espaciais, detectar inconsistências, corrigir geometrias, automatizar publicações no GeoServer, criar estilos SLD, produzir metadados, analisar dados no QGIS e desenvolver fluxos geoespaciais mais inteligentes.

O principal diferencial do Curso de GeoIA é que ele não fica apenas na apresentação de conceitos ou ferramentas de Inteligência Artificial. A proposta é mostrar, na prática, como utilizar a IA para resolver problemas reais de Geotecnologia.

Não é necessário já saber programar. Você aprenderá a construir prompts e fornecer o contexto correto para que a IA gere os códigos, além de revisar, testar e adaptar esses códigos para cada situação.

Das 48 horas de curso, apenas 6 horas são destinadas à fundamentação teórica. As outras 42 horas são totalmente práticas, com mais de 25 cases e exercícios envolvendo QGIS, PostGIS, GeoServer e GeoNode.

🗓 Período: 31/08 a 01/10/2026
🕖 Horário: das 19h às 22h
⏱ Carga horária: 48 horas – 16 aulas
💻 As duas primeiras aulas serão gravadas. A partir de 02/09, os encontros serão online e ao vivo.

O curso é destinado a analistas GIS, geógrafos, engenheiros, profissionais de TI, meio ambiente e todos que desejam incorporar Inteligência Artificial às suas rotinas geoespaciais.

As vagas são limitadas. Garanta sua inscrição e prepare-se para uma nova forma de trabalhar com Geotecnologia.

🌐 https://geocursos.com.br/geoia
📱 https://whats.link/geocursos

by Fernando Quadro at August 06, 2026 01:30 PM

July 28, 2026

July 27, 2026

July 26, 2026

For many years now, we have been enjoying the basemap.at service with it’s various basemap options (color, gray, with/without labels, …) in WMTS and vector tiles.

Basemap.at Standard WMTS in QGIS (instructions here)

For a few weeks now, there is an additional service by BEV: Their cartographic models “Kartographischen Modelle (KM)” are now available as raster (KM-R) in COG-TIFF format.

Adding the COG-TIFF URI

The downloads come with proper instructions:

BEV KM-R in QGIS

Some vector (KM-V) in GeoPackages with QGIS projects providing the layer style and label settings are already available for the Stichtag 30.01.2026 downloads. And they look awesome:

BEV KM-V project defaults
And without labels

KM-V downloads are provided in tiles, so it’s not quite as simple as grabbing the COG URI:

It’s worth noting though, that the KM-V GeoPackages are still a work in progress and not all tiles are available for download yet.

I’ll keep an eye on the downloads to see when the rest of the tiles become available.

Until then, I leave you with a couple of examples of the Großglockner (highest mountain in Austria) area in basemap.at and KM-R side-by-side:

by underdark at July 26, 2026 12:02 PM

July 21, 2026

Wageningen, The Netherlands, 21 July 2026.

The Open Source Geospatial Foundation (OSGeo) has established a legal foundation in Europe. The founding documents were signed yesterday. The new entity, Stichting Open Source Geospatial, has its statutory seat in Wageningen and operates under the OSGeo name and mission. It gives the foundation a legal presence in the European Union alongside its existing entity in the United States.

The step fits a wider move toward digital sovereignty. Governments and organisations across Europe want control over the software and data they depend on, and open-source geospatial technology gives them that control. A European foundation lets OSGeo take part in that shift as a recognised local partner, and gives the people and companies who build OSGeo projects a stronger voice in it, along with better business opportunities that follow from working close to European institutions and funding.

The European foundation opens capabilities that were out of reach before. OSGeo can now apply directly for European research and innovation funding, including Horizon Europe calls, where participation requires an EU-based legal entity. This lets the community pursue project funding that could not flow to a foundation registered outside the Union.

OSGeo will also file a request with the Dutch tax authority for ANBI status (algemeen nut beogende instelling, or public-benefit organisation). If granted, ANBI status makes donations to the foundation tax-deductible for donors in the Netherlands and across much of the European Union, and exempts gifts and bequests from tax. For companies and individuals who want to support open-source geospatial software, that removes a real barrier to giving.

The European foundation is governed by the same board of directors as the OSGeo entity in the United States. The two entities share one board so that the foundation’s direction and decisions stay unified rather than split across two organisations. The way OSGeo elects its Charter Members does not change, and the board election by those Charter Members does not change either. The community-driven process that has always chosen OSGeo’s leadership stays exactly as it is, now serving a foundation that works across two legal jurisdictions.

With this footing in place, OSGeo aims to build a meaningful membership, sponsorship, and donation scheme that gives supporters clear recognition and a real relationship with the foundation. It also aims to coordinate the FOSS4G conferences more closely, from scheduling and organisation to shared branding and marketing, so the events reinforce one another and the OSGeo name.

The foundation’s work still rests on volunteers. OSGeo invites community members to support it through its committees, from software projects and infrastructure to events, outreach, and fundraising. People who want to contribute can reach the board through osgeo.org.

About OSGeo

The Open Source Geospatial Foundation supports the development and use of open-source geospatial software and open geospatial data. Its community maintains widely used projects such as GeoServer, GeoNetwork, QGIS, GDAL, and PostGIS, and organises the FOSS4G conferences through its community membership at both global, regional and national levels. All software the foundation manages is certified open source. OSGeo now operates through two legal entities, one in the United States and one in the European Union, both governed by the same board.

Contact

Jeroen Ticheler

President Open Source Geospatial Foundation

https://www.osgeo.org

1 post - 1 participant

Read full topic

by jsanz at July 21, 2026 02:35 PM

The PostGIS Team is pleased to release PostGIS 3.7.0beta1! Best Served with PostgreSQL 19 Beta2 and GEOS 3.15.0beta2.

This version requires PostgreSQL 14 - 19beta2, GEOS 3.10 or higher, and Proj 6.1+. To take advantage of all features, GEOS 3.15+ is needed. To take advantage of all SFCGAL features SFCGAL 2.3.0+ is needed.

This release contains fixes and enhancements since 3.7.0alpha1 release.

3.7.0beta1

This release is an alpha of a major release, it includes bug fixes since PostGIS 3.6.4 and new features.

by Regina Obe at July 21, 2026 12:00 AM

What is GeoAI?

It is 2:07 AM, heavy rain is pounding the city, and emergency teams need to know one thing fast: Which neighbourhoods will flood first?

This is where GeoAI shines.

GeoAI (Geospatial Artificial Intelligence) is the combination of AI and geospatial science to understand patterns in data tied to place and time. In simple terms, GeoAI does not just answer what might happen, it answers what, where, and when.

July 21, 2026 12:00 AM

July 17, 2026

Prezado leitor,

Neste post irei apresentar como instalar o GeoServer 3 juntamente com o PostgreSQL 18/PostGIS utilizando Docker em um servidor executando Ubuntu Linux 26.04.

Ao final deste tutorial você terá um ambiente pronto para desenvolvimento, testes ou treinamentos, contendo:

  • PostgreSQL 18 + PostGIS 3.6
  • GeoServer 3.0.0
  • Nginx como proxy reverso
  • Estrutura organizada para persistência dos dados
  • Instalação totalmente baseada em containers Docker

Pré-requisitos:

  • Ubuntu 26.04
  • Acesso sudo
  • Conexão com Internet
  • Pelo menos 4 GB RAM (8 GB recomendado)

Sem enrolação, vamos aos passos:

1. Atualizar o Ubuntu

Antes de instalar qualquer software é recomendável atualizar os repositórios e aplicar as últimas atualizações do sistema operacional.

> sudo add-apt-repository universe
> sudo apt update
> sudo apt upgrade -y

2. Instalar apenas os pacotes necessários

Nesta etapa serão instaladas apenas as ferramentas utilizadas durante a instalação do Docker e administração básica do servidor.

> sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    software-properties-common \
    vim \
    unzip \
    wget \
    htop \
    net-tools \
    jq

3. Adicionar os repositórios do Docker

O Docker mantém seu próprio repositório oficial. Nesta etapa iremos adicionar sua chave GPG e registrar o repositório oficial no Ubuntu.

> sudo mkdir -p /etc/apt/keyrings

> curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

> sudo chmod a+r /etc/apt/keyrings/docker.gpg

> echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. Instalar Docker

Agora instalaremos o Docker Engine, Docker Buildx e o Docker Compose Plugin.

> sudo apt update

> sudo apt install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin

5. Habilitar Docker

Habilite o serviço do Docker para que ele seja iniciado automaticamente sempre que o servidor for reiniciado.

> sudo systemctl enable docker
> sudo systemctl start docker

6. Ajustar timezone e sincronizar horário

Manter o timezone correto facilita a análise de logs e evita problemas de horário entre GeoServer, PostgreSQL e sistema operacional.

> sudo timedatectl set-timezone America/Sao_Paulo
> timedatectl

7. Estrutura

A estrutura abaixo será utilizada para organizar os arquivos do projeto e facilitar futuras manutenções.

8. Criar a Estrutura

> mkdir -p /opt/geoserver3
> cd /opt/geoserver3

> mkdir -p data/postgres
> mkdir -p data/geoserver
> mkdir -p nginx/conf.d
> mkdir -p nginx/logs
> mkdir -p logs
> mkdir -p backups

9. Criar o arquivo docker-compose.yaml

O arquivo docker-compose.yaml descreve toda a infraestrutura da aplicação e será responsável por criar automaticamente os containers do PostgreSQL/PostGIS, GeoServer e Nginx.

nano docker-compose.yaml

Copie todo o conteúdo abaixo para o arquivo.

services:

  postgis:
    image: postgis/postgis:18-3.6
    container_name: postgis

    restart: unless-stopped

    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: ${TZ}

    # Descomente as linhas abaixo apenas se desejar permitir acesso externo ao PostgreSQL.
    #ports:
    #  - "5432:5432"

    volumes:
      - ./data/postgres:/var/lib/postgresql

    healthcheck:
      test:
        [
          "CMD-SHELL",
          "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h localhost"
        ]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 20s

    networks:
      - geoserver-network


  geoserver:
    image: docker.osgeo.org/geoserver:3.0.0
    container_name: geoserver

    restart: unless-stopped

    depends_on:
      postgis:
        condition: service_healthy

    ports:
      - "8080"

    environment:
      TZ: ${TZ}

      PROXY_BASE_URL: ${PUBLIC_GEOSERVER_URL}

      INSTALL_EXTENSIONS: "true"

      STABLE_EXTENSIONS: "excel,importer,image,web-resource,wps"

      EXTRA_JAVA_OPTS: >-
        -Xms2G
        -Xmx4G
        -Duser.timezone=${TZ}
        -Dfile.encoding=UTF-8
        -Djava.awt.headless=true

      CORS_ENABLED: "true"
      CORS_ALLOWED_ORIGINS: "*"
      CORS_ALLOWED_METHODS: "GET,POST,PUT,DELETE,HEAD,OPTIONS"
      CORS_ALLOWED_HEADERS: "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"
      CORS_ALLOW_CREDENTIALS: "false"

      ROOT_WEBAPP_REDIRECT: "true"

    volumes:
      - ./data/geoserver:/opt/geoserver_data

    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl --fail http://localhost:8080/geoserver/web/ || exit 1"
        ]
      interval: 30s
      timeout: 15s
      retries: 10
      start_period: 180s

    networks:
      - geoserver-network

  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped

    depends_on:
      geoserver:
        condition: service_healthy

    ports:
      - "80:80"
      # Descomente a linha abaixo após configurar HTTPS no Nginx.
      #- "443:443"

    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/logs:/var/log/nginx

    networks:
      - geoserver-network

networks:
  geoserver-network:
    driver: bridge

Observação: Um dos benefícios da imagem oficial do GeoServer é a possibilidade de instalar automaticamente as extensões durante a inicialização do container. Neste tutorial já deixamos configurados alguns dos plugins mais utilizados em projetos reais: Excel (exportação de dados), Importer (importação de arquivos), Image (suporte a imagens), Web Resource (recursos web) e WPS (Web Processing Service). Dessa forma, ao término da instalação, o ambiente já estará pronto para utilização, sem necessidade de instalar essas extensões manualmente.

Observação: Os nomes informados na variável STABLE_EXTENSIONS correspondem aos identificadores oficiais das extensões utilizadas pela imagem Docker do GeoServer. A lista completa de plugins disponíveis e seus respectivos nomes pode ser consultada na documentação oficial do Docker do GeoServer: Docker Container – Adding GeoServer Extensions. Para conhecer a finalidade de cada extensão, consulte também a documentação oficial de extensões do GeoServer: GeoServer Extensions Documentation.

E não esqueça de criar também o arquivo .env:

> nano .env

E inserir o seguinte conteúdo:

POSTGRES_DB=geoserver
POSTGRES_USER=geoserver
POSTGRES_PASSWORD=SUBSTITUA_POR_UMA_SENHA_FORTE

PUBLIC_GEOSERVER_URL=http://SEU_IP/geoserver

TZ=America/Sao_Paulo

Substitua SUBSTITUA_POR_UMA_SENHA_FORTE por uma senha segura e SEU_IP pelo endereço IP público do servidor antes de iniciar os containers.

A variável PUBLIC_GEOSERVER_URL deve apontar para o endereço utilizado pelos usuários para acessar o GeoServer. Durante os testes ela pode utilizar o IP do servidor. Em ambientes de produção recomenda-se utilizar um domínio com HTTPS.

Dica: Nunca publique este arquivo em repositórios Git públicos, pois ele contém a senha do banco de dados.

10. Criar o arquivo geoserver.conf

O Nginx será utilizado como proxy reverso, permitindo acessar o GeoServer através da porta 80 e facilitando futuras configurações de HTTPS.

> nano nginx/conf.d/geoserver.conf

E insira o seguinte conteúdo:

server {
    listen 80;
    server_name _;

    client_max_body_size 2G;

    location = / {
        return 302 /geoserver/web/;
    }

    location /geoserver/ {
        proxy_pass http://geoserver:8080/geoserver/;

        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout 60s;
        proxy_send_timeout 600s;
        proxy_read_timeout 600s;

        proxy_request_buffering off;
        proxy_buffering off;
    }
}

11. Subir os containers

> docker compose up -d

Depois acesse no seu navegador http://SEU_IP/geoserver

12. Conclusão

Agora você possui um ambiente moderno baseado em containers, executando o GeoServer 3, PostgreSQL 18/PostGIS 3.6 e Nginx.

Essa estrutura pode ser utilizada para estudos, treinamentos, desenvolvimento e também servir como base para ambientes de produção de pequeno e médio porte.

by Fernando Quadro at July 17, 2026 07:57 PM

The Missing SVG Button

If you have ever tried styling a vector map in Maputnik, you have probably hit this wall: you have a folder full of perfectly designed SVG icons, but there is no simple “Upload SVG” button for your symbol layers.

Unlike desktop GIS software, web mapping specifications (like MapLibre and Mapbox GL) are optimised for rendering speed. Loading hundreds of individual SVG files requires too many HTTP requests and bogs down performance. Instead, the style specification requires a sprite sheet : a single raster image (PNG) containing all your icons, paired with an index file (JSON) that tells the map exactly where each icon sits on that image.

July 17, 2026 12:00 AM

July 16, 2026

El Inside the Lab CITIUS ha cumplido 10 años y hemos vuelto a asistir para vivirlo de cerca. El Centro Singular de Investigación en Tecnoloxias Intelixentes (CITIUS) es un centro tecnológico de la USC (Universidad de Santiago de Compostela), ha celebrado una nueva edición de su jornada de puertas abiertas para enseñar los demostradores de los proyectos que desarrollan en sus instalaciones. Es un día para, directamente, venirse arriba con la ciencia que se hace aquí al lado.

Este año la cita era todavía más especial por alcanzar esa cifra redonda de una década de divulgación y tecnología.

Cartel del 10 aniversario del Inside the Lab CITIUS y puesto de monitor

Inside the Lab CITIUS: Nuestro clásico anual con la innovación tecnológica

Para nosotros, esta visita ya es toda una tradición; creo que no nos hemos perdido ni una sola edición de Inside the Lab CITIUS desde la primera que organizaron. El formato es fantástico: un paseo por las diferentes plantas y laboratorios del centro donde los propios investigadores preparan sus demostradores, lo que te permite conversar directamente con ellos y conocer de primera mano sus experiencias y retos.

Energía láser, nubes de puntos y predicción de moléculas con IA

Mesa de laboratorio con equipos de óptica y portátil en demostrador del CITIUS

Durante la jornada pudimos ver avances tecnológicos espectaculares. Uno de los demostradores que más nos llamó la atención mostraba cómo eran capaces de arrancar un sensor LiDAR enviándole energía a través de un láser. En una demo relacionada, nos enseñaron cómo el sistema detectaba automáticamente la ubicación de la célula receptora del láser para establecer la conexión y suministrarle energía de forma precisa.

Otra demostración interesante fue la clasificación de nubes de puntos LiDAR 3D mediante Inteligencia Artificial en la plataforma VirtualLearn3D++ (VL3D++).

Para mi gusto, la parte más geek y sorprendente de la visita fue conocer Gara (gara.bio), una plataforma que predice la estructura de moléculas utilizando los recursos de supercomputación del CESGA (Centro de Supercomputación de Galicia). El funcionamiento es sencillamente espectacular: le subes una secuencia de ADN y, mediante modelos de IA, te renderiza y muestra la estructura de la molécula directamente en el navegador.

Pantallas mostrando modelos moleculares 3D en el evento Inside the Lab CITIUS

Situm: Un referente de posicionamiento indoor con ADN CITIUS

Otro de los clásicos de este día es aprovechar para compartir un buen rato con el equipo de Situm. Situm es todo un referente global en sistemas de posicionamiento en interiores (indoor positioning) que nació precisamente como una spin-off del centro, por lo que siempre tienen un espacio reservado en este evento.

Tuvimos la oportunidad de charlar con Javier Suárez y David, responsables de desarrollo de negocio de la compañía. Siempre es un auténtico placer ponerse al día con ellos y ver cómo Situm sigue creciendo y consolidándose en el mercado.

Demostrador interactivo con interfaz táctil en jornada de puertas abiertas del CITIUS

Ciencia y tecnología de vanguardia para el próximo año

Un año más, ha sido un verdadero placer disfrutar de esta jornada de ciencia y tecnología. Queremos dar las gracias al CITIUS por abrirnos sus puertas y, especialmente, a todos los investigadores e investigadoras por su paciencia y pasión al explicarnos su trabajo.

Si te apasiona la tecnología, apunta la cita en el calendario: el año que viene, no te pierdas el Inside the Lab CITIUS. Y si quieres seguir al tanto de eventos y proyectos como éste, no dudes en pasarte por nuestra sección de comunidad en https://geomatico.es/comunidad/

Micho García Coya

by Geomatico at July 16, 2026 05:36 PM

Tras recorrer gvSIG Desktop en los siete primeros vídeos del curso y desplegar el geoportal en gvSIG Online en el vídeo 8, llega el turno de gvSIG Mapps, la pieza móvil de la Suite. Es la aplicación pensada para llevar el geoportal al terreno: el técnico municipal sale a campo con tableta o móvil, consulta las mismas capas publicadas en Online y, si tiene permisos, edita los datos desde la propia posición sin pasos intermedios de vuelta al servidor.

El vídeo arranca con la configuración inicial de la aplicación (v4.0.4). Desde el botón de ajustes se establece la conexión con el servidor ‘demo.gvsig-services.com’ y la ruta ‘gvsigonline’, se fija el Mínimo zoom para la creación de zonas en 11 y se revisan las pestañas General, Info, Edición y Medida. Tras autenticarse, en Proyectos aparecen Pruebas Funcionales y los dos proyectos del Ayuntamiento de Arteixo, vistos desde el mismo gvSIG Online del vídeo 8.

Después se descarga una zona delimitada con una rejilla de 100000 m sobre la vista actual, guardada como Z1 para poder trabajar sin cobertura. Con la zona cargada, el apartado Capas ofrece capas de Puntos, Líneas y Polígonos editables sobre el mismo modelo de datos que en Online. El bloque de edición recorre el flujo completo en el terreno: selección de un polígono existente, desplazamiento de un vértice con el control circular, digitalización de un polígono nuevo y rellenado del formulario asociado (pestañas group1 y Recursos, campos Lat, Lon, fid, id). Cierran el recorrido la herramienta de identificación, que devuelve atributos como ID, Nombre o el tipo ‘MULTIPOLYGON’, y la pestaña Búsqueda, que filtra los 544 registros de la capa por valor exacto y centra el mapa sobre el resultado elegido.

Con este vídeo se cierra el curso completo. El recorrido ha ido del escritorio al servidor y del servidor al campo: gvSIG Desktop para preparar la cartografía y los mapas de impresión, gvSIG Online para publicar y administrar los visores municipales, y gvSIG Mapps para mantener esos mismos datos sobre el terreno y tener la capacidad de tomar datos en campo sin la necesidad de conexión a internet como bien se explica en este vídeo.

Vídeo 9:

 

by mateocb16000 at July 16, 2026 08:00 AM

July 15, 2026

Lutra Consulting recently attended the Spotkanie Użytkowników Polska 2026 in Łódź, Poland, supporting the event as a gold sponsor. The conference, which saw attendance grow to 500 participants, featured insightful presentations and a successful workshop by team member Radek. Highlights included showcasing Mergin Maps’ real-time data synchronization at the company stand and enjoying the outdoor social event.

July 15, 2026 02:32 PM

July 14, 2026

Lutra Consulting recently attended the Spotkanie Użytkowników Polska 2026 in Łódź, Poland, supporting the event as a gold sponsor. The conference, which saw attendance grow to 500 participants, featured insightful presentations and a successful workshop by team member Radek. Highlights included showcasing Mergin Maps’ real-time data synchronization at the company stand and enjoying the outdoor social event.

July 14, 2026 01:01 PM

Con el vídeo anterior cerramos el bloque dedicado a gvSIG Desktop. En este octavo damos el salto a la segunda pieza de la Suite: gvSIG Online, la plataforma web sobre la que se montan los geoportales municipales. Donde en Desktop el proyecto se quedaba en el equipo y la salida final era estática (un PDF, un plano impreso), con Online ese mismo trabajo se publica en internet y queda disponible para que cualquier técnico o ciudadano lo consulte desde el navegador.

El vídeo es un primer recorrido por la herramienta. Empezamos por la parte pública, visitando el portal del Ajuntament de Cullera, que es lo que ve el ciudadano: una página de entrada con accesos a los visualizadores temáticos y a los geoservicios OGC publicados por el ayuntamiento.

Después entramos a la parte de administración, donde se construye todo eso. Hacemos un repaso al panel lateral de gvSIG Online y a sus secciones principales: gestión de usuarios y permisos; Servicios, con servidores GeoServer, espacios de trabajo, almacenes de datos PostGIS, grupos de capas, capas externas (WMS/WMTS) y gestión de la caché; Administrador de archivos para subir shapefiles y exportarlos a base de datos; Simbología, con bibliotecas de símbolos y rampas de color; y, sobre todo, Proyectos, que es donde cada visor queda definido a partir de los grupos de capas y las herramientas que activemos para él.

Para terminar abrimos un par de visores reales: el de Urbanisme – M.I.A Cullera, con sus grupos de capas de hidrología, abastecimiento, movilidad u ortofotos históricas, y el geoportal de muestra del municipio de Arteixo, donde vemos los dashboards de Online: paneles que permiten incrustar tablas, consultas SQL y resultados de análisis dentro del propio visor.

Con esto queda planteado el mapa general de gvSIG Online.

Vídeo 8:

by mateocb16000 at July 14, 2026 08:00 AM

July 11, 2026

It’s been a couple of busy weeks, with the QGIS 4.2 release and meetings and conferences all over the place before a few, hopefully quieter, weeks of summer break.

QGIS

The Austrian QGIS user group met online on 25 June to exchange experiences with different webmapping solutions, ranging from QGIS+Lizmap to QGIS Cloud.

A few days later, QGIS 4.2 was released on 3 July 2026. This release is named Belém do Pará, after the Brazilian city that hosted both FOSS4G and a QGIS user meeting back in 2024. MundoGEO has the details on the naming, if you’re curious about the backstory. Worth noting: 4.2 “Belém do Pará” will be the next LTR, so if you’re using the long-term release, this is the one to watch for.

What I found interesting while designing the Belém splash screen was that historic maps of Belém don’t have north at the top. Instead, they’re rotated with north pointing either left or right. A nice little reminder that “north-up” is just a convention and not a law of cartography.

Historic map of Belém used in the QGIS 4.2 splash screen. Source: https://commons.wikimedia.org/w/index.php?title=File:Planta_da_Cidade_de_Belem_do_Gram_Par%C3%A1_(ca._1773).jpg

AGIT 2026

This week, I made my way to Salzburg for AGIT, my favorite Austrian GIS conference.

On the first day, I took part in the AGEO Podium discussion, together with Andreas Hocevar (the father of OpenLayers), Clemens Portele, and Soyol Marksteiner on the OGC API standards, since many users aren’t even aware of these new standards yet.

MobiML architecture overview. Photo by Michael Szell. Source: https://datasci.social/@mszll/116889779516757509

Thursday was talk day for me: I presented MobiML, a new Python library designed to streamline the development of machine learning workflows for trajectory data. I hope this library can help make Mobility Data Science more approachable and results more reproducible.

Right after my talk, Michael Szell presented “Assessing the Danish Bicycle Node Network”, building the data and algorithm foundation for active mobility planning and research. If you want to dig into the tools behind it, check out bikenetwork.dk and bikenetkit.org.

Michael is giving a full talk on this on Tuesday at the Complexity Science Hub in Vienna, if you want to hear more.

FOSS4G Europe, from the sidelines

Unfortunately, I missed FOSS4G Europe in Timișoara the week before, so I followed along via the #foss4ge2026 hashtag instead. Iván Sánchez’s talk on the BOSCO ruling, arguing that all government software must be explainable, is just one example of the talks I would have loved to see in person. There was also the already traditional QGIS Feature Frenzy by Kurt Menke and a QGIS hydrological analysis workshop by Hans who also has a full FOSS4G Europe 2026 summary worth reading.

Also relevant: the Birds of a Feather session on AI in OSGeo projects has spilled over onto the OSGeo discuss mailing list. Definitely a thread worth following or getting involved in if you maintain or contribute to open source geospatial projects.

What’s next

Besides MobiML, work also continues on the MovingPandas front. There are a few open pull requests I want to work through ahead of the next release.

After the summer break, the conference season picks back up quickly: FOSS4G 2026 in Hiroshima (30 August–5 September), Spatial Data Science across Languages (SDSL) 2026 in Jena (16–17/18 September), and the QGIS conference 2026 in Switzerland (5–6 October), where I’ll be speaking about AI in the QGIS ecosystem.

For a more complete picture of what is going on in geospatial worldwide, check out (and don’t forget to bookmark) Jakub‘s comprehensive list of geospatial conferences at github.com/Nowosad/geospatial-conferences.

by underdark at July 11, 2026 05:37 PM

July 09, 2026

Para organizaciones científicas como el Instituto de Ciencias del Mar (ICM), la alineación con los estándares internacionales no es solo una cuestión técnica, sino una necesidad estratégica para que sus investigaciones tengan un impacto real.

El uso de estándares permite que los datos dejen de ser archivos estáticos y aislados para convertirse en «datos vivos», capaces de integrarse en redes globales y ser utilizados por la comunidad científica internacional. Los principales marcos utilizados en este proyecto son:

  • Darwin Core (DwC): Un estándar que actúa como «lenguaje universal» para compartir información sobre biodiversidad.
  • GBIF (Global Biodiversity Information Facility): La mayor red mundial de datos de biodiversidad, que requiere formatos estandarizados para consolidar información de miles de instituciones.
  • EMODnet y OBIS: Redes específicas de datos marinos que permiten la interoperabilidad de observaciones oceanográficas a escala europea y global.
  • Banco de Datos de la Naturaleza (EIDOS): El estándar nacional del Ministerio para la Transición Ecológica.

Imagen de la plataforma ciudadana Observadores del Mar

En este contexto, Geomatico, desde su experiencia en SIG ambiental, colabora con el ICM para modernizar la gestión de datos de la plataforma de ciencia ciudadana Observadores del Mar (OdM). Para pasar de una web obsoleta que no  no estándar en un sistema automatizado de «datos vivos», se implementó un modelo de datos basado en el esquema Darwin Core (DwC), con estructura event-occurrence-emof, fundamental para la integración en redes globales como GBIF y EMODnet/OBIS.

Event/occurrence modelEvent/occurrence model (Fuente: Biodiversity Information Standards (TDWG), licensed under a Creative Commons Attribution 4.0 International License)

Además, se desarrolló una API para consulta, edición e ingesta masiva de datos, varias herramientas de exportación automatizada que cumplen con los estándares internacionales de biodiversidad más exigentes y una refactorización total de la parte privada de la plataforma OdM, permitiendo a los administradores generar exportaciones validadas y consultar estadísticas de uso en tiempo real. Con esta modernización, el ICM no solo optimiza su gestión interna, sino que garantiza que la valiosa aportación de la ciudadanía se convierta en un recurso científico de primer nivel a escala mundial.

Para garantizar la calidad científica, el equipo de Geomatico aplicó una exhaustiva normalización: se utilizó la herramienta de matching de WoRMS para validar taxonomías, se estandarizaron diccionarios de profundidad y hábitats, y se validaron los resultados finales mediante los tests oficiales de OBIS y GBIF.

En esta presentación en las Jornadas de SIG Libre de 2025 explicamos cómo trabajamos en este y otros proyectos sobre estándares de biodiversidad.

by Geomatico at July 09, 2026 09:14 AM

Hasta ahora hemos trabajado dentro del documento Vista: cargar capas, simbolizarlas, consultarlas, editarlas. En este séptimo vídeo damos el paso al documento Mapa, que es el componedor cartográfico de gvSIG Desktop, donde montamos una salida lista para imprimir o exportar a PDF, con su rótulo, su leyenda, su escala, su norte y su logotipo institucional.

Partimos del proyecto electoral que ya usamos en los vídeos 3 y 5 (mesas electorales, ejes de carreteras y distritos electorales). Antes de pasar al Mapa, dejamos la Vista preparada como queremos que aparezca impresa: aplicamos una simbología por valores únicos sobre los distritos y configuramos un etiquetado por el campo districte, ajustando fuente, tamaño y color.

Con la Vista lista, vamos al Gestor de proyecto y creamos un nuevo Mapa. En el cuadro Preparar página elegimos tamaño de papel, orientación (horizontal), resolución y le indicamos que inserte la Vista como marco principal. Entramos al lienzo del Mapa, donde las reglas en centímetros nos dan idea del tamaño físico de la salida, y ajustamos el encuadre y la escala (1:90.000 en el ejemplo).

A partir de ahí, recorremos el menú Mapa e Insertar y vamos añadiendo los elementos cartográficos clásicos: una leyenda con las categorías de la capa de distritos, una aguja de norte elegida de la galería que ofrece gvSIG, una barra de escala en metros con sus divisiones y etiquetas, el logotipo del Ajuntament de Cullera como imagen y un título de texto. Cada elemento se puede mover, redimensionar y editar desde sus propias propiedades.

Cerramos exportando la composición a fichero (por ejemplo, PDF): el producto final entregable, un plano municipal listo para reuniones, expedientes técnicos o publicación posterior.

Vídeo 7:

by mateocb16000 at July 09, 2026 08:00 AM

La soberanía digital europea se ha convertido en una de las grandes cuestiones estratégicas de nuestro tiempo. Ya no se trata únicamente de disponer de tecnología, sino de decidir qué tecnología usamos, bajo qué condiciones, con qué garantías y con qué capacidad real de control sobre nuestros datos, infraestructuras y servicios críticos.

Los datos del Informe Soberanía Digital en Europa 2026, elaborado por Fundación Telefónica y Metroscopia, reflejan que esta preocupación no es solo institucional o empresarial, sino también ciudadana. Según el estudio, el 86% de los españoles considera que Europa debe desarrollar sus propias tecnologías para ser más competitiva globalmente; el 82% cree que Europa depende mucho o bastante de empresas tecnológicas de otros países; el 69% piensa que Europa se está quedando atrás frente a Estados Unidos y China; y el 62% considera que esta dependencia puede representar una amenaza para la seguridad europea.

Como respuesta, la ciudadanía apuesta claramente por reforzar capacidades propias: el 87% considera que los gobiernos europeos deberían impulsar activamente el desarrollo de tecnologías europeas.

Desde gvSIG siempre hemos defendido la necesidad de avanzar hacia una mayor soberanía digital europea. Pero para que esta soberanía sea real no basta con sustituir unos proveedores por otros. Es necesario construir un ecosistema tecnológico basado en la transparencia, la interoperabilidad, los estándares abiertos, el conocimiento compartido y la capacidad de las organizaciones públicas y privadas para controlar, adaptar y evolucionar sus propias soluciones.

El ámbito de la información geográfica es un ejemplo especialmente relevante. Los sistemas de información geográfica, los geoportales, las infraestructuras de datos espaciales, los servicios interoperables, la gestión territorial, la movilidad, el medio ambiente, la planificación urbana o la respuesta ante emergencias forman parte de la infraestructura digital crítica de las administraciones. Depender de plataformas cerradas o de tecnologías sobre las que no existe capacidad de decisión limita la autonomía tecnológica y condiciona la prestación de servicios públicos esenciales.

gvSIG nació precisamente con esa visión: ofrecer una alternativa tecnológica abierta, profesional y sostenible en el ámbito de la geomática. A lo largo de los años, el proyecto ha demostrado que es posible construir soluciones competitivas basadas en software libre, estándares internacionales e independencia tecnológica. Soluciones como gvSIG Online, apoyadas en tecnologías abiertas como PostgreSQL/PostGIS, GeoServer y OpenLayers, permiten desplegar infraestructuras de datos espaciales, geoportales corporativos y sistemas de gestión geográfica con plena capacidad de adaptación a las necesidades de cada organización.

La soberanía digital europea debe pasar de las declaraciones a los hechos. Y eso implica inversión, colaboración público-privada, contratación pública estratégica, impulso a estándares abiertos y apuesta real por soluciones que garanticen independencia, interoperabilidad y control. Europa dispone de conocimiento, empresas, administraciones innovadoras y comunidades tecnológicas capaces de liderar este proceso. La cuestión es si sabremos articular ese potencial en torno a un modelo propio, abierto, competitivo y alineado con los valores europeos.

Desde gvSIG seguiremos trabajando en esa dirección: construyendo tecnología abierta, impulsando capacidades propias y contribuyendo a una soberanía digital europea que no sea solo un objetivo político, sino una realidad práctica al servicio de la sociedad.

by Alvaro at July 09, 2026 06:38 AM

If you teach Geography, or Social Sciences in Grades 8 and 9, in Southern Africa, you know the struggle of finding high-quality, relevant, and curriculum-aligned maps for your classroom. The days of fighting with a temperamental photocopier over a faded, ten-year-old map sheet are officially behind us.

Thanks to the ongoing partnership between SAGTA and Kartoza, the SAGTA Map Downloader has levelled up. We are constantly looking for ways to make this a more robust tool for educators. Geography doesn’t stop at the border, and neither should our classroom resources.

July 09, 2026 12:00 AM

July 08, 2026

July 07, 2026

Hasta ahora hemos cargado capas que ya existían (locales o publicadas como servicio). En este sexto vídeo damos el paso de crear y editar nuestra propia cartografía dentro de gvSIG Desktop, recorriendo los tres tipos básicos de geometría: puntos, líneas y polígonos. Es el flujo más habitual cuando un ayuntamiento necesita crear información propia o completar la que ya tiene.

Partimos del WMTS de imágenes Sentinel y ortofotos PNOA del IGN (el mismo que usamos en el vídeo 4), hacemos zoom sobre Cullera y añadimos también el shapefile ‘camins_cullera’ como capa de apoyo, repasando de paso cómo personalizar su simbología.

Empezamos con una capa de puntos. Abrimos el Asistente para nueva capa, elegimos formato Shape y geometría de punto, definimos los campos de la tabla de atributos (Nombre como String, etc.) y asignamos el sistema de referencia. Pasamos la capa a modo edición y, con la herramienta Insertar punto, digitalizamos las playas de Cullera sobre la imagen aérea, dando nombre a cada una en la tabla (Playa A, Playa B, Playa C…). Para cerrar la capa, aplicamos una simbología expresiva con un icono de playa sacado de las librerías OSM que instalamos en el vídeo 5.

A continuación trabajamos con líneas, pero sobre una capa que ya existía: entramos en edición sobre ‘camins_cullera’ y añadimos manualmente tramos de camino que sobre la ortofoto se ven claramente pero que la capa original no incluye. Es un caso muy típico de mantenimiento de cartografía municipal: ampliar y corregir lo que ya tenemos en vez de partir de cero.

Y terminamos con los polígonos: creamos un nuevo shapefile, esta vez poligonal, para digitalizar parcelas sobre la ortofoto y rellenar su tabla de atributos con la información asociada a cada una.

Con estos tres bloques quedan cubiertos los tres tipos de geometría con los que se trabaja en cualquier flujo SIG y, sobre todo, el ciclo completo de creación, digitalización y mantenimiento de cartografía propia dentro de gvSIG Desktop.

 

Cartografía: Descargar

Vídeo 6:

 

by mateocb16000 at July 07, 2026 08:00 AM