/usr/include/OTB-5.8/otbGeographicalDistance.txx is in libotb-dev 5.8.0+dfsg-3.
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 | /*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
Copyright (c) CS Systemes d'information. All rights reserved.
See CSCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef otbGeographicalDistance_txx
#define otbGeographicalDistance_txx
#include "otbGeographicalDistance.h"
#include "otbMath.h"
namespace otb
{
template <class TVector>
GeographicalDistance<TVector>
::GeographicalDistance() : m_EarthRadius(6371000)
{}
template <class TVector>
double
GeographicalDistance<TVector>
::Evaluate(const VectorType & x) const
{
// First check if vector length is sufficient
if(x.Size()<2)
itkExceptionMacro(<<"Vector length must be at least 2 to compute geographical distance.");
// Call evaluate implementation with the first point being the
// origin
VectorType origin(x);
origin[0]=this->GetOrigin()[0];
origin[1]=this->GetOrigin()[1];
return this->Evaluate(origin, x);
}
template <class TVector>
double
GeographicalDistance<TVector>
::Evaluate(const VectorType & x, const VectorType & y) const
{
// First check if vector length is sufficient
if(x.Size()<2 || y.Size()<2)
itkExceptionMacro(<<"Vector length must be at least 2 to compute geographical distance.");
// Build some const variables
const double One = itk::NumericTraits<double>::One;
const double Two = One + One;
const double Deg2Rad = CONST_PI/180.;
// Compute latitude and longitude differences
double dLat = (vcl_fabs(x[1] - y[1])) * Deg2Rad;
double dLon = (vcl_fabs(x[0] - y[0])) * Deg2Rad;
// Compute dx in meters
double a = vcl_sin(dLat / Two) * vcl_sin(dLat / Two) + vcl_cos(y[1] * Deg2Rad) * vcl_cos(
x[1] * Deg2Rad) * vcl_sin(dLon / Two) * vcl_sin(dLon / Two);
double c = Two * vcl_atan2(vcl_sqrt(a), vcl_sqrt(One - a));
double d = m_EarthRadius * c;
// Return result
return d;
}
template <class TVector>
void
GeographicalDistance<TVector>
::PrintSelf(std::ostream & os, itk::Indent indent) const
{
// Call superclass implementation
Superclass::PrintSelf(os, indent);
// Earth radius
os<<indent<<"Earth radius: "<<m_EarthRadius<<std::endl;
}
} // End namespace otb
#endif
|