[Proj] please help C++ idiot with datum conversion

Mike Zulauf mazulauf at met.utah.edu
Thu Jul 15 15:49:17 EDT 2004


Thank you very much to all who responded (Frank, Duncan, and Sam).

With a few minor changes, Frank's code does the trick.  I also found  
that my local version of proj had originally been built without the  
datum conversion files, so I had to rebuild them with those included.   
That was quick and easy.  The test points that I give it now return  
with the correct values.

Y'all saved me a lot of time.  Now I can leave behind the confusing  
world of C++, and get back to my more typical Fortran neighborhood.

Thanks again,
Mike


On Jul 15, 2004, at 10:49 AM, Frank Warmerdam wrote:

> Mike Zulauf wrote:
>> Hi all,
>> I have what I believe to be a simple question.  I've got a very  
>> simple bit of code C++ that converts a vector containing NAD27  
>> long-lat to NAD27 State Plane coordinates.  It's written so that I  
>> can call it from Fortran.  It appears to be working, and giving  
>> correct results.
>> I need to modify it, however, so that it will also do a datum  
>> conversion, from WGS84 lat-lon to NAD27 State Plane coordinates.  I'm  
>> sure this is simple, but I'm a newbie with PROJ.  To make matters  
>> worse, I'm not a C++ programmer.  I generally work with Fortran.
>> Below is the code as it stands now.  What's the best way to modify  
>> the code to include the datum conversion?  It's ok to just have it  
>> hard-wired - I don't need it to be flexible (ie, it doesn't need to  
>> be able to handle NAD27 _or_ WGS84, just WGS84).  But I still need  
>> the output to be NAD27.
>> Even though it works as it is now (without datum conversion), it's  
>> entirely likely I have some stupid error or nonstandard code, since  
>> I'm not a C++ programmer.  If there's anything of that sort which  
>> might cause problems down the line, I wouldn't mind hearing about  
>> that either.
>
> Mike,
>
> I have included an alternate implementation using pj_transform().  The
> code compiled but I haven't tested it.  Note:
>
>  o I use proj_api.h, the public include file instead of projects.h  
> which is
>    really only for internal use (or backward compatibility).
>
>  o I use pj_transform() instead of pj_fwd() as it includes support for  
> two
>    arbitrary coordinate systems and extra stuff like datum conversion.
>
> #include <stdio.h>
> #include <proj_api.h>
>
> void conv_coords(double coord_1[], double coord_2[], int *ni,
>                  int *conv_stat)
> {
>     static const char *src_crs = "+proj=latlong +datum=WGS84";
>     static const char *dst_crs = "+init=nad27:3601 +datum=NAD27";
>
>     projPJ src_PJ, dst_PJ;
>     projUV data;
>     int i;
>
>     src_PJ = pj_init_plus( src_crs );
>     dst_PJ = pj_init_plus( dst_crs );
>
>     *conv_stat = 1;
>
>     if ( src_PJ == NULL || dst_PJ == NULL )
>     {
>         printf("pj_init error\n");
>         *conv_stat = 0;
>     }
>
>     for (i = 0; i <= *ni-1; i++)
>     {
>         double dummyz = 0.0;
>
>         if( pj_transform( src_PJ, dst_PJ,  1, 0,
>                           coord_1 + i, coord_2 + i, &dummyz ) != 0 )
>         {
>             printf("pj_fwd error\n");
>             *conv_stat = 0;
>         }
>
>         if (coord_1[i] != HUGE_VAL)
>         {
>             coord_1[i] = data.u;
>             coord_2[i] = data.v;
>         }
>         else
>         {
>             printf("pj_fwd error\n");
>             *conv_stat = 0;
>         }
>     }
>
>     pj_free(src_PJ);
>     pj_free(dst_PJ);
> }
>
>
> Good luck,
>
> --  
> --------------------------------------- 
> +--------------------------------------
> I set the clouds in motion - turn up   | Frank Warmerdam,  
> warmerdam at pobox.com
> light and sound - activate the windows | http://pobox.com/~warmerdam
> and watch the world go round - Rush    | Geospatial Programmer for Rent
>
>

-- 
Mike Zulauf
mazulauf at met.utah.edu




More information about the Proj mailing list