A real, end-to-end 3D (Z + M) editing pipeline over GeoPackage — built for editing substation, pole, and conductor features right on the workstation, backed by an ESRI-compatible FeatureServer, and surfaced through the native ArcGIS Editor widget. No stubs, no flat geometry, no elevation lost — and no network required.
A pole top is not a pole base, and a conductor is not a line on the ground. Most "3D" GIS editors quietly flatten your data. This one doesn't.
GEOMETRY(Z), POINT Z, POLYGON Z — for poles, structures, and conductor spans.{x,y,z:1500.5} comes back as z = 1500.5.world-elevation ground — attachment heights and clearances stay honest.hasZ/hasM are read from gpkg_geometry_columns, never hardcoded.// service advertises the layer's true dimensionality { "hasZ": true, "hasM": false, "geometryType": "esriGeometryPoint", "features": [{ "geometry": { "x":-74.006, "y":40.712, "z":1500.5 } }] }
Conductor attachment heights, buried duct banks, substation equipment levels, tower geometry — none of it lives on a flat plane.
Capture equipment, bus work, and structure heights without losing the Z that defines them.
Model duct banks, cables, and vaults at their true depth; navigate below the surface.
Use Z + M for altitude and timestamp along 3D inspection trajectories over lines and substations.
Place structures with real vertical precision — base, attachment points, and top all at true height.
Building information modeling for control houses and substations, where every floor and fixture has a height.
Sketch access routes, laydown yards, and egress in 3D for emergency operations.
All endpoints live under /api/featureserver/{datasetId} and follow the familiar ESRI FeatureServer shape — so the GIS tools your utility already runs can consume the edits.
| Method & endpoint | Returns | Notes |
|---|---|---|
| GET /{ds} | Service metadata | Capabilities: Query, Create, Update, Delete, Editing, Sync |
| GET /{ds}/{layer} | Layer schema | hasZ/hasM from gpkg_geometry_columns |
| GET /{ds}/{layer}/query | Features | Honors returnZ |
| POST …/addFeatures | Add results | Full Z + M ingestion |
| POST …/updateFeatures | Update results | Per-feature edits |
| POST …/deleteFeatures | Delete results | By OBJECTID |
| POST …/applyEdits | Transactional | Atomic adds + updates + deletes |
Capability strings reflect the implemented controller. Spatial filtering uses NetTopologySuite Envelope.Intersects client-side.
// OGC 12-128r12 standard GPKG blob envelope // magic "GP" + flags + int32 SRID + ISO WKB var writer = new WKBWriter { Strict = false, // allow SRID header HandleSRID = true, HandleOrdinates = XYZM // preserve Z & M }; byte[] blob = writer.Write(ntsGeom);
A single converter does the heavy lifting — ESRI JSON ↔ NTS Geometry ↔ standard GPKG blob — with no heavyweight ORM. Everything runs locally, so field edits keep working in the truck, in the substation yard, or anywhere the backhaul is down. Bring corrected asset geometry back to the records your utility manages in GRID State.
POINT(0 0).ST_Intersects — filtering now via NTS envelopes.edit3d.gpkg (points = POINT Z, polygons = POLYGON Z) on first run.Open the seeded edit3d dataset and start placing poles, spans, and structures at real elevations in seconds — fully offline.