Kestrel Aerial Mapping

Generative Assets · Industry Demos · how it was made

How the Kestrel Aerial Mapping demo was built

Kestrel Aerial Mapping is a fictional Canning Vale drone survey and aerial mapping practice — orthomosaics, DSM and contours to AHD, 3D reality models and roof inspections for builders, civil contractors, strata managers and councils across Perth and the regions. The page exists for one reader: the person with a site to map who wants the deliverable, the hectares, the detail, the ground control and the travel priced honestly, to the whole dollar, before they ring. Its single job is a flight request with that scenario already attached.

The Site Mapper

The signature element is a drawn SVG plan-view site sheet: an irregular survey boundary on a sand-brown fill, amber lawnmower flight lines across it, and a drone glyph tracing them with a faint swath trail. Every control redraws the sheet honestly and reprices the flight from the pinned anchors:

Pinned anchors (GST inclusive; flight, processing and delivery; metro Perth travel included)

DeliverableBasePer hectareDaysFloor (1 ha, standard, no GCP)
Orthomosaic map$900$40 / ha3$940
Orthomosaic + DSM & contours$1,200$60 / ha5$1,260
3D reality model$1,500$80 / ha7$1,580
Roof & asset inspection$550 first structure$250 each extra structure2$550

High detail (1.5 cm GSD) is +$300 flat and ground control to AHD is +$350 flat, both on the three mapping deliverables only; the per-hectare rate multiplies the hectares, the extra-structure rate multiplies (structures − 1), and base, detail and ground control are flat. A site beyond metro Perth turns the total into the quoted-state form "<total> + travel, quoted by the kilometre" wherever the total prints — badge, ledger and the screen-reader mirror — never a bare "quoted". There is no empty state: a deliverable is always selected and both steppers have floors of 1. Every rate is a whole dollar and every count is a whole unit, so no total ever needs rounding.

Worked examples measured from the running page

ScenarioArithmeticTotalDaysNotePasses
Rest state — DSM & contours, 10 ha, standard, GCP on, metro1,200 + 600 + 350$2,1505absent5
Orthomosaic, 1 ha, standard, GCP off (grid floor)900 + 40$9403absent3
DSM, 1 ha, standard, GCP off1,200 + 60$1,2605present3
3D, 1 ha, standard, GCP off1,500 + 80$1,5807absent3
Inspection, 1 structure550$5502absent
DSM, 10 ha, standard, GCP off → GCP on1,200 + 600 → + 350$1,800 → $2,1505present → absent (delta 350 = the note's figure)5
3D, 25 ha, high detail, GCP on1,500 + 2,000 + 300 + 350$4,1507absent9
Orthomosaic, 50 ha, high detail, GCP on900 + 2,000 + 300 + 350$3,5503absent15 (ceiling)
Inspection, 4 structures550 + 750$1,3002absent; area, detail, GCP disabled with reasons
Restore: ortho 12 ha GCP off → inspection 4 → ortho900 + 480 → 550 + 750 → restored 12 ha$1,380 → $1,300 → $1,3803 → 2 → 3absent6 → — → 6
Quoted: DSM 10 ha GCP on, beyond metro2,150 + travel$2,150 + travel, quoted by the kilometre5absent5
Rapid-fire: area 10, GCP on, ortho → 3D → inspection → DSM in one evaluaterestored 10 ha$2,1505absent; one flight loop after settle5

Every worked figure, the four cheapest-output floors ($940 / $1,260 / $1,580 / $550, equal to the services grid), the note's three-surface presence and absence, the quoted-state string on all three surfaces and 36 random control vectors were cross-checked against an oracle reimplemented from the anchors in the verification harness — not from the page's own code. The final pass ran 597 assertions (575 on the site, 22 on this guide), all green.

Palette — argued from a high Perth sky

Pale sky ground, slate ink like a controller's housing, survey teal for the CTAs and links, amber for the flight lines and every mark, and the sand-brown of a site under a flight plan doing real work in the scene. Contrast ratios below were computed with WCAG arithmetic from the shipped tokens in Pass 1 (role, hex and ratio from the same script row).

Sky#EEF3F5 page ground; cards #FFFFFF, soft cards #F4F8F9
Slate#1E2A33 body ink · 13.09:1 on sky, 14.64:1 on white; the trust strip and footer ground (light ink #D3DEE4 on it 10.69:1)
Survey teal#15707E CTAs and links · white on it 5.75:1 (hover #115D69 7.52:1); as link ink 5.14:1 on sky, 5.75:1 on white, 4.77:1 on the teal tint — kept ≥16 px
Amber#E39B1F flight lines, the drone's track, chip outlines, the plate edge · 2.09:1 on sky — lines and marks only, never text
Amber-ink#8A5A0C amber-coloured small copy (the note, lock reasons, the quoted-state line) · 5.29:1 on sky, 5.92:1 on white, 5.20:1 on the amber tint
Earth#9A8160 the drawn site and roofs, contour tints · 3.30:1 on sky — fill only, never text; contour lines in the deeper #6E5838
Sub-ink#4A5D69 hints, eyebrows, ledger "not selected" lines · 6.13:1 on sky, 6.86:1 on white, 6.42:1 on soft cards, 5.69:1 on the teal tint
Map water#D5E6EA the Indian Ocean and the Swan · slate labels on it 11.39:1 with a water-coloured halo

Every spec figure measured within 0.1 of its computed hypothesis on the shipped tokens (slate 13.1 / 14.6, white-on-teal 5.8 / hover 7.5, teal-on-sky 5.1, amber-ink 5.3 / 5.9) — no token moved. The sub-ink and the map-water pair were minted by the builder and measured before use; sheet labels (pass legend, scale bar, GCP and spot-height tags) are slate with a sheet-coloured halo so they hold their ratio where they cross the earth fill.

Type

$2,150 · 10 ha · DSM + contours · 5 days
Space Grotesk 600 — instrument-panel geometry: headings, the display line over the plan, the plate's price, stepper values.
Builders, civil contractors, strata managers and councils get the whole site in one flight — priced by the hectare before we leave the hangar.
IBM Plex Sans 400–700 — the workhorse: 17 px body (16 px minimum on phones), labels, ledger, form. Eyebrows in 12.5 px caps at .14 em tracking.

The display moment is the rest-state line set over the plan — "$2,150 · 10 HA · DSM + CONTOURS · 5 DAYS" — rebuilt from state on every change, so the figure is always the live total; the rest-state total is the measured $2,150, and the tokens are joined with non-breaking spaces so a wrap never strands a dot or a unit at a line end.

Techniques

Conversion decisions

Local SEO we'd implement for the real business

The live page carries only WebPage, WebSite and BreadcrumbList structured data naming it a demonstration — a fictional practice must not mark itself up as a real one. For the real client we would ship the block below. A drone survey practice is a professional service, not a store, so the top-level type is ProfessionalService (an actual schema.org organisation subtype) with the offerings named through hasOfferCatalog and knowsAbout. Real reviews would be pulled from Google Business Profile and marked up only with the reviewer's consent.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "ProfessionalService",
  "name": "Kestrel Aerial Mapping",
  "description": "Drone survey and aerial mapping from Canning Vale — orthomosaics, DSM and contours to AHD, 3D reality models and roof inspections across Perth and regional WA.",
  "url": "https://www.example-kestrel.com.au/",
  "telephone": "+61 8 9000 0368",
  "image": "https://www.example-kestrel.com.au/site-sheet.jpg",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Canning Vale",
    "addressRegion": "WA",
    "postalCode": "6155",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -32.07, "longitude": 115.92 },
  "areaServed": ["Perth", "Forrestdale", "Baldivis", "Welshpool", "Midland", "Wangara", "Rockingham", "Joondalup", "Mundaring"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"], "opens": "07:00", "closes": "17:00" }
  ],
  "knowsAbout": ["drone survey", "aerial mapping", "orthomosaic", "digital surface model", "contour survey", "ground control points", "3D reality model", "roof inspection", "stockpile volumes"],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Drone survey services",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Orthomosaic map" }, "priceSpecification": { "@type": "PriceSpecification", "price": "940", "priceCurrency": "AUD", "description": "from, 1 ha, 3 cm GSD" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "DSM and contour survey" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1260", "priceCurrency": "AUD", "description": "from, 1 ha" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "3D reality model" }, "priceSpecification": { "@type": "PriceSpecification", "price": "1580", "priceCurrency": "AUD", "description": "from, 1 ha" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Roof and asset inspection" }, "priceSpecification": { "@type": "PriceSpecification", "price": "550", "priceCurrency": "AUD", "description": "first structure" } }
    ]
  },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "64" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Real customer, with consent" },
      "datePublished": "2026-05-02",
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "Pulled from the live Google Business Profile feed — never hand-written."
    }
  ]
}
</script>

Alongside the schema: a Google Business Profile with the hangar pinned, "drone survey Perth" / "aerial mapping Perth" / "drone roof inspection Perth" / "contour survey Baldivis" as the page's core phrases with the suburbs above as secondary, NAP consistency across the surveying and construction directories, and a reviews feed that updates without anyone touching the page.

What changes for the real client

Iteration log

Two builder calls worth flagging for the wave sweep: (1) "the detail chip halves the flight-line spacing on high detail" is shipped as interleaved infill passes drawn lighter and dashed between the pinned primary passes — the legend's pass count stays min(3 + ⌊ha ÷ 4⌋, 15) as pinned, and the infill is a drawing, not a count; (2) the desktop frame zooms to fit the subject (420-unit floor, 1080-unit ceiling) while the boundary stays at side ∝ √ha in sheet units and the 100 m bar stays 61 units — a presentation choice in the W41 crop family, documented here so the growth-with-hectares reads as the plan viewer's zoom plus the constant scale bar rather than a fixed frame.