Home › FAQ
The Géoplateforme (data.geopf.fr),
run by IGN, serves France's national reference data — BD TOPO, BD CARTO, ADMIN EXPRESS,
the cadastral parcels, the address base — through OGC web services, which are
quite difficult to use from a browser or as Linked Data.
The wrapper sits between your client and the upstream services, handling several things:
/wms request carries its own width and height
(the map and /tile compute them). Where a layer's native resolution is known,
the wrapper lowers them so that no pixel is finer than the source; it never raises them
(see FAQ: Full-resolution images,
FAQ: Maximum image size).Access-Control-Allow-Origin headers, so browsers would block direct
cross-origin JavaScript requests. The wrapper proxies responses so the
“Show on map” buttons and form submissions work.Referer
that browsers don't allow JavaScript to override; the wrapper adds them server-side.
The Géoplateforme's WFS (data.geopf.fr/wfs/ows) and its two WMS
(/wms-v/ows, vector rendering; /wms-r/wms, raster), all on the
map page. The status page lists every feature type
and layer.
?legend for the legend graphic.
WMS and WFS. The Géoplateforme's WMTS is not proxied: use the WMS for the same
layer, or /tile, which cuts XYZ tiles from WMS.
Yes, a processor rather than an endpoint over a store: /sparql (GET or POST,
parameter query; a GET without a query returns a SPARQL 1.1 Service Description), with a form at
/sparql.html. The wrapper has no triple store: a query must
name its data with FROM / FROM NAMED clauses whose URIs are
this wrapper's own /wfs routes, for example
SELECT ?s ?name
FROM <wfs?s=https://data.geopf.fr/wfs/ows&typenames={type}&bbox=2.340,48.851,2.356,48.858>
WHERE { ?s ?p ?name }
IRIs in a query are relative to the wrapper's own base (its origin plus any path it is
mounted under, e.g. /geopf/), so write them without a leading slash:
<wfs?…>, <vocab/…#…>. A root-relative
</wfs?…> resolves to the host root and is rejected as external where the
wrapper is mounted under a path.
Each named graph is fetched through /wfs (complete: every feature the
bounding box matches, unless count is given), unioned, and the query runs
over the union; external graph URIs are rejected. Results: SPARQL JSON/XML/TSV for
SELECT, Turtle/RDF/XML or GeoJSON for CONSTRUCT and DESCRIBE. GeoSPARQL functions are
available; bind geo:hasGeometry/geo:asWKT for anything you pass to a
function and locn:geometry for the map (see
FAQ: geometry representations).
A Coordinate Reference System (CRS) defines how coordinates map to locations on Earth. The OGC standards use the older term Spatial Reference System (SRS) for the same concept. The most common CRS is EPSG:4326 (WGS 84), which uses latitude/longitude in degrees — this is what GPS devices and most web maps use.
A projection converts the curved surface of the Earth to a flat map. Web maps typically use Web Mercator (EPSG:3857) for display, but the underlying data is often served in geographic coordinates (EPSG:4326) or in a national projection (EPSG:2154).
All GeoJSON returned by the wrapper is in WGS 84 (EPSG:4326, lon/lat), regardless of what CRS the upstream service uses. Leaflet receives standard GeoJSON and needs no special CRS configuration on the client side.
About a quarter of the Géoplateforme's feature types default to Lambert-93, the official projection for metropolitan France; most of the rest default to WGS 84 (EPSG:4326), and the overseas data uses local systems. The bbox you give is always W,S,E,N in WGS 84; the wrapper converts it to whatever the feature type expects.
Bounding boxes use the format W,S,E,N in decimal degrees (EPSG:4326, WGS 84). W and E are longitude, S and N are latitude.
Note: WMS 1.3.0 and WFS 2.0.0 require lat/lon axis order (S,W,N,E) when using EPSG:4326. The wrapper translates from the more intuitive lon/lat (W,S,E,N) to the standard axis order automatically before forwarding requests upstream.
The wrapper always returns GeoJSON in WGS 84 lon/lat, regardless of the upstream axis
order or projection. For GML-based services the conversion is done server-side;
for services that provide native GeoJSON output the wrapper requests
The raster WMS (
The raster WMS also answers the occasional valid request with the same
“Layer … unknown” error; retrying usually works.
Each pixel covers:
If your bbox covers a large area, each pixel spans more ground and the image is
effectively downsampled. For example, the orthophotos
(
Layers on the raster WMS declare the scale range they render in. The wrapper records the
coarsest end as a minimum zoom level: the orthophotos start at zoom 6, some detailed
layers only at zoom 14 or higher. The interactive map shows a warning when the active
layer needs a higher zoom level.
Layers on the vector WMS declare no range, but some stop rendering when zoomed in very
close: the BD TOPO buildings layer is blank finer than about 0.17 m per pixel
(roughly zoom 19), while the cadastral layers still render. If you use the API
directly and get a blank image, try a bbox that fits the layer's scale: smaller if you
are zoomed out too far, larger (or fewer pixels) if you are zoomed in too close.
SRSNAME=EPSG:4326 so the upstream reprojection happens there. If you need
the raw upstream GML (in its original CRS and axis order), use the
/wf
Why are WMS images limited in size?
/wms-r/wms) declares a maximum of 5010 pixels per side
and rejects anything larger, with an error that misleadingly reads
“Layer … unknown”. The vector WMS (/wms-v/ows) declares no
limit; images 16384 pixels wide rendered in our tests (2026-11-06). The wrapper
passes your width and height on without capping them at these
limits. If you need a larger area, split your bounding box into smaller tiles.
How do I get full-resolution WMS images?
ground per pixel = bbox width (or height) / pixel width (or height)
HR.ORTHOIMAGERY.ORTHOPHOTOS, about 0.3 m per pixel) render every source
pixel in a 5010-pixel image only if the bbox is no wider than about
5010 × 0.3 m ≈ 1.5 km. A wider bbox still works but returns a
downsampled image. Asking for more pixels than that gains nothing: where the native
resolution is known, the wrapper lowers width and height to
match it.
Why do some WMS layers return blank images?
The Géoplateforme WFS is a conformant INSPIRE download service, but its feature
types are IGN's national data models (BDTOPO_V3, BDCARTO_V5,
ADMINEXPRESS-COG, CADASTRALPARCELS.PARCELLAIRE_EXPRESS,
BAN-PLUS, …), not the INSPIRE application schemas. The INSPIRE wrapper
admits a WFS only when its data is in the INSPIRE vocabulary, so the national data lives
here, with class and property URIs of its own. Other French publishers' national-model
services (Shom, BRGM, Sandre, the regional GeoServers) are not here either.
/wfs?s={service}&typenames={type}&eq={property}:{value} selects the
features whose property equals the value; like={property}:{pattern} matches a
pattern (* any string, ? one character, case-insensitive). The
value follows the last colon, so the property may be a path into nested objects
with its own prefix colons. A bbox may be added; without one the query runs
over the whole service. count/offset and the format suffixes work
as usual. The wrapper turns this into one OGC Filter Encoding 2.0 (FES) document — with the
bbox folded in as fes:BBOX, because a WFS 2.0 server rejects the KVP
BBOX and FILTER parameters side by side.
GET /wfs?s=https://data.geopf.fr/wfs/ows&typenames=ADMINEXPRESS-COG.LATEST:commune
&like=ADMINEXPRESS-COG.LATEST:nom_officiel:*Saint-Malo*
Property names for a type follow from its features (or from
/wfs?s={wfs-uri}&typenames={type}, the type's metadata page).
GET /wfs?s=https://data.geopf.fr/wfs/ows&typenames=ADMINEXPRESS-COG.LATEST:commune
&eq=ADMINEXPRESS-COG.LATEST:code_insee:75056xmlns declarations
sent upstream are in the document's PROV (prov:hadPrimarySource, the
upstream GetFeature URL). An unknown prefix is a 400.filter=FILTER parameter unchanged — for anything eq/like
cannot express (ranges, fes:And/fes:Or, spatial operators).
Declare your namespaces yourself, and do not combine it with
bbox: the upstream rejects the pair (put a fes:BBOX inside your
filter instead). filter, eq and like are
alternatives.
GET /wfs?s=https://data.geopf.fr/wfs/ows&typenames=ADMINEXPRESS-COG.LATEST:commune
&filter=<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0"
xmlns:a="http://ADMINEXPRESS-COG.LATEST">
<fes:PropertyIsGreaterThan>
<fes:ValueReference>a:population</fes:ValueReference>
<fes:Literal>200000</fes:Literal>
</fes:PropertyIsGreaterThan>
</fes:Filter>/wms layer with a time dimension supports Memento-style temporal
negotiation: its URI is the original resource (latest data) and acts as its own
TimeGate. Send an Accept-Datetime: Thu, 25 Jun 2020 12:00:00 GMT
header and the wrapper replies 302 to the corresponding memento —
the same URI with a time= component identifying a 30-day window ending at
the requested date. time= is memento URI syntax minted by the TimeGate, not
a query knob. Memento responses carry Memento-Datetime and a
Link (rel="original timegate") header.At discovery time the wrapper probes each WFS service to determine which lookup method it supports. Services that advertise the standard stored query receive:
…?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature &STOREDQUERY_ID=urn:ogc:def:query:OGC-WFS::GetFeatureById &ID=commune.1
All other services receive the standard RESOURCEID parameter instead.
A service may fail either request; the wrapper then answers with the upstream's own
error, in the response and in its PROV.
rdf:type,
owl:sameAs, …) for SPARQL results.
Full URI keys are shown as their local name (the part after # or the last
/); clicking opens the definition. CURIE-style keys such as
rdf:type expand to their full URI and link likewise.rdf:type_droppedGeometryTin, Grid,
LinearGrid). The feature is shown without geometry.
The RDF/XML and Turtle outputs carry geometry as a locn:geometry XML literal
containing the raw GML in the upstream coordinate reference system (e.g. EPSG:2154).
The GeoJSON and JSON-LD outputs project all coordinates to WGS 84 and encode the
geometry as a GeoJSON object, so the three representations are not graph-isomorphic.
After loading features, the link area shows an Upstream link pointing directly
to the source service request that produced the result — for example the WFS
GetFeature call.
This lets you inspect or replay the raw upstream response independently of the wrapper.
To protect the upstream services from excessive load, rate limiting is in place: each IP address may make 50 requests per 10 minutes. The allowance refills continuously, so after hitting the limit you regain roughly one request every 12 seconds. Requests over the limit receive HTTP status 429.
Registered heavy users can bypass the limit with an API key, sent as an HTTP header:
Authorization: Bearer <your-api-key>
Contact the operator (see below) to request a key.