view main/octproj/src/_op_inv.cc @ 6710:bef8870c47f1 octave-forge

OctPROJ upload (correct version)
author jgpallero
date Mon, 15 Feb 2010 08:08:22 +0000
parents 66cac59a24a4
children 0453b209d99d
line wrap: on
line source

/* -*- coding: utf-8 -*- */
/* Copyright (C) 2009  José Luis García Pallero, <jgpallero@gmail.com>
 *
 * This file is part of OctPROJ.
 *
 * OctPROJ is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this software; see the file COPYING.  If not, see
 * <http://www.gnu.org/licenses/>.
 */
/******************************************************************************/
/******************************************************************************/
#define HELPTEXT "\
-*- texinfo -*-\n\
@deftypefn{Loadable Function}{[@var{lon},@var{lat}] =}\
_op_inv(@var{X},@var{Y},@var{params})\n\
\n\
@cindex Performs inverse projection step.\n\
\n\
This function unprojects cartesian projected coordinates (in a defined\n\
cartographic projection) into geodetic coordinates using the PROJ.4 function \
pj_inv().\n\
\n\
@var{X} is a column vector containing the X projected coordinates.\n\
@var{Y} is a column vector containing the Y projected coordinates.\n\
@var{params} is a text string containing the projection parameters in PROJ.4 \
format.\n\
\n\
The coordinate vectors @var{X} and @var{Y} must be both scalars or both\n\
column vectors (of the same size).\n\
\n\
@var{lon} is a column vector containing the geodetic longitude, in radians.\n\
@var{lat} is a column vector containing the geodetic latitude, in radians.\n\
\n\
If a projection error occurs, the resultant coordinates for the affected\n\
points have both Inf value and a warning message is emitted (one for each\n\
erroneous point).\n\
@seealso{_op_fwd, _op_transform}\n\
@end deftypefn"
/******************************************************************************/
/******************************************************************************/
#include<octave/oct.h>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include"projwrap.h"
/******************************************************************************/
/******************************************************************************/
#define ERRORTEXT 1000
/******************************************************************************/
/******************************************************************************/
DEFUN_DLD(_op_inv,args,,HELPTEXT)
{
    //error message
    char errorText[ERRORTEXT]="_op_inv:\n\t";
    //output list
    octave_value_list outputList;
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    //checking input arguments
    if(args.length()!=3)
    {
        //error text
        sprintf(&errorText[strlen(errorText)],
                "Incorrect number of input arguments\n\t"
                "See help _op_inv");
        //error message
        error(errorText);
    }
    else
    {
        //error code
        int idErr=0;
        //error in projection
        int projectionError=0;
        //loop index
        size_t i=0;
        //projected coordinates
        ColumnVector X=args(0).column_vector_value();
        ColumnVector Y=args(1).column_vector_value();
        //projection parameters
        std::string params=args(2).string_value();
        //number of elements
        size_t nElem=static_cast<size_t>(X.rows());
        //geodetic coordinates
        ColumnVector lonOut(nElem);
        ColumnVector latOut(nElem);
        //computation vectors
        double* lon=NULL;
        double* lat=NULL;
        ////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////
        //copy input data
        for(i=0;i<nElem;i++)
        {
            lonOut(i) = X(i);
            latOut(i) = Y(i);
        }
        //pointers to output data
        lon = lonOut.fortran_vec();
        lat = latOut.fortran_vec();
        ////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////
        //projection
        idErr = proj_inv(lon,lat,nElem,params.c_str(),&errorText[strlen(errorText)],
                         &projectionError);
        //error checking
        if(idErr||projectionError)
        {
            //type of error
            if(projectionError)
            {
                //warning message
                warning(errorText);
                //positions of projection errors
                for(i=0;i<nElem;i++)
                {
                    //testing for HUGE_VAL
                    if((lon[i]==HUGE_VAL)||(lat[i]==HUGE_VAL))
                    {
                        //error text
                        warning("Projection error in point %d "
                                "(index starts at 1)",i+1);
                    }
                }
            }
            else
            {
                //error message
                error(errorText);
                //exit
                return outputList;
            }
        }
        ////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////
        //output parameters list
        outputList(0) = lonOut;
        outputList(1) = latOut;
    }
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    //exit
    return outputList;
}