name: s128-catalogue
description: |
Expert knowledge of IHO S-128 Catalogue of Nautical Products
Product Specification (Edition 2.0.0). Covers GML encoding (S-100
Part 10b) in the application namespace
http://www.iho.int/S128/2.0 over the S-100 GML 5.0 base, the
S-128 feature catalogue (ElectronicProduct, PhysicalProduct,
S100Service, plus producer / distributor / contact metadata
features), and XSLT-based portrayal.
USE FOR: S-128 datasets, catalogues of nautical products,
electronic products, physical products, S-100 services, GML
parsing for S-128, XSLT portrayal of S-128, vector pipeline
changes affecting S-128, S-128 reader/source code, S-128 tests,
edits to bundled content/S128/** assets.
DO NOT USE FOR: S-127 marine resources and services (use
s127-marine-services), S-122 marine protected areas (use
s122-marine-protected-areas), S-124 nav warnings (use
s124-nav-warnings), S-101 ENC (use s101-enc), generic GML
/ framework concerns (use s100-framework).
S-128 Catalogue of Nautical Products expert
When engaged
- Tasks touching
src/EncDotNet.S100.Datasets.S128/**,tests/EncDotNet.S100.Datasets.S128.Tests/**,src/EncDotNet.S100.Datasets.Pipelines/S128DatasetProcessor.cs, orsrc/EncDotNet.S100.Specifications/content/S128/** - GML/XSLT portrayal changes for S-128 features
- Vector pipeline changes (
IVectorSource,VectorPipeline) affecting S-128
Spec anchors
- Canonical: S-128 Edition 2.0.0 Catalogue of Nautical Products PS
- S-100 Part 10b: GML encoding (uses the S-100 GML 5.0 namespace
http://www.iho.int/s100gml/5.0) - S-100 Part 9: Portrayal (XSLT path;
main.xsl+ per-feature sub-templates including aDefault.xslfallback) - S-128 application namespace:
http://www.iho.int/S128/2.0
Feature catalogue overview
S-128 datasets describe a catalogue (typically by-region) of the nautical products themselves — they are not navigation data. The reader surfaces three product feature classes plus a set of metadata features:
| Feature class | Role | Portrayal |
|---|---|---|
ElectronicProduct |
Digital nautical products (ENC, etc.) | Yellow area fill (CHYLW, transparency 0.30) |
PhysicalProduct |
Paper charts / paper publications | Green area fill (CHGRN, transparency 0.30) |
S100Service |
Service endpoints (e.g. SECOM) | Magenta area fill (CHMGD, transparency 0.30) |
DistributorInformation |
Producer / distributor metadata | None (handled via Default.xsl) |
ProducerInformation |
Producer metadata | None |
ContactDetails |
Contact records | None |
CatalogueSectionHeader |
Logical grouping inside the dataset | None |
S128ProductEntry is the strongly-typed façade over the three
product feature classes; consumers should query through
S128CatalogueQuery rather than poking the raw feature graph.
Review checklist
- GML parsing accepts the canonical
s100gml/5.0namespace and tolerates the legacy 1.0 profile namespaces (http://www.iho.int/s100gml/1.0,http://www.iho.int/S100/profile/s100gml/1.0). - Coordinate ordering in
<gml:pos>/<gml:posList>is lat lon forEPSG:4326(S-100 Part 10b §6.2). Do not assume lon,lat. - Feature recognition is namespace-driven: any
<member>/<members>child whose namespace matches the dataset's application schema is surfaced as anS128Feature. Do not introduce a hard-coded feature-type allow-list — the bundledmain.xslwalksDataset/Features/*so new feature classes surface automatically once the FC adds them. - Geometry on a feature must be wrapped in a
<S128:geometry>element; the reader's geometry search starts inside that wrapper. <imember>/<imembers>plumbing is preserved for forward compatibility but expected to be empty for 2.0.0 datasets (S-128 Edition 2.0.0 has no information types).- Container-style / metadata features (
DistributorInformation,CatalogueSectionHeader, etc.) may have no geometry; renderers must tolerate geometry-less features. - Portrayal flows through XSLT (not Lua); keep transforms to
features supported by .NET's
XslCompiledTransform. - Status heuristic: prefer
serviceStatus(1 Planned / 2 InForce / 3 Withdrawn), fall back todistributionStatus(1 InForce / 2 Withdrawn), default toInForce. Superseded resolution viatheReferencexlink withProductMapping/categoryOfProductMapping=1is not yet wired — document this gap when extendingS128ProductEntry. - The bundled portrayal catalogue under
content/S128/{fc,pc}/is byte-identical to upstream (iho-ohi/S-128-Product-Specification-Development@c266c43820ce…). Do not edit those files. If upstream needs adapting for this codebase, add an adapter (mirror the S-411 pattern) rather than editing the catalogue files directly. - Public API changes have xunit tests; synthetic GML fixtures
belong under
tests/datasets/S128/. The official 2.0.0 sampleS128_TDS_sample.gmlis committed there for end-to-end tests.
Known pitfalls in this repo
- The producer-bug compensations are inherited from the S-122
reader:
s100gmlnamespace tolerance,<member>and<members>wrappers, comma-and-whitespaceposListtokens, and the lon-lat axis-order swap heuristic against<gml:Envelope>. Preserve all four behaviours when refactoring. - Per-feature XSLT rules emit area fills as
<color transparency="0.30">CHGRN</color>— i.e. transparency on the<color>attribute, NOT a child<transparency>element.Part9DisplayListReaderaccepts both forms; do not regress. - The official sample contains a giant
PhysicalProduct(CNP00004, ~lat 27–44, lon 120–135) that visually overlaps every other product. This is a feature-of-the-sample, not a bug — area ordering / selection is a renderer-side UX concern. S128PortrayalCatalogueis a clone of the S-122 catalogue with Day/Dusk/Night enabled (the upstream PC ships all three palettes).