asp-plot 1.18.0__tar.gz → 1.19.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. {asp_plot-1.18.0 → asp_plot-1.19.0}/AGENTS.md +9 -7
  2. {asp_plot-1.18.0 → asp_plot-1.19.0}/CHANGELOG.md +17 -0
  3. {asp_plot-1.18.0 → asp_plot-1.19.0}/PKG-INFO +1 -1
  4. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/altimetry_plots.py +13 -7
  5. asp_plot-1.19.0/asp_plot/cli/stereo_geom.py +104 -0
  6. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/scenes.py +2 -1
  7. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/sensors.py +350 -83
  8. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/stereo.py +2 -1
  9. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/stereo_geometry.py +211 -41
  10. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/stereopair_metadata_parser.py +117 -16
  11. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/utils.py +34 -10
  12. {asp_plot-1.18.0 → asp_plot-1.19.0}/pyproject.toml +1 -1
  13. asp_plot-1.18.0/asp_plot/cli/stereo_geom.py +0 -73
  14. {asp_plot-1.18.0 → asp_plot-1.19.0}/.flake8 +0 -0
  15. {asp_plot-1.18.0 → asp_plot-1.19.0}/.github/workflows/release.yml +0 -0
  16. {asp_plot-1.18.0 → asp_plot-1.19.0}/.github/workflows/run-tests.yml +0 -0
  17. {asp_plot-1.18.0 → asp_plot-1.19.0}/.gitignore +0 -0
  18. {asp_plot-1.18.0 → asp_plot-1.19.0}/.pre-commit-config.yaml +0 -0
  19. {asp_plot-1.18.0 → asp_plot-1.19.0}/.readthedocs.yaml +0 -0
  20. {asp_plot-1.18.0 → asp_plot-1.19.0}/LICENSE +0 -0
  21. {asp_plot-1.18.0 → asp_plot-1.19.0}/README.md +0 -0
  22. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/__init__.py +0 -0
  23. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/alignment.py +0 -0
  24. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/altimetry.py +0 -0
  25. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/altimetry_source.py +0 -0
  26. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/asp_log.py +0 -0
  27. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/bodies.py +0 -0
  28. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/bundle_adjust.py +0 -0
  29. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/cli/__init__.py +0 -0
  30. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/cli/asp_plot.py +0 -0
  31. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/cli/csm_camera_plot.py +0 -0
  32. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/cli/gallery.py +0 -0
  33. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/cli/request_planetary_altimetry.py +0 -0
  34. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/csm_analysis.py +0 -0
  35. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/csm_camera.py +0 -0
  36. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/csm_io.py +0 -0
  37. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/gallery.py +0 -0
  38. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/icesat2_source.py +0 -0
  39. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/mapproject.py +0 -0
  40. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/planetary_source.py +0 -0
  41. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/processing_parameters.py +0 -0
  42. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/report.py +0 -0
  43. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/report_captions.py +0 -0
  44. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/report_pipeline.py +0 -0
  45. {asp_plot-1.18.0 → asp_plot-1.19.0}/asp_plot/selections.py +0 -0
  46. {asp_plot-1.18.0 → asp_plot-1.19.0}/conda-forge-recipe/meta.yaml +0 -0
  47. {asp_plot-1.18.0 → asp_plot-1.19.0}/environment.yml +0 -0
@@ -110,8 +110,8 @@ The package is organized by functionality, with each module focused on a specifi
110
110
  - Coordinate utilities: `get_utm_epsg()` for determining UTM EPSG from lon/lat, `get_planetary_bounds()` for DEM bounds in planetocentric 0-360 lon/lat
111
111
  - Planetary body detection: `detect_planetary_body(dem_fn)` returns `"earth"`, `"moon"`, or `"mars"` by inspecting CRS WKT DATUM/ELLIPSOID fields
112
112
  - Subprocess utilities: `run_subprocess_command()`
113
- - Vantor/copyright utilities:
114
- - `detect_vantor_satellite(directory)`: Checks XML files for WorldView SATIDs (WV01/WV02/WV03)
113
+ - Vantor/copyright utilities (an **attribution** concern — named for the rights-holder — kept deliberately distinct from sensor/reader **identity**, the WorldView-named abstraction in `sensors.py`; #137):
114
+ - `detect_vantor_satellite(directory)`: True when an XML camera file's `SATID` matches `VANTOR_SATID_PREFIXES` — any DigitalGlobe→Maxar→Vantor-owned satellite, i.e. the WorldView family (`WV*`, incl. Legion `WVLG`), GeoEye (`GE*`), QuickBird (`QB*`), IKONOS (`IK*`) — not just WorldView. Gates the `© Vantor` overlay via `Plotter.is_vantor`
115
115
  - `add_copyright_overlay(ax)`: Adds "© Vantor {year}" text overlay to bottom-right of matplotlib axes
116
116
  - Scene metadata: `get_acquisition_dates(directory, extra_dirs=None)` reads `FIRSTLINETIME` from WorldView/Maxar XMLs and parses the capture timestamp from `AST_L1A_...` file/directory names. Returns a sorted, deduplicated list of `"YYYY-MM-DD HH:MM:SS UTC"` strings; empty if nothing is found. Used by the CLI to populate `ReportMetadata.acquisition_dates`.
117
117
 
@@ -160,16 +160,16 @@ The package is organized by functionality, with each module focused on a specifi
160
160
  - `find_mapproject_commands(directories, stereo_command=None)`: scans dirs (processing root, BA dir, stereo dir) for all `*.tif`/`*.tiff` and keeps those carrying the tag signature — **identity is decided by the file's own metadata, never by filename**, so there is no naming-convention dependency (reading a GeoTIFF header is cheap; the `NotGeoreferencedWarning` from raw non-georef inputs is silenced). Dedupes by the reconstructed command string (identical scene reached via two dirs collapses; distinct left/right both show). When `stereo_command` is given, a discovered output is kept only if its filename appears in that command — this scopes the result to the run being reported, so a non-mapprojected run sharing a parent dir with mapprojected scenes (the `stereo/` + `stereo_no_mapproj/` layout) does **not** spuriously list a mapproject step. It's a whole-token basename membership test (the output basename must equal one of the stereo command's argument basenames — not a raw substring, so `run.tif` can't match `prun.tif`), not positional parsing. `ProcessingParameters.get_mapproject_commands(stereo_command)` passes the parsed stereo command; `report.py` renders the results under "Mapproject Command(s)" on the Processing Parameters page (via the module-level `_render_command_block` helper, shared with the bundle_adjust/stereo/point2dem commands)
161
161
 
162
162
  **`sensors.py`** - Sensor-specific scene metadata readers (issue #25)
163
- - `SensorMetadata` ABC defining the reader interface (`detect` + `get_scene_dicts`) and the sensor-agnostic scene-dict schema, mirroring the `bodies.py` registry pattern so adding ASTER/HiRISE/etc. is a new subclass with no change to the geometry code
164
- - `WorldViewMetadata(SensorMetadata)`: the WorldView/Maxar XML logic (file discovery, `dg_mosaic` tiling, per-scene extraction, ephemeris/attitude/footprint) moved verbatim out of the parser. Named after the satellite family rather than the (twice-renamed: DigitalGlobe → Maxar → Vantor) company; the same format also covers GeoEye-1/QuickBird/IKONOS
165
- - `SENSORS` registry + `sensor_for_directory()` detection
163
+ - `SensorMetadata` ABC defining the reader interface (`detect` + `detect_files` + `get_scene_dicts`) and the sensor-agnostic scene-dict schema, mirroring the `bodies.py` registry pattern so adding ASTER/HiRISE/etc. is a new subclass with no change to the geometry code
164
+ - `WorldViewMetadata(SensorMetadata)`: the WorldView/Maxar XML logic (file discovery, `dg_mosaic` tiling, per-scene extraction, ephemeris/attitude/footprint) moved verbatim out of the parser. Named after the satellite family rather than the (twice-renamed: DigitalGlobe → Maxar → Vantor) company; the same format also covers GeoEye-1/QuickBird/IKONOS. Constructible from either a `directory=` (recursive discovery) or an explicit `image_list=` (already-resolved XML paths); non-camera files (`README.XML`, ortho) are filtered out either way
165
+ - `SENSORS` registry + two detection entry points: `sensor_for_directory()` (scans a directory) and `sensor_for_inputs()` (accepts a mixed list of files/dirs/globs). The latter routes through `resolve_xml_inputs()`, which expands directories (recursively), globs, and plain paths into a deduped, sorted XML list — this is what lets `stereo_geom *.XML` / explicit files / a delivery dir all work without a fixed structure
166
166
 
167
167
  **`stereopair_metadata_parser.py`** - `StereopairMetadataParser` class
168
- - Now a **sensor-agnostic orchestrator** (issue #25): detects a reader via `sensor_for_directory()`, delegates scene discovery/extraction to it, and keeps only the pair-level geometry
168
+ - Now a **sensor-agnostic orchestrator** (issue #25): detects a reader via `sensor_for_directory()` (from `directory=`) or `sensor_for_inputs()` (from a mixed `inputs=` list of files/dirs/globs), delegates scene discovery/extraction to it, and keeps only the pair-level geometry
169
169
  - Computes stereo geometry metrics: convergence angle, base-to-height ratio, bisector elevation, asymmetry
170
170
  - Provides spatial utilities: `get_pair_utm_epsg()`, `get_intersection_bounds()`, `get_scene_bounds()`
171
171
  - `get_catid_dicts()` returns dictionaries per catalog ID with ephemeris, attitude, and geometry data (sourced from the sensor reader)
172
- - Currently supports pairs; N-scene support is planned
172
+ - **N-scene aware** (issue #73): `get_pair_dict()` is the exact-two-scene entry point (raises otherwise); `get_pair_dicts()` returns one pair dict per N-choose-2 combination so >2 scenes can be assessed pairwise. `get_pair_map_projection()` falls back to the footprint union when a pair does not overlap, and `get_pair_intersection()` tolerates a `None` intersection (non-overlapping pairs report `intersection_area = None`)
173
173
 
174
174
  **`stereo.py`** - `StereoPlotter` class (inherits from `Plotter`)
175
175
  - Visualizes ASP stereo processing results
@@ -321,6 +321,8 @@ All CLI tools are in `asp_plot/cli/` and use Click for argument parsing:
321
321
  - Wrapper for `StereoGeometryPlotter`
322
322
  - Creates skyplot and map view from XML camera files
323
323
  - Supports multiple XMLs with automatic mosaicking
324
+ - Accepts positional `INPUTS` (any mix of XML files, directories, and globs — e.g. `stereo_geom *.XML`); falls back to `--directory` when no positional inputs are given. Both paths funnel into the same plotter (`inputs=` vs `directory=`)
325
+ - **N-scene output** (issue #73): two scenes → one `<name>_stereo_geom.png` (unchanged). More than two → one color-coded overview figure (`_overview.png`) plus one figure per pair (`_<catidA>_<catidB>.png`, or `_pairN.png` if a CATID is missing), each with full pairwise stats. `dg_geom_plot()` dispatches on scene count and returns the list of saved filenames; `StereoGeometryPlotter` adds `_render_pair`/`_render_overview`. Map views keep the full (autoscaled) extent so all satellite ephemeris tracks are visible (off-nadir scenes have tracks tens to hundreds of km from the footprints), with tracks drawn on top of the semi-transparent footprints; `_add_basemap_safe` falls back to a coarse zoom so the wide-extent basemap fetch doesn't fail on contextily's negative auto-zoom
324
326
 
325
327
  **`gallery.py`** - DEM gallery tool (`gallery` command)
326
328
  - Wrapper for `GalleryPlotter`; lays out many DEMs as a grid sharing one color scale
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.19.0] - 2026-06-30
9
+
10
+ ### Added
11
+ - **`stereo_geom` makes pre-ASP stereo geometry plots straight from satellite XMLs** ([#73](https://github.com/uw-cryo/asp_plot/issues/73)). You can now assess candidate stereo geometry (skyplot + footprint/ephemeris map + convergence/B:H/BIE/asymmetry stats) *before* running ASP, directly from the delivered camera XMLs, without a tidy directory layout. Delivered across three pieces:
12
+ - **Robust, structure-agnostic XML discovery** ([#150](https://github.com/uw-cryo/asp_plot/issues/150)). Camera XMLs are found recursively (they routinely sit three or four directories deep), decoys like `README.XML` and ortho sidecars are ignored, and scenes are grouped by the CATID read from the file *contents* — never assumed to be in the filename. Tiled deliveries are mosaicked per CATID via `dg_mosaic`.
13
+ - **Flexible CLI inputs** ([#152](https://github.com/uw-cryo/asp_plot/issues/152)). `stereo_geom` takes positional `INPUTS` that may be any mix of XML files, directories, and glob patterns — `stereo_geom *.XML`, `stereo_geom a.xml b.xml`, `stereo_geom delivery_dir/` — searched recursively. The original `--directory` flag is retained as the fallback, so existing usage is unchanged. New `resolve_xml_inputs()` / `sensor_for_inputs()` / `SensorMetadata.detect_files()` plumbing and a `WorldViewMetadata(image_list=...)` constructor back this, with `inputs=` threaded through `StereopairMetadataParser` and `StereoGeometryPlotter`.
14
+ - **N-scene multi-view assessment.** `stereo_geom` is no longer limited to a pair. Given more than two scenes it writes one color-coded **overview** figure (all satellite positions on the skyplot, all footprints/ephemeris on the map) plus **one figure per pair** for every N-choose-2 combination, each titled with that pair's full stereo stats — the multi-view use case from the issue (e.g. the Utqiagvik scenes). Two-scene output is unchanged. Pairs whose footprints do not overlap are still plotted, with intersection-dependent stats shown as `N/A`. The parser gains `get_pair_dicts()` (all combinations), `get_scenes_centroid_projection()`, and `get_pair_map_projection()`; `get_pair_dict()` is now the exact-two-scene entry point.
15
+
16
+ ### Fixed
17
+ - **Stereo-geometry map basemap no longer errors/hangs on wide extents** ([#73](https://github.com/uw-cryo/asp_plot/issues/73)). The map intentionally shows the full satellite ephemeris tracks, which (for off-nadir scenes) sit tens to hundreds of kilometers from the ground footprints, so the extent is necessarily wide. At that extent `contextily`'s auto-zoom resolves to an invalid (negative) level, which previously produced a slow, failing tile request that could appear to hang. The basemap fetch now falls back to a coarse continental zoom (`_add_basemap_safe`) when the auto-zoom fails, so the map keeps its full track-revealing extent and still gets a basemap. The satellite tracks are also drawn on top of the (semi-transparent) footprints so they are not buried.
18
+ - **Non-overlapping footprints no longer crash intersection handling.** `get_pair_intersection()` computed the local-projection area before checking whether the two footprints actually intersect, raising on a `None` intersection. This was unreachable in the two-scene path (always overlapping) but is common among the pairs of an N-scene set; the area calculation is now skipped when there is no overlap.
19
+
20
+ ## [1.18.1] - 2026-06-26
21
+
22
+ ### Fixed
23
+ - **`© Vantor` attribution now covers all Vantor-owned satellites, not just WorldView** ([#137](https://github.com/uw-cryo/asp_plot/issues/137)). The copyright-overlay check (`detect_vantor_satellite`) matched only `SATID` values starting with `WV`, so GeoEye-1 (`GE01`), QuickBird (`QB02`), and IKONOS scenes — all owned by the same rights-holder (DigitalGlobe → Maxar → Vantor) — were silently left un-attributed. Detection now matches a `VANTOR_SATID_PREFIXES` whitelist (`WV` incl. WorldView Legion `WVLG`, `GE`, `QB`, `IK`). This clarifies that `is_vantor` / `detect_vantor_satellite` are an **attribution** concern (named for the company), intentionally distinct from sensor/reader **identity** (the WorldView-named abstraction in `sensors.py`); the two names are documented as deliberately different so they aren't reconciled into one.
24
+
8
25
  ## [1.18.0] - 2026-06-25
9
26
 
10
27
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asp_plot
3
- Version: 1.18.0
3
+ Version: 1.19.0
4
4
  Summary: Package for plotting outputs Ames Stereo Pipeline processing
5
5
  Project-URL: Homepage, https://github.com/uw-cryo/asp_plot
6
6
  Project-URL: Documentation, https://asp-plot.readthedocs.io
@@ -363,6 +363,18 @@ class AltimetryPlotter:
363
363
 
364
364
  x_bounds = []
365
365
  y_bounds = []
366
+ # CRS to reproject every panel into. This is independent of whether a
367
+ # basemap is drawn: a basemap is only fetched when the caller passes
368
+ # contextily kwargs (e.g. source=...). Previously this CRS was injected
369
+ # into ``ctx_kwargs``, which made the ``if ctx_kwargs`` basemap guard
370
+ # below always true and forced a tile download on every call (a network
371
+ # hang in offline/CI runs).
372
+ if map_crs:
373
+ crs = map_crs
374
+ elif ctx_kwargs:
375
+ crs = ctx_kwargs.get("crs", "EPSG:4326")
376
+ else:
377
+ crs = "EPSG:4326"
366
378
  for ax, time_stamp in zip(axes, time_stamps):
367
379
  key_to_plot = f"{key}{time_stamp}"
368
380
 
@@ -379,13 +391,6 @@ class AltimetryPlotter:
379
391
  continue
380
392
 
381
393
  atl06sr = filtered[key_to_plot]
382
- if map_crs:
383
- crs = map_crs
384
- ctx_kwargs["crs"] = map_crs
385
- elif ctx_kwargs:
386
- crs = ctx_kwargs["crs"]
387
- else:
388
- crs = "EPSG:4326"
389
394
  atl06sr_sorted = atl06sr.sort_values(by="h_mean").to_crs(crs)
390
395
  bounds = atl06sr_sorted.total_bounds
391
396
  x_bounds.extend([bounds[0], bounds[2]])
@@ -424,6 +429,7 @@ class AltimetryPlotter:
424
429
  min(y_bounds) - padding * y_range, max(y_bounds) + padding * y_range
425
430
  )
426
431
  if ctx_kwargs:
432
+ ctx_kwargs.setdefault("crs", crs)
427
433
  ctx.add_basemap(ax=ax, **ctx_kwargs)
428
434
 
429
435
  suptitle = f"{title}"
@@ -0,0 +1,104 @@
1
+ import os
2
+
3
+ import click
4
+
5
+ from asp_plot.stereo_geometry import StereoGeometryPlotter
6
+
7
+
8
+ @click.command()
9
+ @click.argument("inputs", nargs=-1, type=click.Path())
10
+ @click.option(
11
+ "--directory",
12
+ default=None,
13
+ help=(
14
+ "Directory containing XML files for stereo geometry analysis. "
15
+ "Used when no positional INPUTS are given. Default: current directory."
16
+ ),
17
+ )
18
+ @click.option(
19
+ "--add_basemap",
20
+ prompt=False,
21
+ default=True,
22
+ help="If True, add a basemap to the figures, which requires internet connection. Default: True.",
23
+ )
24
+ @click.option(
25
+ "--output_directory",
26
+ prompt=False,
27
+ default=None,
28
+ help="Directory to save the output plot. Default: Input directory.",
29
+ )
30
+ @click.option(
31
+ "--output_filename",
32
+ prompt=False,
33
+ default=None,
34
+ help=(
35
+ "Filename for the output plot. Default: Directory name with "
36
+ "_stereo_geom.png suffix. With more than two scenes this is the stem for "
37
+ "the per-pair and overview figures."
38
+ ),
39
+ )
40
+ def main(
41
+ inputs,
42
+ directory,
43
+ add_basemap,
44
+ output_directory,
45
+ output_filename,
46
+ ):
47
+ """
48
+ Generate stereo geometry plots for WorldView XML files.
49
+
50
+ This tool creates a skyplot and map visualization of the satellite positions
51
+ and ground footprints. INPUTS may be any mix of XML files, directories, and
52
+ glob patterns and need not follow a fixed directory structure, e.g.:
53
+
54
+ stereo_geom *.XML
55
+
56
+ stereo_geom scene1.xml scene2.xml
57
+
58
+ stereo_geom my_delivery_dir/
59
+
60
+ If no INPUTS are given, --directory is used (default: current directory).
61
+ """
62
+ # Positional INPUTS take precedence; otherwise fall back to --directory.
63
+ if inputs:
64
+ inputs = [os.path.expanduser(i) for i in inputs]
65
+ plotter = StereoGeometryPlotter(inputs=inputs, add_basemap=add_basemap)
66
+ source_desc = " ".join(inputs)
67
+ # Base directory for default output paths (resolved by the parser).
68
+ base_directory = plotter.directory
69
+ else:
70
+ base_directory = os.path.expanduser(directory or "./")
71
+ plotter = StereoGeometryPlotter(
72
+ directory=base_directory, add_basemap=add_basemap
73
+ )
74
+ source_desc = base_directory
75
+
76
+ print(f"\nProcessing stereo geometry for XML files in {source_desc}\n")
77
+
78
+ # Derive default output directory/filename from the base directory.
79
+ dir_name = os.path.split(base_directory.rstrip("/\\"))[-1]
80
+ if output_directory is None:
81
+ output_directory = base_directory
82
+ else:
83
+ output_directory = os.path.expanduser(output_directory)
84
+ if output_filename is None:
85
+ output_filename = f"{dir_name}_stereo_geom.png"
86
+
87
+ os.makedirs(output_directory, exist_ok=True)
88
+
89
+ saved = plotter.dg_geom_plot(save_dir=output_directory, fig_fn=output_filename)
90
+
91
+ if saved:
92
+ if len(saved) == 1:
93
+ print(
94
+ f"\nStereo geometry plot saved to {os.path.join(output_directory, saved[0])}\n"
95
+ )
96
+ else:
97
+ print(f"\nStereo geometry plots saved ({len(saved)}):")
98
+ for fn in saved:
99
+ print(f" {os.path.join(output_directory, fn)}")
100
+ print()
101
+
102
+
103
+ if __name__ == "__main__":
104
+ main()
@@ -26,7 +26,8 @@ class SceneFiles:
26
26
  full_stereo_directory : str
27
27
  Full path to the stereo directory.
28
28
  is_vantor : bool
29
- Whether the source imagery is from a Vantor (WorldView) satellite.
29
+ Whether the source imagery is from a Vantor-owned satellite (WorldView
30
+ family, GeoEye, QuickBird, etc.); gates the "© Vantor" copyright overlay.
30
31
  left_scene_sub_fn, right_scene_sub_fn : str or None
31
32
  Paths to the left/right sub-sampled scene files.
32
33
  """