1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/*
* Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES)
*
* This file is part of Orfeo Toolbox
*
* https://www.orfeo-toolbox.org/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef otbSarSensorModelAdapter_h
#define otbSarSensorModelAdapter_h
#include <memory>
#include "otbDEMHandler.h"
#include "itkPoint.h"
namespace ossimplugins
{
class ossimSarSensorModel;
}
namespace otb
{
class ImageKeywordlist;
/**
* \class SarSensorModelAdapter
* \brief Wrapper class to access SarSensorModel specific methods
*
* This class is NOT intended to be used outside of OTB. Use the
* InverseSensorModel and ForwardSensorModel. If you feel that you need to use
* it directly, think again!
*
* \sa InverseSensorModel
* \sa ForwardSensorModel
* \ingroup Projection
*
*
* \ingroup OTBOSSIMAdapters
**/
class OTBOSSIMAdapters_EXPORT SarSensorModelAdapter : public itk::Object
{
public:
/** Standard class typedefs. */
using Self = SarSensorModelAdapter;
using Superclass = itk::Object;
using Pointer = itk::SmartPointer<Self>;
using ConstPointer = itk::SmartPointer<const Self>;
using InternalModelPointer = std::unique_ptr<ossimplugins::ossimSarSensorModel>;
using Point2DType = itk::Point<double, 2>;
using Point3DType = itk::Point<double, 3>;
/** Method for creation through the object factory. */
itkNewMacro(Self);
/** Run-time type information (and related methods). */
itkTypeMacro(SarSensorModelAdapter, itk::Object);
/** Load model from keyword list */
bool LoadState(const ImageKeywordlist& image_kwl);
/** Save keyword list from model */
bool SaveState(ImageKeywordlist& image_kwl);
/** Is sensor model valid method. return false if the m_SensorModel is null*/
bool IsValidSensorModel() const;
/** Deburst metadata if possible and return lines to keep in image file */
bool Deburst(std::vector<std::pair<unsigned long, unsigned long>>& lines, std::pair<unsigned long, unsigned long>& samples, bool onlyValidSample = false);
/** Burst extraction and return lines/samples to keep into image file (the required burst) */
bool BurstExtraction(const unsigned int burst_index, std::pair<unsigned long, unsigned long>& lines, std::pair<unsigned long, unsigned long>& samples,
bool allPixels = false);
/** Deburst metadata if possible and prepare the burst concatenation */
bool DeburstAndConcatenate(std::vector<std::pair<unsigned long, unsigned long>>& linesBursts,
std::vector<std::pair<unsigned long, unsigned long>>& samplesBursts, unsigned int& linesOffset, unsigned int first_burstInd,
bool inputWithInvalidPixels = false);
/** Specify overlap area between two bursts */
bool Overlap(std::pair<unsigned long, unsigned long>& linesUp, std::pair<unsigned long, unsigned long>& linesLow,
std::pair<unsigned long, unsigned long>& samplesUp, std::pair<unsigned long, unsigned long>& samplesLow, unsigned int burstIndUp,
bool inputWithInvalidPixels = false);
/** Transform world point (lat,lon,hgt) to input image point
(col,row) and YZ frame */
bool WorldToLineSampleYZ(const Point3DType& inGeoPoint, Point2DType& cr, Point2DType& yz) const;
/** Transform world point (lat,lon,hgt) to input image point
(col,row) */
bool WorldToLineSample(const Point3DType& inGEoPOint, Point2DType& cr) const;
/** Transform world point (lat,lon,hgt) to satellite position (x,y,z) and satellite velocity */
bool WorldToSatPositionAndVelocity(const Point3DType& inGeoPoint, Point3DType& satellitePosition, Point3DType& satelliteVelocity) const;
/** Transform line index to satellite position (x,y,z) and satellite velocity */
bool LineToSatPositionAndVelocity(const double line, Point3DType& satellitePosition, Point3DType& satelliteVelocity) const;
/** Transform world point (lat,lon,hgt) to cartesian point (x,y,z) */
static bool WorldToCartesian(const Point3DType& inGeoPoint, Point3DType& outCartesianPoint);
static bool ImageLineToDeburstLine(const std::vector<std::pair<unsigned long, unsigned long>>& lines, unsigned long imageLine, unsigned long& deburstLine);
static void DeburstLineToImageLine(const std::vector<std::pair<unsigned long, unsigned long>>& lines, unsigned long deburstLine, unsigned long& imageLine);
protected:
SarSensorModelAdapter();
virtual ~SarSensorModelAdapter() override;
private:
SarSensorModelAdapter(const Self&) = delete;
void operator=(const Self&) = delete;
InternalModelPointer m_SensorModel;
};
} // namespace otb
#endif
|