Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libjni-proj4 / src / crsJniProj.c @ 28773

History | View | Annotate | Download (9.36 KB)

1
/**********************************************************************
2
 * $Id: crsJniProj.c,v 1.9 2006/09/07 10:38:13
3
 *
4
 * Name:     crsJniProj.c
5
 * Project:  Proj-4.4.9. Cartographic Projections library(Gerald Evenden).
6
 * Purpose:  Projections Basic Funcions.
7
 * Author:   Miguel Garcia Jimenez, garciajimenez.miguel@gmail.com
8
 * Collaborator: Jose Luis Gomez Martinez, jolugomar@gmail.com
9
 *               David Hernandez Lopez , dhernan@agr-ab.uclm.es
10
 *
11
 **********************************************************************/
12
/* gvSIG. Sistema de Informacion Geografica de la Generalitat Valenciana
13
 *
14
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
15
 *
16
 * This program is free software; you can redistribute it and/or
17
 * modify it under the terms of the GNU General Public License
18
 * as published by the Free Software Foundation; either version 2
19
 * of the License, or (at your option) any later version.
20
 *
21
 * This program is distributed in the hope that it will be useful,
22
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
 * GNU General Public License for more details.
25
 *
26
 * You should have received a copy of the GNU General Public License
27
 * along with this program; if not, write to the Free Software
28
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
29
 *
30
 */
31

    
32
#include "projects.h"
33
#include <jni.h>
34
#include <proj_api.h>
35

    
36
#define arraysize 300
37

    
38
//Realizar una operacion entre CRS, pasando como parametros tres arrays de doubles(puntos)
39
JNIEXPORT int JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_operation
40
(JNIEnv * env, jobject parent, jdoubleArray firstcoord, jdoubleArray secondcoord, jdoubleArray values, jlong src, jlong dest)
41
{
42
        int err = 0;
43
        int i;
44
        projPJ src_pj, dst_pj; // comprobar si se puede quitar
45
        jboolean isCopy;
46
        jdouble *xcoord;
47
        jdouble *ycoord;
48
        jdouble *zcoord; 
49
        jint sizeofdata;
50
        
51
        src_pj = (projPJ)src;
52
        dst_pj = (projPJ)dest;
53
                
54
        xcoord = (*env)->GetDoubleArrayElements(env, firstcoord, &isCopy);
55
        ycoord = (*env)->GetDoubleArrayElements(env, secondcoord, &isCopy);
56
        zcoord = (*env)->GetDoubleArrayElements(env, values, &isCopy);
57
        sizeofdata = (*env)->GetArrayLength(env, firstcoord);
58
        if(src_pj->is_latlong == 1)
59
        {
60
                for(i = 0;i<sizeofdata;i++)
61
                {
62
                        *xcoord = *xcoord / (180/PI);
63
                        *ycoord = *ycoord / (180/PI);
64

    
65
                        err = pj_transform( src_pj, dst_pj,1,1, xcoord, ycoord, zcoord);
66
                        if(dst_pj->is_latlong == 1)
67
                        {
68
                                *xcoord = *xcoord * (180/PI);
69
                                *ycoord = *ycoord * (180/PI);
70

    
71
                        }
72
                        xcoord++;
73
                        ycoord++;
74
                        zcoord++;
75
                }
76
        }
77
        if(src_pj->is_latlong == 0)
78
        {
79
                for(i = 0;i<sizeofdata;i++)
80
                {
81
                        err = pj_transform( src_pj, dst_pj,1,1, xcoord, ycoord, zcoord);
82

    
83
                        if(dst_pj->is_latlong == 1)
84
                        {
85
                                *xcoord = *xcoord * (180/PI);
86
                                *ycoord = *ycoord * (180/PI);
87
                        }
88
                        xcoord++;
89
                        ycoord++;
90
                        zcoord++;
91
                }
92
        }
93
        xcoord = xcoord - sizeofdata;
94
        ycoord = ycoord - sizeofdata;
95
        zcoord = zcoord - sizeofdata;
96
        (* env)->ReleaseDoubleArrayElements(env,firstcoord,(jdouble *) xcoord,0);
97
        (* env)->ReleaseDoubleArrayElements(env,secondcoord,(jdouble *) ycoord,0);
98
        (* env)->ReleaseDoubleArrayElements(env,values,(jdouble *) zcoord,0);
99
        // return 1; // pendiente de analizar error
100
        return err;
101
}
102

    
103
//Realizar una operacion entre CRS, pasando como parametros tres doubles(puntos)
104

    
105
JNIEXPORT int JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_operationSimple
106
(JNIEnv * env, jobject parent, jdouble firstcoord, jdouble secondcoord, jdouble values, jlong src, jlong dest)
107
{
108
        int err = 0;
109
        int i;
110
        projPJ src_pj, dst_pj; // comprobar si se puede quitar
111
        double x,y,z;
112
        double *xcoord;
113
        double *ycoord;
114
        double *zcoord;
115
        
116
        src_pj = (projPJ)src;
117
        dst_pj = (projPJ)dest;
118

    
119
        x=firstcoord;
120
        y=secondcoord;
121
        z=values;
122
        *xcoord = firstcoord;
123
        *ycoord = secondcoord;
124
        *zcoord = values;
125

    
126
        if(src_pj->is_latlong == 1)
127
        {
128
                *xcoord = *xcoord / (180/PI);
129
                *ycoord = *ycoord / (180/PI);
130
        }
131

    
132
        err = pj_transform( src_pj, dst_pj,1,1, xcoord,ycoord,zcoord);
133

    
134
        if(dst_pj->is_latlong == 1)
135
        {
136
                *xcoord = *xcoord * (180/PI);
137
                *ycoord = *ycoord * (180/PI);
138
        }
139

    
140
        firstcoord =*xcoord;
141
        secondcoord =*ycoord;
142
        values =*zcoord;
143

    
144
        // return 1; // pendiente de analizar error
145
        return err;
146
}
147

    
148
//Realizar una operacion entre CRS, pasando como parametro un array de tres dobles(puntos)
149

    
150
JNIEXPORT int JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_operationArraySimple
151
(JNIEnv * env, jobject parent, jdoubleArray coord, jlong src, jlong dest)
152
{
153
        int err = 0;
154
        projPJ src_pj, dst_pj; // comprobar si se puede quitar
155
        jdouble *xcoord;
156
        jdouble *zcoord;
157
        jdouble *ycoord;
158
        
159
        src_pj = (projPJ)src;
160
        dst_pj = (projPJ)dest;
161
        
162
        zcoord = (* env)-> GetDoubleArrayElements(env, coord, NULL);
163
        xcoord = zcoord++;
164
        ycoord = zcoord++;
165

    
166
        if(src_pj->is_latlong == 1)
167
        {
168
                *xcoord = *xcoord / (180/PI);
169
                *ycoord = *ycoord / (180/PI);
170
        }
171

    
172
        err = pj_transform( src_pj, dst_pj,1,1, xcoord, ycoord, zcoord);
173

    
174
        if(dst_pj->is_latlong == 1)
175
        {
176
                *xcoord = *xcoord * (180/PI);
177
                *ycoord = *ycoord * (180/PI);
178
        }
179

    
180
        (* env)->ReleaseDoubleArrayElements(env,coord,(jdouble *) xcoord,0);
181

    
182
        // return 1; // pendiente de analizar error
183
        return err;
184
}
185

    
186
//Crea un CRS a partir de una cadena proj4, devolviendo la direccion de memoria del CRS
187

    
188
JNIEXPORT projPJ JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_loadCrs
189
(JNIEnv * env, jobject parent, jstring strCrs)
190
{
191
        projPJ src_pj;
192
        char * srcproj_def = (char *) (*env)->GetStringUTFChars (env, strCrs, 0);
193
        if (!(src_pj = pj_init_plus(srcproj_def))) return 0;
194
        return src_pj;
195
}
196

    
197
//Libera la direccion de memoria del CRS creado
198

    
199
JNIEXPORT void JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_freeCrs
200
(JNIEnv * env, jobject parent, jlong crs )
201
{
202
        projPJ proj_pj;
203
        proj_pj = crs;
204
        pj_free( proj_pj );
205
}
206

    
207
//Devuelve un 1 si el CRS es latlong,  un 0 en caso contrario o un codigo de error (negativo) si el crs no está bien creado.
208

    
209
JNIEXPORT int JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_isLatlong
210
(JNIEnv * env, jobject parent, jlong crs)
211
{
212
        projPJ proj_pj = crs;
213

    
214
        int *err = pj_get_errno_ref();
215
        if(*err>=0)
216
        return proj_pj->is_latlong;
217
        else
218
        return *err;
219
}
220

    
221
//Devuelve el codigo de error correspondiente al ultimo crs creado.
222

    
223
JNIEXPORT int JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_getErrno
224
(JNIEnv * env, jobject parent)
225
{
226
        int *err = pj_get_errno_ref();
227
        return *err;
228
}
229

    
230
//Traduce un codigo de error a su correspondiente mensaje.
231

    
232
JNIEXPORT jstring JNICALL Java_org_gvsig_crs_proj_JNIBaseCrs_strErrno
233
(JNIEnv * env, jobject parent, jint errno)
234
{
235
        int err = errno;
236
        char * strerr = pj_strerrno(err);
237
        return (*env)->NewStringUTF(env,strerr);
238
}
239

    
240
/*!
241
 * \brief
242
 * retrieves projection parameters
243
 *
244
 * JNI informations:
245
 * Class:     org_proj4_Projections
246
 * Method:    getProjInfo
247
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
248
 *
249
 *
250
 * \param env - parameter used by jni (see JNI specification)
251
 * \param parent - parameter used by jni (see JNI specification)
252
 * \param projdefinition - definition of the projection
253
 */
254
/*
255
 JNIEXPORT jstring JNICALL Java_org_proj4_Projections_getProjInfo
256
 (JNIEnv * env, jobject parent, jstring projdefinition)
257
 {
258
 PJ *pj;
259
 char * pjdesc;
260
 char info[arraysize];
261

262
 char * proj_def = (char *) (*env)->GetStringUTFChars (env, projdefinition, 0);
263

264
 if (!(pj = pj_init_plus(proj_def)))
265
 exit(1);
266

267
 // put together all the info of the projection and free the pointer to pjdesc
268
 pjdesc = pj_get_def(pj, 0);
269
 strcpy(info,pjdesc);
270
 pj_dalloc(pjdesc);
271

272
 return (*env)->NewStringUTF(env,info);
273
 }
274
 */
275

    
276
/*!
277
 * \brief
278
 * retrieves ellipsoid parameters
279
 *
280
 * JNI informations:
281
 * Class:     org_proj4_Projections
282
 * Method:    getEllipsInfo
283
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
284
 *
285
 *
286
 * \param env - parameter used by jni (see JNI specification)
287
 * \param parent - parameter used by jni (see JNI specification)
288
 * \param projdefinition - definition of the projection
289
 */
290
/*
291
 JNIEXPORT jstring JNICALL Java_org_proj4_Projections_getEllipsInfo
292
 (JNIEnv * env, jobject parent, jstring projdefinition)
293
 {
294
 PJ *pj;
295
 char * pjdesc;
296
 char ellipseinfo[arraysize];
297
 char temp[50];
298

299
 char * proj_def = (char *) (*env)->GetStringUTFChars (env, projdefinition, 0);
300

301
 if (!(pj = pj_init_plus(proj_def)))
302
 exit(1);
303

304
 // put together all the info of the ellipsoid
305
 //  sprintf(temp,"name: %s;", pj->descr);
306
 sprintf(temp,"name: not available;");
307
 strcpy(ellipseinfo,temp);
308
 sprintf(temp,"a: %lf;", pj->a);
309
 strcat(ellipseinfo,temp);
310
 sprintf(temp,"e: %lf;", pj->e);
311
 strcat(ellipseinfo,temp);
312
 sprintf(temp,"es: %lf;", pj->es);
313
 strcat(ellipseinfo,temp);
314
 sprintf(temp,"ra: %lf;", pj->ra);
315
 strcat(ellipseinfo,temp);
316
 sprintf(temp,"one_es: %lf;", pj->one_es);
317
 strcat(ellipseinfo,temp);
318
 sprintf(temp,"rone_es: %lf;", pj->rone_es);
319
 strcat(ellipseinfo,temp);
320
 sprintf(temp,"lam0: %lf;", pj->lam0);
321
 strcat(ellipseinfo,temp);
322
 sprintf(temp,"phi0: %lf;", pj->phi0);
323
 strcat(ellipseinfo,temp);
324
 sprintf(temp,"x0: %lf;", pj->x0);
325
 strcat(ellipseinfo,temp);
326
 sprintf(temp,"y0: %lf;", pj->y0);
327
 strcat(ellipseinfo,temp);
328
 sprintf(temp,"k0: %lf;", pj->k0);
329
 strcat(ellipseinfo,temp);
330
 sprintf(temp,"to_meter: %lf;", pj->to_meter);
331
 strcat(ellipseinfo,temp);
332
 sprintf(temp,"fr_meter: %lf;", pj->fr_meter);
333
 strcat(ellipseinfo,temp);
334

335
 return (*env)->NewStringUTF(env,ellipseinfo);
336
 }
337
 */