Soft commodity facilities like grain stores, silos, and cooperatives in Brazil.
Guidance for AI agents and automated clients working with this catalog.
One rule survives every edit to this file. Every claim here is either quoted from a source or measured from the data. If you cannot point at where a fact came from, it does not belong in this file. An agent acting on an invented join key or an invented column name produces a confident wrong answer, and nothing downstream catches it.
Every count and every query output below was measured on 2026-08-20 against the published files at the URLs given.
Root: https://data.source.coop/tristangruppwri/soft-commodity-infrastructure/catalog.json
One collection, facilities, at
https://data.source.coop/tristangruppwri/soft-commodity-infrastructure/facilities/collection.json.
Seven GeoParquet files, 83,811 rows, 40,669 distinct entities, Brazil only, all WGS84 (EPSG:4326). Per-file counts and column lists are in the collection's AGENTS.md.
No credentials. Plain HTTPS, so DuckDB reads a file in place without a download:
There is no partition:glob on this collection. Every asset is a single file
addressed by its own https href, so nothing here needs bucket-native s3://
access or a listing.
A condensed version of this guide, sized for a context window, is published as llms.txt.
Measured over the published files.
cod_ibge is the only key that joins layers together cleanly:
BR_muni ⟷ BR_membership_muni is 1:1 on the membership side, and every one of
the 5,257 membership rows finds its municipality. 313 municipalities have no
membership row.
BR_facilities carries no cod_ibge and no municipality name. The unified
layer cannot be joined to municipalities by code; use a spatial predicate
against BR_muni.geometry.
ST_GeomFromWKB(geometry) fails. DuckDB's spatial extension reads the
GeoParquet geometry column as GEOMETRY('OGC:CRS84'), not as a BLOB. Wrapping
it raises No function matches the given name and argument types 'st_geomfromwkb(GEOMETRY('OGC:CRS84'))'. Pass the column straight into
ST_Within, ST_Distance_Sphere, and the rest.
Do not sum the seven row counts. BR_facilities is a union of the other six
plus the modelled catchments. 83,811 is the sum across files; 40,669 is the
number of distinct entities.
entity_id is not a primary key. 40,669 rows carry 35,478 distinct values,
and the value namespace changes with tier — CNPJ-shaped strings, CONAB cda
codes, SIF numbers, Trase facility_ids, and IBGE municipality codes all appear
in the same column. A join on entity_id alone fans out across tiers. Filter on
tier first.
geom_method has five values, not three. Any documentation listing only
registered, geocoded and municipality_centroid is incomplete: municipality
(5,257 rows) and derived (3,103 rows) also occur.
weight has no fixed unit. It is tonnes for silos, a capacity band of 1–4
for SIF plants, cubic metres per day for mills, and a member count for
membership rows. Aggregating it across tiers produces a meaningless number.
municipio_nome is free text and includes the state suffix in some files
(SINOP-MT in BR_intake_points, plain municipality names in BR_muni). Never
join on it. Use cod_ibge or a spatial predicate.
uf and state are different columns. uf is the two-letter abbreviation.
BR_sisbi_points.state is the full state name.
One cod_ibge in BR_intake_points matches no municipality (1,939 of its
1,940 distinct codes resolve against BR_muni). An inner join silently drops
those silos.
Three geometries fail an OGC validity test. The same three municipality
polygons appear in BR_muni, BR_membership_muni, and BR_facilities. Some
spatial predicates raise on them; call ST_MakeValid if a query errors.
The data is GeoParquet 1.0.0 with no bbox covering column. There are no
per-row-group spatial statistics, so a bounding-box filter reads the whole file
rather than pruning row groups. Each file is a single row group, so there is
nothing to prune in any case. The full record, including what it would cost to
repair, is in .portolan/conformance.md in the catalog repository.
Assets and structural links resolve relative to the object that carries them.
Asset hrefs are absolute https. Catalogs here carry no self link, so a client
tracks its own location.
The catalog points back at its source repository with rel: vcs and
rel: issues links on the root catalog, both absolute text/html. Portolan has
not standardized this; see
portolan-spec#145.
Official, not a mirror. The producing organization (World Resources Institute)
is also the host provider, which is how Portolan derives official from mirror.
There are therefore no rel: via or rel: canonical links.
BR_facilities