Landslide Science
Rule · creep_behavior
creep_behavior
→ writes creep_behavior
This is read live from inventory/derived.py via
inspect.getsource(); what you see is exactly what runs.
def compute_creep_behavior(row):
"""The creep-evidence label observed for this landslide.
The two Planet flags work as a pair, not a simple severity ranking:
- `planet_labs_creep` says "creep is apparent in Planet imagery"
- `planet_labs_patchy_creep` is a refinement: "the creep is patchy,
not uniform across the landslide"
Conceptually, "obvious creep" is the broader / stronger assertion
(the whole feature is moving). The patchy flag, when set, *overrides*
that interpretation to say "actually it's only patchy" — so in the
compositional rule the patchy flag wins. The order below reflects
that override semantics:
1. planet_labs_patchy_creep → 'Patchy obvious creep'
(more specific call; supersedes plain obvious when both are set)
2. planet_labs_creep → 'Obvious creep'
3. its_live_creep → 'Obvious creep'
4. insar_creep → 'Subtle creep'
5. other_subtle_creep is set → 'Subtle creep'
6. geomorph_creep → 'Geomorph creep'
7. creep_evaluated is TRUE → 'Cryptic'
(record was reviewed for precursors and none were found — a
deliberate null finding, distinct from records where
creep_evaluated is FALSE which simply means no review yet)
8. otherwise → None
`its_live_creep` (added 2026-10-06, Hig) says the motion shows in the
ITS_LIVE feature-tracking velocity fields, and qualifies the landslide
as 'Obvious creep' — a second, independent route to that label beside
`planet_labs_creep`, not a label of its own. The patchy flag still
wins over it, exactly as it does over the plain Planet flag. That
ordering was not asked for; it is the reading that leaves the existing
override alone (patchy is the more specific statement about how much
of the feature moves). Swap steps 1 and 3 if ITS_LIVE should outrank it.
Feeds into `landslide_class`, which prefixes the label with 'Slow '
or 'Catastrophic '. The `creep_evaluated` boolean is human-set in
the data-entry UI and is not itself a rule output.
"""
if row.get('planet_labs_patchy_creep'):
return 'Patchy obvious creep'
if row.get('planet_labs_creep') or row.get('its_live_creep'):
return 'Obvious creep'
if row.get('insar_creep'):
return 'Subtle creep'
if (row.get('other_subtle_creep') or '').strip():
return 'Subtle creep'
if row.get('geomorph_creep'):
return 'Geomorph creep'
if row.get('creep_evaluated'):
return 'Cryptic'
return None
All rows already match this rule — nothing to apply.