DEV Community

MezuxTouch
MezuxTouch

Posted on

Budgeting a GPR Route Survey in Python: A Small Cost Estimator

If you build tools for telecom, power or pipeline teams, sooner or later someone asks: "What will the ground penetrating radar (GPR) survey cost for this route?" The answer is usually a simple per-metre calculation with a few rules on top: different rates per survey type, a minimum billable length, and GST.

Here is a small, dependency-free Python estimator you can drop into a planning script or notebook.

The rate card

The numbers below come from our published GPR survey price list:

  • Standard GPR route survey: Rs 24 per metre
  • L-section (depth profile) survey: Rs 32 per metre
  • 4 km minimum per job, GST extra

Volume discounts and extras like mobilisation and drawings are not modelled here; check the rate card for those.

The code

from dataclasses import dataclass

RATES_PER_M = {"standard": 24.0, "l_section": 32.0}  # INR per metre
MIN_LENGTH_M = 4_000                                  # 4 km minimum per job

@dataclass
class Segment:
    name: str
    length_m: float
    survey: str = "standard"   # or "l_section"

def estimate(segments, gst_rate=0.18):
    lines, subtotal = [], 0.0
    total_len = sum(s.length_m for s in segments)
    # Minimum billing applies to the whole job; bill any shortfall at the standard rate
    shortfall = max(0.0, MIN_LENGTH_M - total_len)
    for s in segments:
        cost = s.length_m * RATES_PER_M[s.survey]
        lines.append((s.name, s.survey, s.length_m, cost))
        subtotal += cost
    if shortfall:
        cost = shortfall * RATES_PER_M["standard"]
        lines.append(("minimum-length top-up", "standard", shortfall, cost))
        subtotal += cost
    gst = subtotal * gst_rate
    return lines, subtotal, gst, subtotal + gst

route = [
    Segment("Main road stretch", 2_600),
    Segment("NH crossing (HDD)", 180, "l_section"),
    Segment("Service lane", 750),
]
lines, sub, gst, total = estimate(route)
for name, kind, m, c in lines:
    print(f"{name:<24}{kind:<11}{m:>8,.0f} m  Rs {c:>10,.0f}")
print(f"{'Subtotal':<43}Rs {sub:>10,.0f}")
print(f"{'GST @18%':<43}Rs {gst:>10,.0f}")
print(f"{'Total':<43}Rs {total:>10,.0f}")
Enter fullscreen mode Exit fullscreen mode

Output

Main road stretch       standard      2,600 m  Rs     62,400
NH crossing (HDD)       l_section       180 m  Rs      5,760
Service lane            standard        750 m  Rs     18,000
minimum-length top-up   standard        470 m  Rs     11,280
Subtotal                                   Rs     97,440
GST @18%                                   Rs     17,539
Total                                      Rs    114,979
Enter fullscreen mode Exit fullscreen mode

Notes

  • Mixing survey types: crossings that will be drilled usually need an L-section GPR survey for depth, while the rest of the route can be a standard survey. Modelling segments separately keeps that visible in the estimate.
  • Minimum length: short jobs get topped up to the minimum, which is why small routes often cost more per metre than you expect.
  • GST: keep the rate a parameter, since it can change.

From here it is easy to read segments from a CSV or a GIS export and produce a quick budget table for a tender.

Top comments (0)