Flood Alignment Pipeline — Reference

Data Formatting Guide:
Rhino & ArcGIS Pro

How to prepare geometry and attributes in Rhino or ArcGIS Pro so that your exports load cleanly into the BCA flood analysis pipeline.

v1.0 · March 2026

01Overview

This guide is for designers and GIS analysts who create flood protection geometry in Rhino or ArcGIS Pro and need to format that work for the BCA flood analysis pipeline. It covers the exact geometry types, attribute fields, naming conventions, and coordinate system requirements the pipeline expects.

For the mechanics of actually loading formatted data into the pipeline, see the companion Data Loading Guide.

Two Paths, Same Destination

Rhino users export .3dm files, which are ingested via ingest_cad.py. Attributes are set per-object using Rhino's SetUserText command.
ArcGIS Pro users export .geojson files directly. Attributes are columns in the feature class attribute table. Both routes produce the same pipeline-ready GeoJSON.

Rhino .3dm ingest_cad.py GeoJSON Pipeline
ArcGIS Pro Features to JSON GeoJSON Pipeline

02Quick Reference: What to Produce

Every feature you create falls into one of three categories. Each has a required geometry type and a small set of required attributes. Both measure_type and measure_name are automatically determinedmeasure_type from the Rhino layer name, and measure_name as a sequential label (e.g., levee_1, levee_2) if not set via SetUserText or Rhino object name. The table below shows the attributes you should provide, along with default values that apply if you don't override them.

CategoryMeasure TypeGeometryFlood-Relevant AttributesOptional AttributesDefaults (if not set)
Barriers levee LineString crest_elevation_m, width_m measure_name, scenario, scenario_label measure_name: levee_1, …; crest_elevation_m: 3.5; width_m: 2.0
seawall LineString crest_elevation_m, width_m measure_name, scenario, scenario_label measure_name: seawall_1, …; crest_elevation_m: 3.5; width_m: 2.0
gate LineString crest_elevation_m measure_name, scenario, scenario_label measure_name: gate_1, …; crest_elevation_m: 3.5
platform Polygon crest_elevation_m, width_m measure_name, scenario, scenario_label measure_name: levee_1, …; crest_elevation_m: 4.064 (13′4″); width_m: 0
Stormwater pump Point capacity_cms measure_name, invert_elev_m measure_name: pump_1, …; capacity_cms: 5.0
culvert Polyline capacity_cms measure_name measure_name: culvert_1, …; capacity_cms: 2.0
retention Polygon capacity_m3, infiltration_rate_mm_hr measure_name, outlet_elev_m measure_name: retention_1, …; capacity_m3: 10,000; infiltration_rate_mm_hr: 5.0
green_infra Polygon retention_pct measure_name measure_name: green_infra_1, …; retention_pct: 0.25
Buildings custom building Polygon ground_elevation_m, first_floor_height_m, replacement_value_usd use_category, height_m use_category: miscellaneous; ground_elevation_m: from DEM; first_floor_height_m: by use_category; height_m: 9.0
Rule of Thumb

Linear features (barriers, walls, gates) → open polylines / LineStrings.
Area features (basins, green infra, buildings, platforms) → closed polylines / Polygons.
Point features (pump stations) → single points.

03Rhino Workflow

Layer Setup

Organize your Rhino model using the layer names below. The ingestion script maps each layer to a pipeline target directory. Layer names are case-insensitive and spaces are treated as underscores. Any layer not in this list is skipped with a warning.

barriers protection_measures/barriers/ levee protection_measures/barriers/ seawall protection_measures/barriers/ gate protection_measures/barriers/ platform protection_measures/barriers/ pump protection_measures/stormwater/ culvert protection_measures/stormwater/ retention protection_measures/stormwater/ green_infra protection_measures/stormwater/ stormwater protection_measures/stormwater/ buildings custom_buildings/ building_prot protection_measures/building/

Each layer automatically sets measure_type and default attribute values. You only need to use SetUserText on an object if it differs from the layer default. See the Quick Reference table for the full list of defaults per measure type.

Geometry Rules

The ingestion script converts Rhino geometry to 2D GeoJSON. Follow these rules to ensure clean conversion:

What You’re DrawingRhino Geometry to UseResult
Levee, seawall, gate Open polyline (or line, NurbsCurve). Do NOT close the curve. LineString
Retention basin, green infra, platform Closed polyline or closed curve. Rhino auto-detects via IsClosed. Polygon
Pump station Point object placed at the pump location. Point
Culvert Open polyline drawn from inlet to outlet. Line direction defines flow direction. LineString
Building footprint Closed polyline, Extrusion, Brep, or Mesh. 3D solids are projected to a 2D convex hull. Polygon
Z coordinates are discarded

All geometry is projected to 2D (X, Y only). Do not encode elevation data in Z coordinates. Instead, set elevation values as attributes (crest_elevation_m, ground_elevation_m) using SetUserText. This ensures consistency with the NAVD88 vertical datum used by the flood model.

Curve Simplification

NURBS curves, arcs, and splines are sampled at 0.5m intervals (max 500 vertices). If your barrier alignment has complex curvature, the sampled output will still be accurate to sub-metre precision. For simple straight-line barriers, use a basic polyline to keep vertex counts low.

User Text Attributes

Select an object in Rhino and use the SetUserText command to attach key-value pairs. These override the layer defaults for that specific object.

Rhino Command Line
// Barrier with specific crest elevation
SetUserText crest_elevation_m 5.33
SetUserText width_m 2.5
SetUserText measure_name "East Harlem Seawall Section A"

// Pump station with custom capacity
SetUserText capacity_cms 12.5
SetUserText measure_name "West 225th St Pump"

// Building with usage data
SetUserText use_category multi_family
SetUserText replacement_value_usd 1200000
SetUserText first_floor_height_m 0.46
measure_name is optional

If you don't set measure_name, the pipeline generates one automatically: levee_1, levee_2, pump_1, etc., numbered sequentially per measure type. You can also set a Rhino object name (via the Properties panel) as a quick alternative to SetUserText — object names are used as measure_name when present.

Coordinate System

The ingestion script assumes your Rhino model is in UTM Zone 18N (EPSG:32618) by default, which means your model units should be metres and your coordinates should be in UTM easting/northing.

If your model uses a different CRS, specify it at ingest time:

Terminal
# NY State Plane Long Island (US survey feet)
python scripts/ingest_cad.py my_design.3dm --source-crs EPSG:2263

# NY State Plane Long Island (metres, NAD83 2011)
python scripts/ingest_cad.py my_design.3dm --source-crs EPSG:6539
Unit Mismatch

If your Rhino model is in feet but you don't specify the CRS, the script will treat those coordinates as metres and your geometry will be wildly misplaced. Always verify your model units match your declared CRS.

Rhino Export Checklist

Before saving your .3dm file for ingestion:

04ArcGIS Pro Workflow

Feature Class Setup

In ArcGIS Pro, organize your data into separate feature classes (or layers in a geodatabase) by measure category. Each feature class should contain a single geometry type.

Feature ClassGeometry TypeContains
barriersPolylineLevees, seawalls, gates — all linear barrier features
stormwater_areasPolygonRetention basins, green infrastructure coverage areas
pump_stationsPointPump station locations
culvertsPolylineDrainage culverts (inlet to outlet)
custom_buildingsPolygonProposed or hypothetical building footprints
Separate Classes, Separate Exports

Export each feature class to its own .geojson file. The pipeline expects one GeoJSON per file, placed in the correct subdirectory (protection_measures/barriers/, protection_measures/stormwater/, or custom_buildings/).

Geometry Rules

What You’re DrawingArcGIS GeometryNotes
Levee, seawall, gate Polyline feature class Draw as standard polylines. Multi-part polylines are exploded into individual LineStrings on export.
Retention basin, green infra Polygon feature class Draw as standard polygons. Donuts (holes) are preserved.
Pump station Point feature class Single point at pump location. Do not use a polygon buffer.
Culvert Polyline feature class Draw from inlet to outlet. Line direction defines flow direction.
Building footprint Polygon feature class Standard building footprint polygon. Must be a closed ring.
No Multipatch or 3D

The pipeline reads 2D geometry only. If you have 3D features (Multipatch, 3D polylines with Z values), flatten them to 2D before exporting. In ArcGIS Pro, Z values in polylines/polygons are silently ignored by the GeoJSON export, but Multipatch features will fail to convert.

Attribute Table Schema

Add these fields to your feature class attribute tables. The pipeline reads property names from the GeoJSON properties object, which mirrors your attribute table column names. Field names are case-sensitive and must use snake_case.

Barriers (Polyline Feature Class)

Field NameTypeDescription
measure_typeText requiredOne of: levee, seawall, gate
measure_nameText requiredHuman-readable name (e.g., "East Harlem — Seawall")
crest_elevation_mDouble requiredTop-of-barrier elevation in metres NAVD88
width_mDouble optionalStructural width for DEM rasterization. Default: 2.0
scenarioText optionalScenario identifier (e.g., harlem_river_frontline)
scenario_labelText optionalHuman-readable scenario name

Stormwater — Pump Stations (Point Feature Class)

Field NameTypeDescription
measure_typeText requiredMust be pump
measure_nameText requiredPump station name
capacity_cmsDouble optionalPumping capacity in m³/s. Default: 5.0
invert_elev_mDouble optionalInlet invert elevation in metres NAVD88

Stormwater — Culverts (Polyline Feature Class)

Field NameTypeDescription
measure_typeText requiredMust be culvert
measure_nameText requiredCulvert name or identifier
capacity_cmsDouble optionalFlow capacity in m³/s. Default: 2.0

Stormwater — Areas (Polygon Feature Class)

Field NameTypeDescription
measure_typeText requiredOne of: retention, green_infra
measure_nameText requiredFeature name
capacity_m3Double optionalStorage volume in m³ (retention only). Default: 10,000
infiltration_rate_mm_hrDouble optionalSoil infiltration rate (retention only). Default: 5.0
retention_pctDouble optionalFraction of rainfall retained, 0–1 (green_infra only). Default: 0.25

Custom Buildings (Polygon Feature Class)

Field NameTypeDescription
use_categoryText requiredOne of: single_family, multi_family, commercial, industrial, miscellaneous
height_mDouble optionalBuilding height in metres. Default: 9.0
replacement_value_usdDouble optionalFull replacement cost for damage calculation
ground_elevation_mDouble optionalGround elevation NAVD88. Sampled from DEM if omitted.
first_floor_height_mDouble optionalFirst floor above grade. Uses default by use_category if omitted.

Coordinate System

GeoJSON files must be in WGS 84 (EPSG:4326) with coordinates as [longitude, latitude] in decimal degrees. If your ArcGIS Pro project uses a projected CRS (State Plane, UTM, etc.), the export tool will reproject automatically — but you should verify the output CRS after export.

Verifying CRS After Export

Open your exported .geojson file in a text editor. Coordinates should look like [-73.935, 40.836] (longitude in the −70s, latitude in the 40s for NYC). If you see large numbers like [583000, 4515000], the export is still in a projected CRS and must be reprojected.

Export to GeoJSON

Use the Features to JSON geoprocessing tool in ArcGIS Pro. After export, you need to add the collection-level metadata fields that the pipeline expects.

  1. Open Geoprocessing → search for Features to JSON
  2. Set Input Features to your feature class
  3. Set Output JSON File to your desired filename (e.g., my_barriers.geojson)
  4. Check Formatted JSON for readability
  5. Check Output to GeoJSON
  6. Set GeoJSON Output Geometry Type appropriately
  7. Ensure the output CRS is WGS 84
  8. Run the tool

After exporting, open the .geojson file in a text editor and add these collection-level fields at the top of the JSON object, alongside "type" and "features":

Required Collection Metadata
{
  "type": "FeatureCollection",
  "name": "my_barriers",            // machine ID (snake_case, no spaces)
  "label": "My Custom Barriers",    // display name
  "description": "Barrier set for...", // optional
  "category": "barriers",            // "barriers" | "stormwater" | "building"
  "features": [ ... ]
}

Use this ArcPy snippet to export with metadata in one step:

ArcPy
import arcpy, json

fc = "my_barriers"                   # feature class name
out = "protection_measures/barriers/my_barriers.geojson"

# Export to temp GeoJSON
arcpy.conversion.FeaturesToJSON(
    fc, out.replace(".geojson", "_tmp.geojson"),
    geoJSON="GEOJSON",
    outputToWGS84="WGS84"
)

# Add collection-level metadata
with open(out.replace(".geojson", "_tmp.geojson")) as f:
    data = json.load(f)

data["name"] = "my_barriers"
data["label"] = "My Custom Barriers"
data["category"] = "barriers"

with open(out, "w") as f:
    json.dump(data, f, indent=2)

print(f"Exported {len(data['features'])} features to {out}")

05Barriers: Detailed Formatting

Barriers are the most critical feature type. They modify the SFINCS hydrodynamic model terrain by rasterizing the crest elevation along the alignment onto the DEM grid. Incorrect formatting here will cause modeling errors.

Geometry

Gaps Kill Flood Protection

If two barrier segments don't connect end-to-end, water flows through the gap in the model. Snap segment endpoints precisely. In Rhino, use Point Osnap. In ArcGIS Pro, use snapping to ensure polyline endpoints coincide exactly. The pipeline generates automatic tie-in extensions to high ground for unconnected endpoints, but this works best for endpoints near the study area boundary—not for mid-alignment gaps.

Required Attributes

AttributeWhat to SetExample
measure_type levee — earthen embankment or generic wall
seawall — shoreline barrier (modeled identically to levee)
gate — deployable barrier or floodgate
levee
measure_name A descriptive, human-readable label. Include the project area and feature type for clarity. East Harlem — Seawall
crest_elevation_m Top-of-barrier elevation in metres NAVD88. This is the elevation at which the barrier blocks water. To convert from feet: multiply by 0.3048. 5.33 (= 17.5 ft)

Optional Attributes

AttributeWhen to SetDefault
width_m If the barrier has a specific structural width. Used to buffer the LineString for DEM rasterization. 2.0 m
scenario To group barriers into named scenarios for comparison (e.g., frontline vs setback_75m).
scenario_label Human-readable version of scenario for display.

Example: Complete Barrier Feature

GeoJSON Feature (what ArcGIS Pro should export)
{
  "type": "Feature",
  "geometry": {
    "type": "LineString",
    "coordinates": [
      [-73.9348, 40.8353],
      [-73.9341, 40.8339],
      [-73.9335, 40.8322],
      [-73.9348, 40.8299]
    ]
  },
  "properties": {
    "measure_type": "levee",
    "measure_name": "East Harlem — Seawall",
    "crest_elevation_m": 5.33,
    "width_m": 2.5,
    "scenario": "harlem_river_frontline",
    "scenario_label": "Harlem River Frontline Seawall"
  }
}

06Stormwater: Detailed Formatting

Pump Stations

Pump stations are Point features located where the pump removes water from the model. They are the simplest feature to format.

AttributeWhat to SetDefault
measure_typeMust be pump
measure_nameStation name
capacity_cmsPumping rate in m³ per second. To convert from gallons per minute: GPM × 0.0000631.5.0
invert_elev_mInlet invert elevation (metres NAVD88). Only if known.

Culverts

Culverts are LineString features drawn from inlet to outlet. The line direction defines the flow path. In SFINCS, culverts are modeled as passive drainage structures that convey water along the alignment at the specified capacity.

AttributeWhat to SetDefault
measure_typeMust be culvert
measure_nameCulvert name or identifier
capacity_cmsFlow capacity in m³ per second.2.0

Retention Basins

Retention basins are Polygon features representing the storage footprint. Draw the polygon to match the basin's plan-view footprint.

AttributeWhat to SetDefault
measure_typeMust be retention
measure_nameBasin name
capacity_m3Total storage volume in cubic metres. To convert from cubic feet: ft³ × 0.0283.10,000
infiltration_rate_mm_hrSoil infiltration rate in mm/hr. Use site-specific data if available.5.0
outlet_elev_mOverflow outlet elevation (metres NAVD88).

Green Infrastructure

Green infrastructure is a Polygon representing the coverage area of a distributed network (bioswales, rain gardens, permeable pavement, etc.). It need not represent individual installations; draw it as the overall service area.

AttributeWhat to SetDefault
measure_typeMust be green_infra
measure_nameNetwork name (e.g., "University Ave Corridor")
retention_pctFraction of rainfall retained within the network, from 0 to 1. A value of 0.25 means 25% of rainfall is captured.0.25

07Custom Buildings: Detailed Formatting

Custom buildings represent proposed developments, hypothetical structures, or corrections to the NYC building database. They must be Polygon features representing the building footprint.

use_category Values

This is the only required attribute. It determines which HAZUS depth-damage curve is applied and what default first-floor height is assumed.

ValueDescriptionDefault FFE Above Grade
single_family1–2 family residential0.46 m (18″) — raised foundation
multi_family3+ unit residential (apartments, condos)0.30 m (12″) — low entry
commercialRetail, office, mixed-use commercial0.00 m — slab on grade
industrialWarehouse, factory, industrial0.00 m — slab on grade
miscellaneousOther / unknown0.15 m (6″)

Optional Attributes

AttributeWhen to SetDefault
height_m If you know the building height. Affects visualization but not the damage model. 9.0 m
replacement_value_usd If you have a specific replacement cost estimate. Otherwise the pipeline estimates from PLUTO data. Estimated from PLUTO
ground_elevation_m If you have surveyed ground elevation. Otherwise sampled from the DEM at the polygon centroid. Sampled from DEM
first_floor_height_m If the building has a non-standard first-floor height (e.g., flood-adapted construction with elevated entry). By use_category (see above)
Footprint Accuracy

Flood depth is sampled at the polygon centroid. As long as the footprint is roughly correct in plan, small inaccuracies in the outline do not significantly affect damage estimates. Focus on getting the location and size right rather than tracing every architectural detail.

08Units & Vertical Datums

All Values Are Metric

The pipeline uses metres for all dimensions and elevations. If your source data is in feet, convert before setting attributes. Common conversions:

FromToMultiply By
US survey feetmetres0.3048
cubic feetcubic metres0.02832
gallons per minutem³/s0.0000631
inches per hourmm/hr25.4

Vertical Datum: NAVD88

All elevation attributes (crest_elevation_m, ground_elevation_m, etc.) must reference NAVD88. The pipeline defines these offsets for other tidal datums at the study area:

DatumOffset from NAVD88
NAVD880.00 m (reference)
MHHW (Mean Higher High Water)+0.67 m
MSL (Mean Sea Level)+0.20 m
MLW (Mean Low Water)−0.50 m
Common Mistake: Feet vs Metres

HATS crest elevations are often reported as 17.5 ft NAVD88. This equals 5.33 m. Entering 17.5 in the crest_elevation_m field would create a 57-foot wall in the model. Always double-check your unit conversions.

Horizontal CRS

ContextCRSEPSG
GeoJSON files (the export target)WGS 844326
Rhino model (default assumption)UTM Zone 18N32618
ArcGIS Pro (common for NYC)NY State Plane LI2263

09Naming Conventions

File Names

measure_type Values

These are the exact, case-sensitive strings the pipeline recognizes:

ValueDescription
leveeContinuous embankment or flood wall
seawallShoreline barrier (modeled identically to levee)
gateDeployable barrier or floodgate
pumpActive pumping system
culvertPassive drainage culvert
retentionDetention/retention basin
green_infraDistributed green infrastructure network
platformElevated structure footprint
Exact Strings Only

"Levee", "LEVEE", "flood_wall", "floodwall" — none of these will work. The value must be one of the exact lowercase strings listed above. Misspelled or variant measure types are silently ignored during loading, which means your feature won't appear in any scenario.

scenario Identifiers

GeoJSON Collection Metadata

Every .geojson file needs these top-level fields in the FeatureCollection:

FieldDescriptionExample
nameMachine identifier (snake_case, must match filename stem)frontline_seawall
labelHuman-readable display nameFrontline Seawall
categoryPipeline target categorybarriers, stormwater, or building
descriptionOptional longer descriptionSeawall along the Harlem River waterfront

10Common Pitfalls

MistakeSymptomFix
Closed polyline for a barrier Pipeline interprets it as a Polygon instead of LineString; barrier becomes a filled area in the model Open the curve: remove the closing segment or use Explode in Rhino
Elevation in feet instead of metres Barrier crest is impossibly high (e.g., 17m instead of 5.3m), blocking all flooding Multiply by 0.3048 before setting crest_elevation_m
Projected CRS in GeoJSON Features appear at the wrong location or don't load at all Ensure export is in WGS 84 (EPSG:4326). Coordinates should be [lon, lat] not [easting, northing]
Missing measure_type Feature is silently skipped during loading Add the field to every feature; use exact lowercase values from the reference table
Gap between barrier segments Water flows through the gap in simulation results Snap endpoints. In Rhino: Point Osnap. In ArcGIS: enable snapping.
Multi-part geometry not exploded Entire MultiLineString treated as one feature; crest applies to disconnected segments In ArcGIS: Multipart to Singlepart tool. In Rhino: Explode polycurves.
Misspelled attribute name Value is ignored; default is used instead Use exact names: crest_elevation_m, not crest_elev or CrestElevation
Missing collection-level metadata File loads but has no display name or category in the webapp Add name, label, category fields to the FeatureCollection root
Rhino Z used for elevation Z coordinates are discarded; barrier has no crest elevation Set elevation via SetUserText crest_elevation_m, not via geometry Z
retention_pct as percentage Setting 25 instead of 0.25 means 2500% retention Use a fraction from 0 to 1, not a percentage

11Pre-Flight Checklist

Run through this checklist before handing off your data. Items marked with Rhino or ArcGIS apply to that tool only; unmarked items apply to both.

Geometry

Attributes

Coordinate System & Export

Quick Validation

Rhino users: Run python scripts/ingest_cad.py your_file.3dm --dry-run to preview what will be exported without writing any files.
ArcGIS users: Open your .geojson in geojson.io to visually verify feature locations, geometry types, and attribute values before placing the file in the pipeline directory.