diff --git a/docs/examples/pleiades.rst b/docs/examples/pleiades.rst index 2f213eb6f..0c228a2aa 100644 --- a/docs/examples/pleiades.rst +++ b/docs/examples/pleiades.rst @@ -4,8 +4,8 @@ Pleiades -------- ASP supports the 1A/1B and NEO satellites from Airbus Pleiades. For NEO, see -:numref:`pleiades_neo` for additional notes. ASP works only with primary -(non-ortho) images. +:numref:`pleiades_neo` for additional notes. ASP also supports the Pleiades ortho +products, if the projection was done on a surface of constant height (:numref:`pleiades_projected`). The Airbus Pleiades data have both an exact linescan camera model and an approximate RPC model (:numref:`rpc`). These are stored in separate files. The @@ -122,6 +122,26 @@ Several peculiarities make the Pleiades NEO data different from 1A/1B (:numref:` - There is no field for standard deviation of the ground locations of pixels projected from the cameras, so error propagation is not possible unless such a value is specified manually (:numref:`error_propagation`). - The RPC camera models for a stereo triplet can be rather inconsistent with each other, resulting in large triangulation error. It is suggested to use instead the exact linescan camera model. +.. _pleiades_projected: + +Pleiades projected images +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Airbus offers Pleiades ortho images, that are projected onto a surface of constant +height above a datum. These products contain the string ``PRJ`` in the image and +camera names, and have the ``PHR_PROJECTED`` keyword in the XML camera files. + +The projection height is stored in the ``DIM*PRJ*.XML`` camera model files, +in the ``Bounding_Polygon`` field, in the ```` tag. This height is in meters, +above the WGS84 ellipsoid. + +To process such data with ASP, use the provided RPC camera models, while passing +the heights for the left and right images as part of the ``--ortho-height`` option, +together with the option ``-t rpc``. See :numref:`mapproj_ortho` for details. + +ASP does not support Airbus images that are orthorectified with a 3D terrain +model, as that terrain model is not known. + .. _airbus_tiled: Pleiades tiled images diff --git a/docs/next_steps.rst b/docs/next_steps.rst index 18ea4b0c1..51db49dfc 100644 --- a/docs/next_steps.rst +++ b/docs/next_steps.rst @@ -877,10 +877,11 @@ An example without mapprojected images is shown in :numref:`bathy_reuse_run`. Stereo with ortho-ready images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Some vendors offer images that have been mapprojected onto surfaces -of constant height above a datum. An example is Maxar's OR2A product. +Some vendors offer images that have been projected onto surfaces +of constant height above a datum. Examples are Maxar's OR2A product +and the Airbus Pleiades ortho product (:numref:`pleiades_projected`). -The stereo command for such images is:: +The stereo command for Maxar (DigitalGlobe) data is:: parallel_stereo \ -t dg \ @@ -890,12 +891,14 @@ The stereo command for such images is:: left.xml right.xml \ run/run -Here, the values passed in via ``--ortho-heights`` are the heights above the +The values passed in via ``--ortho-heights`` are the heights above the datum that were used to mapproject the images. The datum is read from the geoheader of the images. -DEMs with such heights are created in the output directory, then the usual -workflow of stereo with mapprojected images takes place. +For Pleiades data and RPC cameras use instead ``-t rpc``. + +Helper DEMs with such heights are created in the output directory, then the +usual workflow of stereo with mapprojected images takes place. .. _diagnosing_problems: diff --git a/src/asp/Sessions/StereoSession.cc b/src/asp/Sessions/StereoSession.cc index d9c64c4b2..cca3168bc 100644 --- a/src/asp/Sessions/StereoSession.cc +++ b/src/asp/Sessions/StereoSession.cc @@ -225,17 +225,9 @@ namespace asp { vw::CamPtr & left_map_proj_cam, vw::CamPtr & right_map_proj_cam) { - // Load the name of the camera model, session, and DEM used in mapprojection - // based on the record in that image. Load the bundle adjust prefix from the - // mapprojected image. It can be empty, when such a prefix was not used in - // mapprojection. std::string l_adj_prefix, r_adj_prefix, l_image_file, r_image_file, l_cam_type, r_cam_type, l_cam_file, r_cam_file, l_dem_file, r_dem_file; - read_mapproj_header(left_image_file, left_camera_file, input_dem, session_name, - l_adj_prefix, l_image_file, l_cam_type, l_cam_file, l_dem_file); - read_mapproj_header(right_image_file, right_camera_file, input_dem, session_name, - r_adj_prefix, r_image_file, r_cam_type, r_cam_file, r_dem_file); - + vw::Vector2 heights = asp::stereo_settings().ortho_heights; bool have_heights = (!std::isnan(heights[0]) && !std::isnan(heights[1])); if (have_heights) { @@ -246,6 +238,15 @@ namespace asp { if (l_adj_prefix != "" || r_adj_prefix != "") vw_throw(ArgumentErr() << "StereoSession: Expect no bundle adjustment prefix " << "in ortho images geoheaders.\n"); + } else { + // Load the name of the camera model, session, and DEM used in mapprojection + // based on the record in that image. Load the bundle adjust prefix from the + // mapprojected image. It can be empty, when such a prefix was not used in + // mapprojection. + read_mapproj_header(left_image_file, left_camera_file, input_dem, session_name, + l_adj_prefix, l_image_file, l_cam_type, l_cam_file, l_dem_file); + read_mapproj_header(right_image_file, right_camera_file, input_dem, session_name, + r_adj_prefix, r_image_file, r_cam_type, r_cam_file, r_dem_file); } vw_out() << "Mapprojected images bundle adjustment prefixes: "