Extracting from WFS Services¶
This guide walks through extracting building footprints from a WFS (Web Feature Service), enriching metadata, generating PMTiles for web visualization, and publishing to Source Cooperative.
Live Example
The result of this tutorial is published at:
- Source Cooperative: source.coop/nlebovits/belgium-buildings
- STAC Browser: Browse the catalog
- PMTiles Viewer: View on map
Prerequisites¶
- Portolan CLI installed (
pipx install portolan-cli) - tippecanoe for PMTiles generation
- AWS credentials configured for your target bucket
Step 1: Explore the WFS Service¶
First, discover available layers without extracting:
portolan extract wfs \
"https://geoservices.wallonie.be/geoserver/inspire_bu/ows" \
--dry-run
Dry run - would extract 2 layers:
• inspire_bu:BU.Building_building_emprise (ID: 0)
• inspire_bu:BU.Building_building_lod1 (ID: 1)
Two layers available: building footprints (building_emprise) and 3D buildings (building_lod1).
Step 2: Extract Building Footprints¶
Extract 100,000 features from the footprints layer:
portolan extract wfs \
"https://geoservices.wallonie.be/geoserver/inspire_bu/ows" \
buildings \
--layers "inspire_bu:BU.Building_building_emprise" \
--limit 100000 \
--auto
Portolan automatically:
- Downloads features via WFS with pagination
- Converts to GeoParquet with Hilbert spatial ordering
- Extracts styles from companion WMS (via GetStyles) as Mapbox GL JSON
- Generates STAC catalog with proper metadata
- Seeds metadata.yaml from ISO 19139 records (if available)
Metadata Auto-Extraction
Since v0.6.0, portolan extract wfs automatically fetches ISO 19139 metadata records
from the WFS service, populating license, description, keywords, and contact info.
Skipping Style Extraction
To skip WMS style extraction (e.g., for faster runs or when styles aren't needed), use --no-styles.
Step 3: Enrich Metadata¶
The extraction creates two metadata files:
buildings/.portolan/metadata.yaml— Catalog levelbuildings/inspire_bu_.../.portolan/metadata.yaml— Collection level
Review and complete these files:
contact:
name: "Your Name"
email: "your@email.com"
license: "CC-BY-4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
title: "Belgium Building Footprints - Wallonia"
description: |
INSPIRE-compliant building footprints for the Wallonia region.
keywords:
- buildings
- footprints
- belgium
- inspire
- geoparquet
source_url: "https://geoservices.wallonie.be/geoserver/inspire_bu/ows"
attribution: "Service Public de Wallonie (SPW)"
License Verification
Always verify the license from the source. Check _license_info_from_source in
the auto-generated metadata.yaml for hints from the WFS service.
Step 4: Generate PMTiles¶
PMTiles enables efficient web-based map rendering. Generate from GeoParquet:
cd buildings/inspire_bu_bu_building_building_emprise_865a73
ogr2ogr -f GeoJSONSeq \
-s_srs EPSG:3035 \
-t_srs EPSG:4326 \
/vsistdout/ \
inspire_bu_bu_building_building_emprise_865a73.parquet | \
tippecanoe \
-o inspire_bu_bu_building_building_emprise_865a73.pmtiles \
-z14 -Z4 \
--layer=buildings \
--force \
--read-parallel \
--drop-densest-as-needed
CRS Reprojection
Some WFS services return coordinates in projected CRS (like EPSG:3035) even when
the GeoParquet metadata says WGS84. The -s_srs flag overrides the source CRS
for correct reprojection.
Then add the PMTiles to your catalog:
cd buildings
portolan add inspire_bu_.../*.pmtiles
Step 5: Generate READMEs¶
Create human-readable documentation from STAC metadata:
portolan readme
This generates README.md files at catalog and collection levels.
Step 6: Push to Source Cooperative¶
Configure your remote in .env:
PORTOLAN_REMOTE=s3://us-west-2.opendata.source.coop/username/dataset/
PORTOLAN_PROFILE=source-coop
Push to the bucket:
portolan push --verbose
Summary¶
| Step | Command |
|---|---|
| Explore | portolan extract wfs URL --dry-run |
| Extract | portolan extract wfs URL OUTPUT --layers PATTERN --limit N |
| Metadata | Edit .portolan/metadata.yaml files |
| PMTiles | ogr2ogr \| tippecanoe pipeline |
| Add tiles | portolan add *.pmtiles --stac-geoparquet |
| READMEs | portolan readme |
| Push | portolan push --verbose |
See Also¶
- Extracting from ArcGIS — Similar workflow for ArcGIS REST services
- Metadata Defaults — Configure default metadata values
- CLI Reference — Full command documentation