Note
Go to the end to download the full example code.
Station maps and overlays#
The starting point for every pycsamt.map view is a station map —
a plan view of the survey with each site plotted at its true coordinates.
The high-level MapView façade loads a whole survey
once and renders it many ways; this example builds the map up from bare
locations to a contoured apparent-resistivity surface.
Every figure below is a live Plotly map: drag to pan, scroll to zoom, and hover a station to read its values.
Load the survey#
MapView.from_folder reads every
EDI line under a folder into one geo-referenced view. WILLY_DATA has five
lines and 128 stations.
import os
from pycsamt.map import MapView
# Card thumbnail: a pre-rendered static PNG (interactive figures below have
# no raster the gallery can thumbnail).
DATA = os.path.join(
os.environ.get("PYCSAMT_DOCS_REPO_ROOT", "."), "data", "AMT", "WILLY_DATA"
)
mv = MapView.from_folder(DATA, recursive=True)
print(f"{mv.n_stations} stations across {len(mv.lines)} lines: {mv.lines}")
print("geo-referenced:", mv.has_geo)
53 stations across 2 lines: ('L18PLT', 'L22PLT')
geo-referenced: True
Station locations#
The simplest overlay, index, colours each station by its position
along the line — enough to see the survey geometry. Hover any point for
its ID and coordinates.
fig = mv.station(overlay="index")
fig.update_layout(height=560)
fig
Coloured by apparent resistivity#
Switch the overlay to rho and pick a frequency: now each station is
coloured by its apparent resistivity at ~100 Hz. Lateral resistivity
variation across the survey becomes visible at a glance.
fig = mv.station(overlay="rho", component="xy", frequency=100.0)
fig.update_layout(height=560)
fig
Add an interpolated contour surface#
show_contours=True interpolates the station values onto a grid and
draws filled contours beneath the markers — a continuous resistivity map
rather than discrete points.
fig = mv.station(
overlay="rho",
component="xy",
frequency=100.0,
show_contours=True,
contour_levels=14,
)
fig.update_layout(height=600)
fig
Phase instead of resistivity#
The same map keyed on impedance phase highlights different structure —
phase responds to gradients in resistivity, so it often sharpens
boundaries the resistivity map smooths over.
fig = mv.station(
overlay="phase", component="xy", frequency=100.0, show_contours=True
)
fig.update_layout(height=600)
fig
Frequency is depth: compare two bands#
Higher frequencies sense shallower structure. Rendering the same survey at ~1000 Hz (shallow) shows a different pattern than the ~100 Hz map above — the basis for reading a station map as a depth-dependent slice.
fig = mv.station(
overlay="rho",
component="xy",
frequency=1000.0,
show_contours=True,
title="Apparent resistivity ~1000 Hz (shallow)",
)
fig.update_layout(height=600)
fig
Next. These plan views collapse all depth into one frequency. The following examples open up the third dimension — first as per-line profiles and pseudo-sections, then as full 3-D fence diagrams and volumes.
Total running time of the script: (0 minutes 0.482 seconds)