/usr/include/ossim/imaging/ossimImageGeometry.h is in libossim-dev 2.2.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 | //***********************************************************************************************
//
// License: MIT
//
// See LICENSE.txt file in the top level directory for more details.
//
// Author: Oscar Kramer (oscarkramer@yahoo.com)
//
// Description: Class declaration of ossimImageGeometry.
//
//***********************************************************************************************
// $Id: ossimImageGeometry.h 3102 2012-01-18 15:30:20Z oscar.kramer $
#ifndef ossimImageGeometry_HEADER
#define ossimImageGeometry_HEADER 1
#include <ossim/base/ossimConstants.h>
#include <ossim/base/ossimObject.h>
#include <ossim/base/ossimDpt.h>
#include <ossim/base/ossimIpt.h>
#include <ossim/base/ossimRtti.h>
#include <ossim/base/ossimRefPtr.h>
#include <ossim/base/ossimPolyArea2d.h>
#include <ossim/projection/ossimMapProjection.h>
#include <ossim/projection/ossimProjection.h>
#include <ossim/base/ossim2dTo2dTransform.h>
#include <vector>
#include <ossim/matrix/newmat.h>
#include <ossim/base/ossimDpt3d.h>
#include <ossim/base/ossimAdjustableParameterInterface.h>
// Forward class declarations:
class ossimDrect;
class ossimIrect;
class ossimGrect;
//***********************************************************************************************
//! Container class that holds both 2D transform and 3D projection information for an image
//! Only one instance of this is alive per image. This is the object that is returned from
//! a call to ossimImageSource::getImageGeometry()
//!
//! All images in OSSIM have at least a 2D transformation from local (relative to start of file)
//! to full-image coordinates. Often this transform is an identity transform (does nothing). In
//! some cases however, the first pixel in the file does not correspond to the upper-left pixel of
//! the original, full image. Since the image's sensor model may only apply to full-image pixel
//! coordinates, it is necessary to reference the latter when making computing ground point
//! location. Also the local image could be a reduced resolution level of the full image. So
//! the image could be a decimated sub image of the full image.
//!
//! Additionally, images typically are accompanied by some form of metadata that defines the mapping
//! from 2D image coordinates to 3D world coordinates. This mapping may be in the form of a map
//! projection for orthorectified images, or a perspective projection such as a sensor model.
//!
//! This object class maintains both 2D transform and 3D projection information for the associated
//! image. This object will typically be created and "owned" by the image handler object. Therefore,
//! only one copy per image will exist at a time.
//!
//! Notes:
//! 1) Shifts are relative to "full image space". So if you have a sub image from r2 the shift
//! given to the transform should be relative to "full image space".
//
//! 2) A decimation of 1.0 is the full image. This may or may not be r0 as r0 can be decimated.
//!
//***********************************************************************************************
class OSSIM_DLL ossimImageGeometry : public ossimObject
{
public:
typedef std::vector<ossim_float64> DeltaParamList;
//! Default constructor defaults to unity transform with no projection.
ossimImageGeometry();
virtual ~ossimImageGeometry();
//! Copy constructor -- performs a deep copy. This is needed when an imageSource in the chain
//! needs to modify the image geometry at that point in the chain. The image geometry to the
//! left of that imageSource must remain unchanged. This constructor permits that imageSource to
//! maintain its own geometry based on the input geometry. All chained objects to the right
//! would see this alternate geometry. See ossimScaleFilter for an example of this case.
ossimImageGeometry(const ossimImageGeometry& copy_this);
//! Constructs with projection and transform objects available for referencing. Either pointer
//! can be NULL -- the associated mapping would be identity.
ossimImageGeometry(ossim2dTo2dTransform* transform, ossimProjection* projection);
//! Shortcut way of getting to an image's geometry when access to pixels is not needed.
//! @param image Image to open
//! @return true if open was successful and a valid geometry was initialized.
bool open(const ossimFilename& image);
//! rnToRn is a utility method that takes a rn resolution image point and maps it to the another
//! rn resolution image point.
//!
//! @param inRnPt Is a point in resolution n.
//! @param inResolutionLevel Is the resolution of the point inRnPt.
//! @param outResolutionLevel Is the resolution of the point outRnPt.
//! @param outRnPt Is the result of the transform.
//!
void rnToRn(const ossimDpt& inRnPt, ossim_uint32 inResolutionLevel,
ossim_uint32 outResolutionLevel,ossimDpt& outRnPt) const;
//! rnToFull is a utility method that takes a rn resolution image point and maps it to the full
//! image point.
//!
//! @param rnPt Is a point in resolution n.
//! @param resolutionLevel Is the resolution of the point rnPt. a value of 0 is the local image
//! @param fullPt Is the result of the transform
//!
void rnToFull(const ossimDpt& rnPt, ossim_uint32 resolutionLevel, ossimDpt& fullPt) const;
//! @brief fullToRn is a utility method that takes a full image point and maps it to a rn
//! resolution image point.
//!
//! @param fullPt Is a point in full image space.
//! @param resolutionLevel Is the resolution of the point rnPt. A value of 0 is the local image.
//! @param fullPt Is the result of the transform
void fullToRn(const ossimDpt& fullPt, ossim_uint32 resolutionLevel, ossimDpt& rnPt) const;
//! rnToWorld is a utility method that takes a rn resolution image point and maps it to the
//! world point.
//!
//! @param rnPt Is a point in resolution n.
//! @param resolutionLevel Is the resolution of the point rnPt. a value of 0 is the local image
//! @param wpt Is the result of the transform
//!
void rnToWorld(const ossimDpt& rnPt, ossim_uint32 resolutionLevel, ossimGpt& wpt) const;
//! worldToRn is a utility method that takes a world point allows one to transform all the way back to
//! an rn point.
//!
//! @param wpt Ground point.
//! @param resolutionLevel Is the resolution of the point rnPt. a value of 0 is the local image
//! @param rnPt Is the resoltion point.
//!
void worldToRn(const ossimGpt& wpt, ossim_uint32 resolutionLevel, ossimDpt& rnPt) const;
//! Exposes the 3D projection from image to world coordinates. The caller should verify that
//! a valid projection exists before calling this method. Returns TRUE if a valid ground point
//! is available in the ground_pt argument. This method depends on the existence of elevation
//! information. If no DEM is available, the results will be incorrect or inaccurate.
bool localToWorld(const ossimDpt& local_pt, ossimGpt& world_pt) const;
bool localToWorld(const ossimDrect& local_rect, ossimGrect& world_rect) const;
//! Exposes the 3D projection from image to world coordinates given a constant height above
//! ellipsoid. The caller should verify that a valid projection exists before calling this
//! method. Returns TRUE if a valid ground point is available in the ground_pt argument.
bool localToWorld(const ossimDpt& local_pt, const double& h_ellipsoid, ossimGpt& world_pt) const;
//! Exposes the 3D world-to-local image coordinate reverse projection. The caller should verify
//! that a valid projection exists before calling this method. Returns TRUE if a valid image
//! point is available in the local_pt argument.
bool worldToLocal(const ossimGpt& world_pt, ossimDpt& local_pt) const;
bool worldToLocal(const ossimGrect& world_rect, ossimDrect& local_rect) const;
//! Sets the transform to be used for local-to-full-image coordinate transformation
void setTransform(ossim2dTo2dTransform* transform);
//! Sets the projection to be used for local-to-world coordinate transformation
void setProjection(ossimProjection* projection);
//! Access methods for transform (may be NULL pointer).
const ossim2dTo2dTransform* getTransform() const { return m_transform.get(); }
ossim2dTo2dTransform* getTransform() { return m_transform.get(); }
//! Access methods for projection (may be NULL pointer).
const ossimProjection* getProjection() const { return m_projection.get(); }
ossimProjection* getProjection() { return m_projection.get(); }
/**
* @return const ossimMapProjection* or NULL if projection not set or not
* derived from ossimMapProjection.
*/
const ossimMapProjection* getAsMapProjection() const
{ return dynamic_cast<const ossimMapProjection*>( m_projection.get() ); }
/**
* @return ossimMapProjection* or NULL if projection not set or not
* derived from ossimMapProjection.
*/
ossimMapProjection* getAsMapProjection()
{ return dynamic_cast<ossimMapProjection*>( m_projection.get() ); }
//! Returns TRUE if valid projection defined
bool hasProjection() const { return m_projection.valid(); }
//! Returns TRUE if valid transform defined
bool hasTransform() const { return m_transform.valid(); }
//! Returns TRUE if this geometry is sensitive to elevation
bool isAffectedByElevation() const;
//! Returns the GSD associated with this image in the active projection. Note that this only
//! makes sense if there is a projection associated with the image. Returns NaNs if no
//! projection defined.
ossimDpt getMetersPerPixel() const;
/**
* @brief Get the ground sample distance(GSD) associated with this image
* in the active projection.
*
* GSD is taken from projection if there is no transform set; else,
* taken from three localToWorld calls (one pixel apart) at the image
* center. If the projection or the image size(if needed) is not set the
* point will be set to NaNs.
*
* @param gsd Point to intialize with GSD.
*
* @note This only makes sense if there is a projection associated with
* the image.
*
* @note Result should be checked for NaNs after call.
*/
void getMetersPerPixel( ossimDpt& gsd ) const;
//! Returns the resolution of this image in degrees/pixel. Note that this only
//! makes sense if there is a projection associated with the image. Returns NaNs if no
//! projection defined.
ossimDpt getDegreesPerPixel() const;
/**
* @brief Get the resolution of this image in degrees/pixel.
*
* Degrees/pixel is taken from projection if there is no transform set;
* else, taken from three localToWorld calls (one pixel apart) at the image
* center. If the projection or the image size(if needed) is not set the
* point will be set to NaNs.
*
* @param dpp Point to intialize with degrees/pixel.
*
* @note This only makes sense if there is a projection associated with
* the image.
*
* @note Result should be checked for NaNs after call.
*/
void getDegreesPerPixel( ossimDpt& dpp ) const;
//! Assigns the ossimGpts with the ground coordinates of the four corresponding image
//! corner points. Returns true if points are valid.
bool getCornerGpts(ossimGpt& ul, ossimGpt& ur, ossimGpt& lr, ossimGpt& ll) const;
/**
* @brief Get the latitude, longitude of the tie point.
*
* This is the bounding upper left point of the image which is not
* necessarily the image (0, 0) point.
*
* @param tie ossimGpt to assign.
*
* @param edge If true the tie point is shifted up and to the right by
* half the gsd.
*
* @note Requires projection and image size to be initialized or the
* latitude and longitue will be set to nan.
*
* @note The height parameter of the ossimGpt is not touched by this method.
*/
void getTiePoint(ossimGpt& tie, bool edge) const;
/**
* @brief Get the easting, northing of the tie point.
*
* This is the bounding upper left point of the image which is not
* necessarily the image (0, 0) point.
*
* @param tie ossimDpt to assign.
*
* @param edge If true the tie point is shifted up and to the right by
* half the gsd.
*
* @note Requires projection and image size to be initialized or the
* easting and northing will be set to nan.
*/
void getTiePoint(ossimDpt& tie, bool edge) const;
//! Prints contents to output stream.
std::ostream& print(std::ostream& out) const;
//! Returns TRUE if argument geometry has exactly the same instances for transform and
//! m_projection. This should be expanded to permit different instances of same transforms
bool operator==(const ossimImageGeometry& compare_this) const;
//! Replaces any existing transform and projection with those in the copy_this object
const ossimImageGeometry& operator=(const ossimImageGeometry& copy_this);
//! Returns the decimation factor from R0 for the resolution level specified. For r_index=0, the
//! decimation factor is by definition 1.0. For the non-discrete case, r_index=1 returns a
//! decimation of 0.5. If the vector of discrete decimation factors (m_decimationFactors) is
//! empty, the factor will be computed as f=1/2^n
ossimDpt decimationFactor(ossim_uint32 r_index) const;
/**
* @brief Method to get the decimation factor for a given resolution
* level.
*
* If the array of decimations is not initialized by owner, the default is:
* r_index=0 is by definition 1.0.
* r_index=n Where n is some level the factor will be computed as f=1/2^n.
*
* @param resLevel Reduced resolution set for requested decimation.
*
* @param result ossimDpt to initialize with requested decimation.
*/
void decimationFactor(ossim_uint32 r_index, ossimDpt& result) const;
/**
* @brief Gets array of all decimation levels.
* @param decimations Array to initialiaze.
*/
void decimationFactors(std::vector<ossimDpt>& decimations) const;
//! Sets the decimation scheme to a discrete list of decimation factors.
void setDiscreteDecimation(const std::vector<ossimDpt>& decimation_list)
{ m_decimationFactors = decimation_list; }
//! @return The number of decimation factors
ossim_uint32 getNumberOfDecimations()const
{
return (ossim_uint32)m_decimationFactors.size();
}
void setImageSize(const ossimIpt& size)
{
m_imageSize = size;
}
const ossimIpt& getImageSize()const
{
return m_imageSize;
}
bool getCrossesDateline()const;
void getImageEdgePoints(std::vector<ossimDpt>& result, ossim_uint32 partitions = 25)const;
/**
* This is the first stage implementation. It will determine if it crosses the dateline
* and do a special multi polygon for the ossimPolyArea2d result. For each edge
* of the image we walk "partitions" number of points. If we cross a dateline we calculate
* the crossing lat by using the parametric form of the equation. For example, if we
* are crossing from positive to negative that means we are going through the 180 degree lon
* location and we will need to solve for the paramtetric parameter t and plug back into the parametric
* equation to solve for the latitude. Basic form: start + (end-start)*t = 180. If we are coming from
* negative to positive then we solve basic form: start + (end-start)*t = -180. Where deltaPoint is (end-start)
*
* ossim_float64 t = ((180-start.x)/deltaPoint.x);
* ossim_float64 lat = (start.y+deltaPoint.y*t);
*
* If we do not cross the dateline then if the image is affected by elevation (i.e. a sensor model) then we use the partitions
* parameter to calculate that number of partitions to sample along each edge.
*
* if The geometry is not affected by elevation then we just use the corner points and ignore the partitions parameter
*
* @param poly holds the resulting polygon. This could be a MultiPolygon depending on the geometry
* @param partitions These are the number of steps you want when walking the border.
*/
void calculatePolyBounds(ossimPolyArea2d& result, ossim_uint32 partitions = 25)const;
/**
* @brief Get the bounding rect of (0, 0) to (imageSize.x-1, imageSize.y-1).
*
* Relies on image size being initialized.
*
* @param bounding_rect Initialized by this method. Will do a
* ossimIrect::makeNan() if the image size is not initialized.
*/
void getBoundingRect(ossimIrect& bounding_rect) const;
void getBoundingRect(ossimDrect& bounding_rect) const; // Overloaded for drect.
void getBoundingGroundRect(ossimGrect& bounding_grect) const;
//! Creates a new instance of ossimImageGeometry with the same transform and projection.
//! Overrides base-class version requiring loadState() and saveState() (not implemented yet)
virtual ossimObject* dup() const { return new ossimImageGeometry(*this); }
//! Attempts to initialize a transform and a projection given the KWL. Returns TRUE if no
//! error encountered.
virtual bool loadState(const ossimKeywordlist& kwl, const char* prefix=0);
//! Saves the transform (if any) and projection (if any) states to the KWL.
virtual bool saveState(ossimKeywordlist& kwl, const char* prefix=0) const;
/**
* @brief Set m_targetRrds data member.
*
* This is used by methods worldToRn and localToWorld that do not take a rrds
* argument and methods rnToWorld and worldToRn. If the target rrds is set to 2,
* then the resulting point from worldToLocal is relative to reduced
* resolution level 2. Vice versa for localToWorld it is assumed the local
* point is relative to the target
* reduced resolution data set.
*
* @param rrds Target (zero based) reduced resolution data set.
*/
void setTargetRrds(ossim_uint32 rrds);
/**
* @return The target zero based reduced resolution data set used for localToWorld and
* worldToLocal.
* @see setTargetRrds
*/
ossim_uint32 getTargetRrds() const;
//! @brief Changes the GSD and image size to reflect the scale provided.
//! @param scale The scale to be applied in x and y directions
//! @param recenterTiePoint If true the will adjust the tie point by shifting the original tie
//! to the upper left corner, applying scale, then shifting back by half of either the new
//! theDeltaLat/lon or theMetersPerPixel depending on if underlying projection isGeographic.
void applyScale(const ossimDpt& scale, bool recenterTiePoint);
virtual bool isEqualTo(const ossimObject& obj, ossimCompareType compareType = OSSIM_COMPARE_FULL)const;
// If we have an adjustable parameter interface return one.
//
// @return a pointer to an ossimAdjustableParameterInterface or NULL if no
// adjustable paramters exist
//
virtual ossimAdjustableParameterInterface* getAdjustableParameterInterface();
virtual const ossimAdjustableParameterInterface* getAdjustableParameterInterface()const;
// Compute partials from image to ground with respect to the adjustable parameters.
//
//
bool computeImageToGroundPartialsWRTAdjParam(ossimDpt& result,
const ossimGpt& gpt,
ossim_uint32 idx,
ossim_float64 paramDelta=1.0);
bool computeImageToGroundPartialsWRTAdjParams(NEWMAT::Matrix& result,
const ossimGpt& gpt,
ossim_float64 paramDelta=1.0);
bool computeImageToGroundPartialsWRTAdjParams(NEWMAT::Matrix& result,
const ossimGpt& gpt,
const DeltaParamList& deltas);
bool computeGroundToImagePartials(NEWMAT::Matrix& result,
const ossimGpt& gpt,
const ossimDpt3d& deltaLlh);
bool computeGroundToImagePartials(NEWMAT::Matrix& result,
const ossimGpt& gpt);
/**
* @return Returns the angle to "up is up" in decimal degrees, 0.0 if image
* is not affected by elevation, ossim::nan on error.
*/
ossim_float64 upIsUpAngle(const ossimDpt&) const;
ossim_float64 upIsUpAngle() const;
/**
* @return Returns the angle to "north up" in decimal degrees, ossim::nan
* on error.
*/
ossim_float64 northUpAngle() const;
protected:
//! @brief Method to back out decimation of a point.
//! @param rnPt Is a point in resolution n.
//! @param resolutionLevel Is the resolution of the point rnPt.
//! @param outPt Is the result of the transform a non-decimated point.
void undecimatePoint(const ossimDpt& rnPt,
ossim_uint32 resolutionLevel,
ossimDpt& outPt) const;
//! @brief Method to apply decimation of a point.
//! @param inPt Is a point with no decimation.
//! @param resolutionLevel Is the resolution of the point rnPt.
//! @param rnPt Is the result of the transform
void decimatePoint(const ossimDpt& inPt,
ossim_uint32 resolutionLevel,
ossimDpt& rnPt) const;
ossimRefPtr<ossim2dTo2dTransform> m_transform; //!< Maintains local_image-to-full_image transformation
ossimRefPtr<ossimProjection> m_projection; //!< Maintains full_image-to-world_space transformation
std::vector<ossimDpt> m_decimationFactors; //!< List of decimation factors for R-levels
ossimIpt m_imageSize; // Image width and height
/** @brief Target rrds for localToWorld and worldToLocal methods. */
ossim_uint32 m_targetRrds;
TYPE_DATA
};
#endif /* #ifndef ossimImageGeometry_HEADER */
|