Analyse fichiers géométrie HEC-RAS

VérifiéSûr

Parse et modifie les fichiers géométrie HEC-RAS au format texte fixed-width FORTRAN (.g##). Gère sections transversales, zones stockage, ponts, buses, structures latérales et tables Manning's n.

Spar Skills Guide Bot
Data & IAIntermédiaire
04/03/2026
Claude Code
#hec-ras#geometry-parsing#fixed-width#hydraulic-modeling#cross-sections

Recommandé pour

Synthèse automatique

Fournit des recettes Python basées sur ras_commander pour lire et modifier les fichiers de géométrie HEC-RAS en texte brut (.g##) : sections transversales, zones de stockage, ponts, buses et tables de Manning n 2D.

Points forts

  • Extraits de code directement copiables pour lister, lire et réécrire des sections transversales, avec création automatique d'une sauvegarde .bak
  • Couvre plusieurs entités de géométrie : XS station-élévation, stations de berges, ouvrages de stockage, tabliers et piles de pont, land cover 2D
  • Oriente vers un guide d'implémentation et des notebooks d'exemple (201_1d, 202_2d) pour les algorithmes et l'API complète
  • Gère l'interpolation des stations de berges lors de la réécriture du profil

Limites

  • Dépend du paquet externe ras_commander et de son API : aucun code de parsing brut n'est inclus
  • Référence partielle dans ce SKILL.md : les sections buses et structures latérales sont tronquées, seuls des motifs d'usage sont donnés
  • Les outils autorisés (Read, Grep, Glob) ne permettent pas d'exécuter le Python ni de valider les modifications
Quand l'utiliser

À utiliser pour inspecter ou modifier en masse la géométrie .g## d'un modèle HEC-RAS, par exemple interroger des profils station-élévation ou mettre à jour la rugosité 2D.

Quand l'éviter

À éviter pour les fichiers de projet, d'écoulement ou de plan HEC-RAS, ou pour lancer le modèle : ce skill ne traite que la géométrie en texte brut.

Analyse de sécurité

Sûr
Score qualité88/100

The skill provides domain-specific Python code snippets for parsing and modifying HEC-RAS geometry files using a local library. It does not instruct destructive actions, exfiltration, obfuscation, or use of network/curl/sh. File modifications are legitimate engineering tasks with automatic backups. Declared allowed-tools are read-only, and the code examples are instructional rather than executed directly by the agent, further reducing risk.

Aucun point d'attention détecté

Comment cette analyse est faite

Exemples

List cross sections and banks
List every cross section in model.g01 for the Ohio River / Reach 1, then show the bank stations for RS 1000.
Lower channel elevations
Read the station-elevation profile for RS 1000 in model.g01, lower elevations by 2 ft between stations 100 and 200, and write it back keeping the existing bank stations.
Update 2D Manning's n
Open model.g01, set Manning's n for land cover ID 42 to 0.15, and save it with a backup.

name: parsing-hecras-geometry allowed-tools: [Read, Grep, Glob] description: | Parses and modifies HEC-RAS plain text geometry files (.g##) using fixed-width FORTRAN format. Handles cross sections, storage areas, bridges, culverts, lateral structures, and Manning's n tables. Use when reading geometry files, modifying cross sections, updating roughness, extracting structure data, parsing .g## files, working with XS station-elevation data, or analyzing bridge/culvert geometry. Keywords: parse, geometry, .g##, cross section, XS, Manning's n, bridge, culvert, storage, fixed-width, lateral structure, inline weir, 2D land cover, bank stations.

Parsing HEC-RAS Geometry Files

Primary Sources (navigate to these for details):

  • Implementation guide: ras_commander/geom/AGENTS.md (parsing algorithms, API reference)
  • Working examples: examples/201_1d_plaintext_geometry.ipynb and examples/202_2d_plaintext_geometry.ipynb (comprehensive demonstrations)

This skill provides quick-reference patterns for common tasks. For implementation details, parsing algorithms, and complete API documentation, see the primary sources above.

Quick Start Patterns

List Cross Sections

from ras_commander.geom.GeomCrossSection import GeomCrossSection

# List all cross sections in file
xs_df = GeomCrossSection.get_cross_sections("model.g01")
# Returns: DataFrame with River, Reach, RS, NodeName

# Filter by river/reach
xs_df = GeomCrossSection.get_cross_sections(
    "model.g01",
    river="Ohio River",
    reach="Reach 1"
)

Read Cross Section Geometry

# Get station-elevation profile
df = GeomCrossSection.get_station_elevation(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)
# Returns: DataFrame with Station, Elevation columns

# Get bank stations
banks = GeomCrossSection.get_bank_stations(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)
# Returns: dict with BankLeft, BankRight keys

Modify Cross Section

# Read current geometry
df = GeomCrossSection.get_station_elevation(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)

# Modify elevations (e.g., lower channel 2 feet)
df.loc[df['Station'].between(100, 200), 'Elevation'] -= 2.0

# Get bank stations
banks = GeomCrossSection.get_bank_stations(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)

# Write back (creates .bak backup, handles bank interpolation)
GeomCrossSection.set_station_elevation(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000",
    df,
    bank_left=banks['BankLeft'],
    bank_right=banks['BankRight']
)

Update 2D Manning's n

from ras_commander.geom.GeomLandCover import GeomLandCover

# Read land cover table
lc_df = GeomLandCover.get_base_mannings_n("model.g01")
# Returns: DataFrame with LandCoverID, ManningsN

# Modify roughness
lc_df.loc[lc_df['LandCoverID'] == 42, 'ManningsN'] = 0.15

# Write back (creates .bak backup)
GeomLandCover.set_base_mannings_n("model.g01", lc_df)

Extract Storage Areas

from ras_commander.geom.GeomStorage import GeomStorage

# List storage areas (exclude 2D flow areas)
storage_areas = GeomStorage.get_storage_areas("model.g01", exclude_2d=True)

# Get elevation-volume curve
df = GeomStorage.get_elevation_volume("model.g01", "Detention Basin 1")
# Returns: DataFrame with Elevation, Area, Volume columns

Read Bridge Geometry

from ras_commander.geom.GeomBridge import GeomBridge

# List all bridges
bridges = GeomBridge.get_bridges("model.g01")

# Get bridge deck geometry
deck_df = GeomBridge.get_deck(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)
# Returns: DataFrame with Station, Elevation, Width, Distance

# Get pier data
piers_df = GeomBridge.get_piers(
    "model.g01",
    "Ohio River",
    "Reach 1",
    "1000"
)
# Returns: DataFrame with Station, Width, CD coefficients

Read Culverts

from ras_commander.geom.GeomCulvert import GeomCulvert

# Get all culverts in file
culverts_df = GeomCulvert.get_all("model.g01")
# Returns: DataFrame with River, Reach, RS, CulvertNum, Shape, etc.

# Filter by river/reach
culverts_df = GeomCulvert.get_all(
    "model.g01",
    river="Ohio River",
    reach="Reach 1"
)

# Culvert shape codes:
# 1=Circular, 2=Box, 3=Pipe Arch, 4=Ellipse, 5=Arch
# 6=Semi-Circle, 7=Low Profile Arch, 8=High Profile Arch, 9=Con Span

Module Organization

| Module | Class | Purpose | |--------|-------|---------| | GeomParser | GeomParser | Fixed-width format parsing utilities | | GeomCrossSection | GeomCrossSection | 1D cross section operations | | GeomStorage | GeomStorage | Storage area elevation-volume curves | | GeomLandCover | GeomLandCover | 2D Manning's n land cover tables | | GeomLateral | GeomLateral | Lateral structures and SA/2D connections | | GeomInlineWeir | GeomInlineWeir | Inline weir structures | | GeomBridge | GeomBridge | Bridge/culvert structure geometry | | GeomCulvert | GeomCulvert | Culvert data extraction | | GeomPreprocessor | GeomPreprocessor | Geometry preprocessor file management |

See ras_commander/geom/AGENTS.md for complete API documentation.

Critical Implementation Notes

Bank Station Interpolation

Handled automatically - set_station_elevation() ensures bank stations appear as exact points:

  • If bank station exists in data: uses it directly
  • If bank station missing: interpolates elevation and inserts point
  • You don't need to manually interpolate bank stations

450 Point Limit

HEC-RAS enforces maximum 450 points per cross section:

# Validate before writing
if len(df) > 450:
    raise ValueError(f"Cross section has {len(df)} points (max 450)")

Case-Sensitive Identifiers

River, Reach, and RS are case-sensitive:

# These are DIFFERENT:
GeomCrossSection.get_station_elevation(geom_file, "Ohio River", ...)
GeomCrossSection.get_station_elevation(geom_file, "ohio river", ...)

Use exact casing from get_cross_sections() DataFrame.

Automatic Backups

All write operations create .bak files:

Original: model.g01
Modified: model.g01
Backup:   model.g01.bak

Fixed-Width Format

HEC-RAS uses FORTRAN-era formatting:

  • Column width: 8 characters per value
  • Values per line: 10 values (80 characters total)
  • Count interpretation: #Sta/Elev= 40 means 40 PAIRS (80 total values)

See ras_commander/geom/AGENTS.md for parsing algorithm details.

Common Workflows

Batch Modify All Cross Sections

# Get list of all cross sections
xs_df = GeomCrossSection.get_cross_sections("model.g01")

# Iterate through each
for _, row in xs_df.iterrows():
    river = row['River']
    reach = row['Reach']
    rs = row['RS']

    # Read geometry
    df = GeomCrossSection.get_station_elevation("model.g01", river, reach, rs)

    # Apply modification (e.g., raise all elevations 1 foot)
    df['Elevation'] += 1.0

    # Get bank stations
    banks = GeomCrossSection.get_bank_stations("model.g01", river, reach, rs)

    # Write back
    GeomCrossSection.set_station_elevation(
        "model.g01",
        river,
        reach,
        rs,
        df,
        bank_left=banks['BankLeft'],
        bank_right=banks['BankRight']
    )

Extract All Storage Curves

from ras_commander.geom.GeomStorage import GeomStorage

# List storage areas (exclude 2D flow areas)
storage_areas = GeomStorage.get_storage_areas("model.g01", exclude_2d=True)

# Extract elevation-volume curves
for area_name in storage_areas:
    df = GeomStorage.get_elevation_volume("model.g01", area_name)
    print(f"{area_name}: {len(df)} elevation points")
    # df has columns: Elevation, Area, Volume

Survey All Culverts

from ras_commander.geom.GeomCulvert import GeomCulvert

# Get all culverts in file
culverts_df = GeomCulvert.get_all("model.g01")

# Interpret shape codes
shape_map = {
    1: "Circular", 2: "Box", 3: "Pipe Arch", 4: "Ellipse",
    5: "Arch", 6: "Semi-Circle", 7: "Low Profile Arch",
    8: "High Profile Arch", 9: "Con Span"
}

for _, row in culverts_df.iterrows():
    shape_name = shape_map[row['Shape']]
    print(f"{row['River']} - {row['RS']}: {shape_name} culvert")

Error Handling

File Not Found

from pathlib import Path

# Verify file exists
if not Path(geom_file).exists():
    raise FileNotFoundError(f"Geometry file not found: {geom_file}")

Invalid River/Reach/RS

# List available features first
xs_df = GeomCrossSection.get_cross_sections(geom_file)
print(xs_df[['River', 'Reach', 'RS']])

# Use exact casing
df = GeomCrossSection.get_station_elevation(
    geom_file,
    "Ohio River",  # Exact case
    "Reach 1",     # Exact case
    "1000"         # Exact string
)

Point Limit Exceeded

# Validate before writing
if len(df) > 450:
    # Option 1: Simplify geometry
    from scipy.interpolate import interp1d
    f = interp1d(df['Station'], df['Elevation'])
    new_stations = np.linspace(df['Station'].min(), df['Station'].max(), 400)
    df = pd.DataFrame({
        'Station': new_stations,
        'Elevation': f(new_stations)
    })

    # Option 2: Raise error for user to handle
    raise ValueError(f"Cross section has {len(df)} points (max 450)")

Primary Sources

For complete details, navigate to:

  1. ras_commander/geom/AGENTS.md

    • Parsing algorithms (fixed-width format, count interpretation)
    • Complete API reference for all 9 modules
    • Technical patterns and implementation notes
    • Culvert shape codes table
    • Deprecated class mappings
  2. examples/201_1d_plaintext_geometry.ipynb and examples/202_2d_plaintext_geometry.ipynb

    • Working code demonstrations for all modules
    • Real HEC-RAS project examples
    • Output visualizations
    • Error handling examples
    • Integration with other ras-commander features

Import Pattern

All classes use static methods - no instantiation required:

from ras_commander.geom.GeomCrossSection import GeomCrossSection
from ras_commander.geom.GeomStorage import GeomStorage
from ras_commander.geom.GeomBridge import GeomBridge
from ras_commander.geom.GeomCulvert import GeomCulvert
from ras_commander.geom.GeomLandCover import GeomLandCover

# Use directly (no instantiation)
xs_df = GeomCrossSection.get_cross_sections("model.g01")

See Also

  • CLAUDE.md: Architecture section on geometry parsing (lines 165-220)
  • Subagent: .claude/agents/geometry-parser/SUBAGENT.md - For delegation

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/hec-ras-geometry-file-parsing-mmbizk9i/download' --output '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md.part' && mv '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md.part' '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md' && test -s '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/parsing-hecras-geometry' && cp -R '.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i' '.claude/skills/parsing-hecras-geometry'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i'

openskills read 'hec-ras-geometry-file-parsing-mmbizk9i'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/hec-ras-geometry-file-parsing-mmbizk9i/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires