Survey Utility App v9.0

Record utility structures, pipe inverts, and interactive pipe-direction diagrams.
Created by Juan Pichardo
❓ How to Use This App

Record a structure

  1. Enter the structure/manhole number, utility type, and rim elevation. Project number, date, coordinates, field crew, photo number, diagram style, and notes are optional.
  2. Press + Add Invert for each pipe entering or leaving the structure.
  3. For each invert, choose the flow, direction, pipe type, and pipe size. Enter the Measure Down from rim to invert; the app calculates the invert elevation as rim minus measure-down.
  4. Use Place on Diagram and tap the diagram to set pipe direction, or choose the direction from the list. Labels can be dragged while that invert is in Edit mode.
  5. Press Save Invert for every pipe. Each invert must be saved/locked before the structure itself can be saved.
  6. Press Save Structure. The saved record appears in the table below.

Diagram and exports

  • Save Report-Ready JPEG saves the current utility sketch as an image.
  • Current Structure PDF creates a printable report for the structure currently on screen.
  • All Structures PDF creates a combined printable report from saved structures.
  • Export CSV exports saved structure and invert data.
  • Backup JSON saves a backup copy of the records stored in this browser.
  • Use Edit in the saved-record table to reopen and revise a structure.

Field workflow example

For a storm manhole, enter the rim elevation, add each pipe, record whether it is incoming or outgoing, its compass direction, material, size, and measure-down, then save each invert. Confirm the diagram matches the field sketch before saving the structure.

Data note: Saved structures are stored in this browser using local storage. Clearing browser/site data can remove those records, so use Backup JSON and/or CSV/PDF exports when the data matters. Verify field notes, pipe directions, measure-downs, and elevations before final survey production.

Utility Structure

Pipe Inverts

Interactive Structure and Pipe Diagram

Project: — · Date: — · Structure: —
ProjectDateStructureTypeRimPipe InvertsCoordinatesDiagramNotesAction
'; var win=window.open("","_blank"); if(!win){ alert("The PDF report window was blocked. Allow pop-ups for this file and try again."); return; } win.document.open(); win.document.write(reportHtml); win.document.close(); } document.getElementById("exportCurrentPdf").addEventListener("click",function(){ var r=buildCurrentReportRecord(); if(!r.number||!r.utilityType||!r.rim){ alert("Enter the structure number, utility type, and rim elevation before exporting the current PDF."); return; } openPdfReport([r],"Structure "+r.number+" Report"); }); document.getElementById("exportAllPdf").addEventListener("click",function(){ if(!records.length){ alert("No saved structures are available. Save structures first, then export the combined PDF."); return; } openPdfReport(records.slice(),"All Utility Structures Report"); }); function download(name,text,type){ var blob=new Blob([text],{type:type});var a=document.createElement("a"); a.href=URL.createObjectURL(blob);a.download=name;document.body.appendChild(a);a.click();a.remove(); setTimeout(function(){URL.revokeObjectURL(a.href)},1000); } function csv(v){return '"'+String(v==null?"":v).replace(/"/g,'""')+'"'} document.getElementById("exportCsv").addEventListener("click",function(){ if(!records.length){alert("No records to export.");return} var max=1;records.forEach(function(r){max=Math.max(max,(r.inverts||[]).length)}); var headers=["Project Number","Date","Structure","Utility Type","Rim Elevation","Units","Northing","Easting","Field Crew","Photo Number","Diagram Style","Notes"]; for(var i=1;i<=max;i++)headers.push("Invert "+i+" Flow","Invert "+i+" Direction","Invert "+i+" Pipe Type","Invert "+i+" Pipe Size","Invert "+i+" Measure Down","Invert "+i+" Elevation"); var rows=[headers.map(csv).join(",")]; records.forEach(function(r){ var row=[r.projectNumber||"",r.recordDate||"",r.number,r.utilityType,r.rim,r.units,r.northing,r.easting,(r.fieldCrew||r.surveyor||""),r.photoNumber||"",r.diagramStyle||"color",r.notes]; for(var i=0;i