Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libjni-gdal / src / main / native / jgdal / gdal_interfaz.c @ 19201

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 "gdal.h"
56
#include "cpl_string.h"
57
#include "signal.h"
58

    
59

    
60

    
61
/******************************************************************************/
62
//                                                                Open
63
/******************************************************************************/
64

    
65

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

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

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

    
154

    
155
/******************************************************************************/  
156
//                                                                GetRasterXSize
157
/******************************************************************************/
158

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

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

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

    
220

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

    
256

    
257

    
258

    
259

    
260
/******************************************************************************/   
261
//                                                                GetRasterBand  
262
/******************************************************************************/
263

    
264

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

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

    
285
/******************************************************************************/
286
//                                                                GetGeoTransform
287
/******************************************************************************/
288

    
289

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

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

    
310

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

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

    
363

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

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

    
437

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

    
441
        GDALDatasetH *dt  = (GDALDatasetH *) 0 ;
442
          
443
          dt = *(GDALDatasetH **)&cPtr;
444
        GDALClose(dt);        
445

    
446
  }
447
  
448

    
449
/************************************************************************/
450
/*                        GDALGetDriverByName()                         */
451
/************************************************************************/
452

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

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

    
475
/************************************************************************/
476
/*                        getGCPCountNat()                              */
477
/************************************************************************/
478

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

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