Skip to main content
Public Preview

Start with Part 1: Roof Inspection Guide

Run the SAM3 detection and score the roofs it returns

SAM3 Notebook

The full text-prompted geometry inference walkthrough

Insurance & Risk solutions

Catastrophe exposure, underwriting enrichment, and portfolio concentration patterns

RasterFlow Billing

Learn how RasterFlow usage is metered in RasterFlow Spatial Units
Run the Roof Inspection Guide first. This is the second half of that walkthrough and does not stand alone. The queries below run in the SedonaContext session Part 1 opens, against the examples_temp.sam3_db.sam3_{AOI_NAME} table the SAM3 run writes. The canopy query also needs the scored_roofs temp view, which Part 1 builds from that table and your own my_portfolio records.

What the Wherobots catalogs add to a roof

The roof polygons from Part 1 are useful as a join key. The examples below match them to Overture building footprints and measure canopy height within 10 m of each roof. These two checks add context to the detections without licensing another dataset.
wherobots_open_data.overture_maps_foundation.buildings_buildingA stable building identity to deduplicate detections against, plus height, num_floors, and class. Also roof_material, roof_shape, and roof_color where a contributor supplied them.Data vintage: OpenStreetMap contributions through July 2026.
wherobots_open_data.meta_canopy_height.global_v2Tree height around the structure, for overhang, debris, and windthrow exposure.Data vintage: not carried in the catalog. The table exposes only ingested_at, which is when Wherobots loaded it, not when the imagery was flown.
Check Overture before you buy roof material. buildings_building carries roof_material, roof_shape, roof_color, and roof_height. They are contributor-supplied, so coverage is sparse and uneven, but they are free. Join them to your detections and count the non-null rate over your own footprint before you price a commercial roof-attribute feed.

Reconcile detections with building footprints

A detection is not a building record. One structure can come back as two polygons, and a row of attached houses can come back as one, so the row count off the SAM3 table is not a building count. Overture’s id identifies matched footprints; detections with no match and detections spanning several footprints still need review. This pairs every roof detection with footprints it overlaps by area, keeps the largest overlap, and records how many footprints it covered. A shared edge alone does not count as a match:
One row per detection now, so the reconciliation is a single aggregate. Its last two columns answer the question the Tip above asks, over your own area rather than in general:
How to read it:
  • distinct_buildings counts the Overture building IDs selected as best matches. It is not a complete building count: a single detection can span several footprints, and the best-match filter keeps only one of them.
  • no_footprint counts unmatched detections, not buildings. Overture is contributor-supplied, so a real structure may be absent, but multiple unmatched polygons can also describe one structure. Inspect these detections before adding them to an inventory.
  • spans_several_footprints flags detections that cover more than one building footprint. Before assigning these to policies, run a separate join that keeps every positive-area detection–footprint pair and cut each piece with ST_Intersection(d.geometry, b.geometry). The best-match query above intentionally retains only one pair per detection.
  • roof_material_pct and roof_shape_pct are the non-null rates over distinct matched building IDs. Run them before pricing a commercial roof-attribute feed.
Reconcile unmatched detections and those spanning multiple footprints before reporting a building inventory or using the counts in a pricing decision. This summary identifies both cases; it does not resolve them.

Tree overhang over each detected roof

Canopy above a roof is a windthrow and debris exposure, and the reason some of your detections are incomplete. Buffer each roof by 10 m, include every canopy tile touching that buffer, and take the maximum of the per-tile results. allTouched=true includes canopy pixels touched by the buffer even when their centers fall outside it. The inner spatial join lets Sedona optimize tile matching; a regular left join brings roofs outside canopy coverage back with a null height.

Next steps

Roof Inspection Guide

Back to the detection run, the cost table, and output triage.

Insurance & Risk solutions

Catastrophe exposure, underwriting enrichment, and portfolio concentration patterns.

Run as a Job

Put the inspection on a schedule once the prompt and threshold are settled.

Visualize RasterFlow outputs

Check a mosaic before inference and detections after, on the same map.