Statistics
| Revision:

svn-gvsig-desktop / tags / v1_2_Build_1207 / libraries / libjni-gdal / src / gdal_interfaz.c @ 41849

History | View | Annotate | Download (13.5 KB)

1
 /**********************************************************************
2
 * $Id: gdal_interfaz.c 15691 2007-10-31 10:49:53Z nbrodin $
3
 *
4
 * Name:     gdal_interfaz.c
5
 * Project:  JGDAL. Interface java to gdal (Frank Warmerdam).
6
 * Purpose:  dataset's Basic Funcions.
7
 * Author:   Nacho Brodin, brodin_ign@gva.es
8
 *
9
 **********************************************************************/
10
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
11
*
12
* Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
13
*
14
* This program is free software; you can redistribute it and/or
15
* modify it under the terms of the GNU General Public License
16
* as published by the Free Software Foundation; either version 2
17
* of the License, or (at your option) any later version.
18
*
19
* This program is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
* GNU General Public License for more details.
23
*
24
* You should have received a copy of the GNU General Public License
25
* along with this program; if not, write to the Free Software
26
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
27
*
28
* For more information, contact:
29
*
30
*  Generalitat Valenciana
31
*   Conselleria d'Infraestructures i Transport
32
*   Av. Blasco Ib??ez, 50
33
*   46010 VALENCIA
34
*   SPAIN
35
*
36
*      +34 963862235
37
*   gvsig@gva.es
38
*      www.gvsig.gva.es
39
*
40
*    or
41
*
42
*   IVER T.I. S.A
43
*   Salamanca 50
44
*   46005 Valencia
45
*   Spain
46
*
47
*   +34 963163400
48
*   dac@iver.es
49
* 
50
* [01] 01-Oct-2005 nbt OpenArray function to support name parameter in char array
51
*/
52

    
53

    
54
#include <jni.h>
55
#include "es_gva_cit_jgdal_Gdal.h"
56
#include "es_gva_cit_jgdal_JNIBase.h"
57
#include "gdal.h"
58
#include "cpl_string.h"
59
#include "signal.h"
60

    
61

    
62

    
63
/******************************************************************************/
64
//                                                                Open
65
/******************************************************************************/
66

    
67

    
68
JNIEXPORT jlong JNICALL Java_es_gva_cit_jgdal_Gdal_openNat
69
  (JNIEnv *env, jobject obj, jstring pszF, jint acc){
70
          
71
          const char *pszFilename;
72
          GDALDatasetH *dataset;
73
          jlong jresult = 0 ;
74
          FILE *fich;
75
         
76
          pszFilename = (*env)->GetStringUTFChars(env, pszF, 0);
77

    
78
        fich=fopen( pszFilename, "r" );
79
        if( fich )
80
                fclose(fich);
81
        else
82
           {
83
              fclose(fich);
84
              return -1;
85
           }
86
          
87
          GDALAllRegister();
88
          dataset = GDALOpen((char *)pszFilename,(int)acc);
89
          
90
          *(GDALDatasetH **)&jresult = dataset;
91
          
92
    (*env)->ReleaseStringUTFChars(env, pszF, pszFilename);
93
          
94
  
95
          if(dataset==NULL)return -1; 
96
          else return jresult; 
97
                  
98
  }
99
  
100
/******************************************************************************/
101
//                                                                OpenArray
102
/******************************************************************************/
103
void handler(int n) {
104
        #ifdef __linux__
105
          raise(SIGALRM);
106
        #else
107
          raise(SIGABRT);
108
        #endif
109
}
110

    
111
JNIEXPORT jlong JNICALL Java_es_gva_cit_jgdal_Gdal_openArrayNat
112
  (JNIEnv *env, jobject obj, jbyteArray pszF, jint acc){
113
          
114
          jbyte *pszFilename = NULL;
115
          jbyte *aux = NULL;
116
          GDALDatasetH *dataset;
117
          jlong jresult = 0 ;
118
          FILE *fich;
119
          jsize longitud = 0, i;
120
        signal(SIGSEGV, handler);
121
                   
122
          longitud = (*env)->GetArrayLength(env, pszF); 
123
          pszFilename = (*env)->GetByteArrayElements(env, pszF, 0);
124
          
125
          #ifdef __linux__
126
                pszFilename = (jbyte *)realloc(pszFilename, longitud + 1);
127
        #else
128
                aux = (jbyte *)malloc(sizeof(jbyte) * (longitud + 1));
129
                  memcpy(aux, pszFilename, longitud);
130
                  free(pszFilename);
131
                  pszFilename = aux;
132
        #endif
133
                  
134
        pszFilename[longitud] = '\0';
135
        
136
        fich = fopen( pszFilename, "r" );
137
        if( fich )
138
                fclose(fich);
139
        else                
140
              return -1;
141
           
142
           GDALAllRegister();
143
          dataset = GDALOpen((char *)pszFilename,(int)acc);
144
          
145
          *(GDALDatasetH **)&jresult = dataset;
146
          
147
    (*env)->ReleaseByteArrayElements(env, pszF, pszFilename, 0);
148
          
149
          if(dataset == NULL)
150
                  return -1; 
151
          else 
152
                  return jresult; 
153
                  
154
  }
155

    
156

    
157
/******************************************************************************/  
158
//                                                                GetRasterXSize
159
/******************************************************************************/
160

    
161
  
162
  JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_JNIBase_getRasterXSizeNat
163
  (JNIEnv *env, jobject obj, jlong cPtr){
164
          
165
          int res=-1;
166
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
167
            
168
        dt = *(GDALDatasetH **)&cPtr;
169
          if(dt!=NULL)
170
                  res = GDALGetRasterXSize(dt);
171
  
172
                    
173
          return res;
174
                          
175
  }
176

    
177
  
178
/******************************************************************************/  
179
//                                                                GetRasterYSize
180
/******************************************************************************/  
181
  
182
  
183
  JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_JNIBase_getRasterYSizeNat
184
  (JNIEnv *env, jobject obj, jlong cPtr){
185
          
186
          int res=-1;
187
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
188
          
189
          dt = *(GDALDatasetH **)&cPtr;
190
          if(dt!=NULL)
191
                  res = GDALGetRasterYSize(dt);
192
  
193
                    
194
          return res;
195
          
196
  }
197

    
198
/******************************************************************************/   
199
//                                                                GetRasterCount
200
/******************************************************************************/
201
 
202
 
203
 JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_JNIBase_getRasterCountNat
204
  (JNIEnv *env, jobject obj, jlong cPtr){
205
          
206
          int res=-1;
207
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
208
          
209
          dt = *(GDALDatasetH **)&cPtr;
210
          if(dt!=NULL)
211
                  res = GDALGetRasterCount(dt);
212
  
213
                    
214
          return res;
215
  }
216
  
217
  
218
/******************************************************************************/ 
219
//                                                                 GetMetadata
220
/******************************************************************************/
221

    
222

    
223
JNIEXPORT jobjectArray JNICALL Java_es_gva_cit_jgdal_Gdal_getMetadataNat
224
  (JNIEnv *env, jobject obj, jlong cPtr, jstring pszDomain){
225
          
226
           char                        **papszMetadata = NULL;
227
           GDALDatasetH         *dt  = (GDALDatasetH *) 0 ;
228
           int                         i = 0;
229
           int                        nmetadatos = 0;
230
           jclass                 class_string;
231
           jobjectArray         vector_str;
232
                       
233
           dt = *(GDALDatasetH **)&cPtr;
234
                               
235
           if(dt != NULL){
236
                      //Obtenemos los metadatos sobre papszMetadata
237
                 papszMetadata = GDALGetMetadata( dt, NULL );
238
                 
239
                 //Si hay metadatos devolvemos creamos el vector de String de java y los devolvemos
240
                 
241
                 nmetadatos = CSLCount(papszMetadata);
242
             if( nmetadatos > 0 ){
243
                class_string = (*env)->FindClass (env, "java/lang/String");
244
                         vector_str = (*env)->NewObjectArray(env, nmetadatos, class_string, (*env)->NewStringUTF(env,""));
245
                         
246
                         //Cargamos los metadatos
247
                         
248
                for( i = 0; papszMetadata[i] != NULL; i++ )
249
                        (*env)->SetObjectArrayElement(env,vector_str,i,(*env)->NewStringUTF(env,papszMetadata[i]));
250
                                               
251
                           return vector_str;            
252
              }
253
           }
254
     
255
           return NULL;
256
  }
257

    
258

    
259

    
260

    
261

    
262
/******************************************************************************/   
263
//                                                                GetRasterBand  
264
/******************************************************************************/
265

    
266

    
267
  JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_Gdal_getRasterBandNat
268
  (JNIEnv *env, jobject obj, jlong cPtr, jint hBand){
269
          
270
                         
271
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
272
          GDALRasterBandH *rasterband=NULL;
273
          jlong jresult = 0;
274

    
275
        dt = *(GDALDatasetH **)&cPtr;
276
    
277
    if(dt!=NULL){
278
                rasterband = GDALGetRasterBand(dt,(int)hBand);
279
                *(GDALDatasetH **)&jresult = rasterband;
280
    }else return -1;
281
    
282
   return jresult;
283
    
284
  }
285
  
286

    
287
/******************************************************************************/
288
//                                                                GetGeoTransform
289
/******************************************************************************/
290

    
291

    
292
JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_Gdal_getGeoTransformNat
293
  (JNIEnv *env, jobject obj, jlong cPtr, jobject gt){
294
          
295
          jclass class_geotransform;
296
          jfieldID id_campo;
297
          double adfgt[6];
298
          jdoubleArray doublearray;
299
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
300
          
301

    
302
        dt = *(GDALDatasetH **)&cPtr;
303
                  
304
          if(dt!=NULL){
305
                          
306
          //Obtenemos el objeto java que contendr? el vector geotransform
307
                
308
                          
309
                  class_geotransform = (*env)->GetObjectClass(env, gt);
310
                  id_campo = (*env)->GetFieldID(env, class_geotransform, "adfgeotransform", "[D");
311

    
312

    
313
           //Cargamos el buffer llamando a GDALRasterIO
314
                                   
315
                  
316
                  if(GDALGetGeoTransform(dt,adfgt)==CE_None){
317
                          doublearray = (*env)->NewDoubleArray(env,6);
318
                    if(doublearray!=NULL){
319
                                  (*env)->SetDoubleArrayRegion(env, doublearray, 0, 6,(jdouble *)adfgt); 
320
                                  (*env)->SetObjectField(env, gt, id_campo, doublearray);
321
                        }
322
                  }else return -1;                
323
                        
324
          }else return -1;
325
          
326
          return 0;
327
                                    
328
  }
329
  
330
/******************************************************************************/
331
//                                                                setGeoTransformNat
332
/******************************************************************************/
333

    
334
JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_Gdal_setGeoTransformNat
335
  (JNIEnv *env, jobject obj, jlong cPtr, jobject gt){
336
          
337
          jclass class_geotransform;
338
          jfieldID id_campo;
339
          double adfgt[6];
340
          jdoubleArray doublearray;
341
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
342
          
343
          dt = *(GDALDatasetH **)&cPtr;
344
          
345
          if(dt!=NULL){
346
                  
347
                  //Obtenemos los valores pasados en el vector gt
348
                  
349
                  class_geotransform = (*env)->GetObjectClass(env, gt);
350
                  id_campo = (*env)->GetFieldID(env, class_geotransform, "adfgeotransform", "[D");
351
                  doublearray =(jdoubleArray)(*env)->GetObjectField(env, gt, id_campo);
352
                  (*env)->GetDoubleArrayRegion(env,doublearray,0,6,(jdouble *)adfgt);
353
                  
354
                  GDALSetGeoTransform( dt, adfgt );
355
                  return 0;
356
          }
357
          return -1;
358
          
359
  }  
360
  
361
/******************************************************************************/
362
//                                                                GetProjectionRef
363
/******************************************************************************/
364

    
365

    
366
JNIEXPORT jstring JNICALL Java_es_gva_cit_jgdal_Gdal_getProjectionRefNat
367
  (JNIEnv *env, jobject obj, jlong cPtr){
368
          
369
        char *pszProjection=NULL;
370
          jstring pszP=NULL;
371
        GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
372
          
373
                  
374
          dt = *(GDALDatasetH **)&cPtr;
375
                  
376
          //Llamamos a la funci?n y cargamos el jstring con el resultado         
377
                  
378
        if(dt!=NULL){          
379
                   pszProjection = (char *) GDALGetProjectionRef(dt);
380
                   if(pszProjection!=NULL)
381
                           pszP = (*env)->NewStringUTF(env, pszProjection); 
382
        }
383
           
384
           return pszP;
385
          
386
  }
387
  
388
/************************************************************************/
389
/*                        getDriverShortNameNat()                       */
390
/************************************************************************/
391

    
392
JNIEXPORT jstring JNICALL Java_es_gva_cit_jgdal_Gdal_getDriverShortNameNat
393
  (JNIEnv *env, jobject obj, jlong cPtr){
394
          
395
          char                         *pszShortName=NULL;
396
          jstring                 pszSN=NULL;
397
        GDALDatasetH         *dt  = (GDALDatasetH *) 0 ;
398
        GDALDriverH                hDriver;
399
        
400
        dt = *(GDALDatasetH **)&cPtr;
401
        
402
        //Llamamos a la funci?n y cargamos el jstring con el resultado         
403
                  
404
        if(dt!=NULL){          
405
                hDriver = GDALGetDatasetDriver( dt );
406
                   pszShortName = (char *) GDALGetDriverShortName(hDriver);
407
                   if(pszShortName!=NULL)
408
                           pszSN = (*env)->NewStringUTF(env, pszShortName); 
409
        }
410
           
411
           return pszSN;
412
  }
413
  
414
/******************************************************************************/  
415
//                                                                setProjection
416
/******************************************************************************/  
417
  
418
JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_Gdal_setProjectionNat
419
  (JNIEnv *env, jobject obj, jlong cPtr, jstring proj){
420
          
421
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
422
          
423
          dt = *(GDALDatasetH **)&cPtr;
424
          if(dt!=NULL){
425
                  const char *projeccion = (*env)->GetStringUTFChars(env, proj, 0);
426
                  GDALSetProjection( dt, projeccion );
427
                  (*env)->ReleaseStringUTFChars(env, proj, projeccion);
428
                  return 1;
429
          }
430
          
431
          return -1;
432
  }
433
  
434
  
435
/******************************************************************************/  
436
//                                                                        Close
437
/******************************************************************************/
438

    
439

    
440
JNIEXPORT void JNICALL Java_es_gva_cit_jgdal_Gdal_closeNat
441
  (JNIEnv *env, jobject obj, jlong cPtr){
442

    
443
        GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
444
          
445
          dt = *(GDALDatasetH **)&cPtr;
446
        GDALClose(dt);        
447

    
448
  }
449
  
450

    
451
/************************************************************************/
452
/*                        GDALGetDriverByName()                         */
453
/************************************************************************/
454

    
455
JNIEXPORT jlong JNICALL Java_es_gva_cit_jgdal_Gdal_getDriverByNameNat
456
  (JNIEnv *env, jclass clase, jstring name){
457
          
458
          const char *namedrv;
459
          GDALDriverH *drv;
460
 
461
          jlong jresult=-1;
462
  
463
    if(GDALGetDriverCount()<=0)GDALAllRegister();
464
            
465
          namedrv = (*env)->GetStringUTFChars(env, name, 0);
466
          
467
          drv=GDALGetDriverByName(namedrv);  
468
                  
469
          *(GDALDriverH **)&jresult = drv;
470

    
471
          (*env)->ReleaseStringUTFChars(env, name, namedrv);
472
         
473
           return (long)jresult;
474
  }
475
  
476

    
477
/************************************************************************/
478
/*                        getGCPCountNat()                              */
479
/************************************************************************/
480

    
481
 JNIEXPORT jint JNICALL Java_es_gva_cit_jgdal_JNIBase_getGCPCountNat
482
  (JNIEnv *env, jobject obj, jlong cPtr){
483
          
484
          int res=-1;
485
          GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
486
          
487
          dt = *(GDALDatasetH **)&cPtr;
488
          if(dt!=NULL)
489
                  res = GDALGetGCPCount(dt);
490
  
491
                    
492
          return res;
493
  }
494
 
495
 /******************************************************************************/ 
496
//                                                        GetColorInterpretationName
497
/******************************************************************************/
498

    
499
JNIEXPORT jstring JNICALL Java_es_gva_cit_jgdal_Gdal_getColorInterpretationNameNat
500
  (JNIEnv *env, jobject obj, jlong cPtr, jint ci){
501
           GDALDatasetH                 *dt  = (GDALDatasetH *) 0 ;
502
            char                                 *name = NULL;
503
            jstring                         typeName = NULL;
504
         
505
         dt = *(GDALDatasetH **)&cPtr;
506
         name = GDALGetColorInterpretationName(ci);           
507
         typeName = (*env)->NewStringUTF(env, name); 
508
         return typeName;
509
  }
510
  
511