DEV Community

Cover image for Inside OPTICS: Building a 36-Mile Port Twin on Esri and Unity
Generate Build
Generate Build

Posted on

Inside OPTICS: Building a 36-Mile Port Twin on Esri and Unity

The first question I ask about any port twin is where the origin sits. A 36-mile site does not fit comfortably in a single-precision coordinate frame, and the choice you make in week one shows up years later as jitter at the far end, z-fighting on a rail, or a crane floating a meter above its track. OPTICS, the Port of Corpus Christi's operational twin, is a good case because it had to answer that question while also carrying live vessel and dispatch data.

The stack, plainly

The port built OPTICS alongside Esri and The Acceleration Agency and put it into service in 2024. Esri holds the geospatial side: the basemap, the asset layers, the real-world coordinates. Unity is the runtime that draws the 36-mile scene and lets someone move through it. Business systems push in the moving parts, including commercial vessel positions and the port police computer-aided dispatch feed. Three vendors, one coordinate space, and a lot of contract writing.

Coordinates are a budget

Floating-point precision is not a theoretical worry at this scale. The practical fix is an origin shift: pick a local reference near the middle of the site, subtract it from everything, and keep the georeferenced version in the data layer. The trap is doing the shift in more than one place. If the GIS export, the runtime, and the CAD adapter each apply their own offset, you get a scene that is correct at the gate and wrong at the far berth, which is the hardest kind of bug to see in a screenshot.

Identity is harder than geometry

A vessel has a name, a call sign, and a transponder identity. A dispatch incident has an incident number. A GIS asset has a feature ID, and often a tenant's internal code. None of those are the same thing, and all of them get called the ID in meetings. Before the scene can show a ship next to a berth next to an incident, someone has to decide which identifier is canonical and how the others map to it. That work decides whether the twin can be trusted at two in the morning.

Staleness is a feature, not an error

Every live layer has a cadence. Vessel positions arrive on their own schedule. Dispatch events arrive when someone picks up a radio. Asset edits arrive when a GIS analyst publishes. The runtime should not pretend these are simultaneous. Stamp each layer with its own time, show it, and let the operator see which part of the picture is older. A map that hides its age is lying by omission.

Drawing 36 miles

You cannot draw everything. The build uses level-of-detail and streaming so the far end of the port stays cheap until you go there. That means the scene is always making a bet about what you are about to look at. The bet is usually right, and when it is wrong you get a second of missing geometry, which is survivable. A crash is not.

Integration with dispatch

The dispatch link is the piece I would test hardest. Police CAD is a system of record with its own latency, its own location format, and its own definition of an incident's lifecycle. If the twin treats every dispatch event as a permanent pin, the map fills with history and stops being situational. If it treats the event as transient, the operator loses the context of what just happened. The behavior you want is closer to a fading trail with a live anchor.

Testing with yesterday's traffic

Recorded feeds are worth more than demos. Replaying a day of vessel and dispatch traffic catches ordering bugs that a live look never will, because live data rarely arrives out of order on cue. If the twin can survive a replay at double speed without dropping layers, it will survive a normal Tuesday.

The unbuilt parcel

Not every question is about a built asset. For a proposed laydown area, I sketched a rectangle over the parcel and had GenAnywhere produce a massing model of the footprint. It was rough, but it showed whether the yard would crowd an access road. Keep that layer apart from surveyed assets.

What I would copy

Two habits. First, keep the georeferenced data authoritative and let the runtime be a view, never the source. Second, write down the update contract for every feed, including what offline looks like. Most port twin failures I have seen are not rendering failures. They are quiet disagreements about time.

Top comments (0)