svn-gvsig-desktop / tags / gvSIGv0_6_1RELEASE / libraries / libjni-gdal / src / es / gva / cit / jgdal / Gdal.java @ 5222
History | View | Annotate | Download (10.5 KB)
1 | 789 | igbrotru | /**********************************************************************
|
---|---|---|---|
2 | * $Id$
|
||
3 | *
|
||
4 | * Name: Gdal.java
|
||
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 | 2210 | igbrotru | /* 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 | 3540 | nacho | *
|
50 | * [01] 01-Oct-2005 nbt New call to JNI function openArrayNat to convert name string to char array.
|
||
51 | 2210 | igbrotru | */
|
52 | 789 | igbrotru | |
53 | package es.gva.cit.jgdal; |
||
54 | |||
55 | |||
56 | import java.io.*; |
||
57 | import java.util.Date; |
||
58 | |||
59 | //import es.gva.cit.jgdal.GdalException;
|
||
60 | |||
61 | /**
|
||
62 | * Contiene las funcionalidades necesarias para el acceso a los
|
||
63 | * elementos de un dataset de gdal correspondiente a una im?gen
|
||
64 | *
|
||
65 | * @author Nacho Brodin <brodin_ign@gva.es>.<BR> Equipo de desarrollo gvSIG.<BR> http://www.gvsig.gva.es
|
||
66 | * @version 0.0
|
||
67 | * @link http://www.gvsig.gva.es
|
||
68 | */
|
||
69 | |||
70 | public class Gdal extends JNIBase{ |
||
71 | |||
72 | |||
73 | //CONSTANTES
|
||
74 | |||
75 | //GDALAccess
|
||
76 | public static int GA_ReadOnly=0; |
||
77 | public static int GA_Update=1; |
||
78 | |||
79 | //GDALDataType
|
||
80 | public static int GDT_Unknown = 0; |
||
81 | 826 | igbrotru | public static int GDT_Byte = 1; //Buffer byte (8) |
82 | public static int GDT_UInt16 = 2; //Buffer short (16) |
||
83 | public static int GDT_Int16 = 3; //Buffer short (16) |
||
84 | public static int GDT_UInt32 = 4; //Buffer int (32) |
||
85 | public static int GDT_Int32 = 5; //Buffer int (32) |
||
86 | public static int GDT_Float32 = 6; //Buffer float (32) |
||
87 | public static int GDT_Float64 = 7; //Buffer double (64) |
||
88 | public static int GDT_CInt16 = 8; //Buffer short (16) |
||
89 | public static int GDT_CInt32 = 9; //Buffer int (32) |
||
90 | public static int GDT_CFloat32 = 10; //Buffer float (32) |
||
91 | public static int GDT_CFloat64 = 11; //Buffer double (64) |
||
92 | 789 | igbrotru | public static int GDT_TypeCount = 12; |
93 | |||
94 | |||
95 | private String pszFilename = ""; |
||
96 | |||
97 | |||
98 | private native long openNat(String pszFilename, int access); |
||
99 | 3540 | nacho | private native long openArrayNat(byte[] pszFilename, int access); |
100 | 789 | igbrotru | private native int getGeoTransformNat(long cPtr,GeoTransform adfgeotransform); |
101 | private native int setGeoTransformNat(long cPtr,GeoTransform adfgeotransform); |
||
102 | private native String[] getMetadataNat(long cPtr,String pszDomain); |
||
103 | private native String getProjectionRefNat(long cPtr); |
||
104 | private native void closeNat(long cPtr); |
||
105 | private native int getRasterBandNat(long cPtr,int hBand); |
||
106 | private native int setProjectionNat(long cPtr, String proj); |
||
107 | 3994 | nacho | private native String getDriverShortNameNat(long cPtr); |
108 | 789 | igbrotru | |
109 | //private static native long getGDALDriverManagerNat();
|
||
110 | private static native long getDriverByNameNat(String name); |
||
111 | |||
112 | 3994 | nacho | |
113 | |||
114 | 789 | igbrotru | /**
|
115 | *Constructor a partir de la direcci?n de memoria
|
||
116 | */
|
||
117 | |||
118 | public Gdal(long cPtr){ |
||
119 | this.cPtr=cPtr;
|
||
120 | } |
||
121 | |||
122 | 817 | igbrotru | /**
|
123 | *Constructor generico
|
||
124 | */
|
||
125 | |||
126 | 789 | igbrotru | public Gdal(){}
|
127 | 817 | igbrotru | |
128 | 789 | igbrotru | /**
|
129 | 817 | igbrotru | * Devuelve la direcci?n de memoria del objeto dataset en C.
|
130 | 789 | igbrotru | */
|
131 | |||
132 | public long getPtro(){return cPtr;} |
||
133 | |||
134 | /**
|
||
135 | * Abre el fichero de im?gen.
|
||
136 | *
|
||
137 | * @param pszFilename Nombre del fichero.
|
||
138 | * @param access Apertura en solo lectura o escritura.
|
||
139 | * @throws GdalException
|
||
140 | */
|
||
141 | |||
142 | public void open(String pszFilename, int access)throws GdalException, IOException{ |
||
143 | |||
144 | File f = new File( pszFilename ); |
||
145 | if(!f.exists())
|
||
146 | throw new IOException("El archivo "+pszFilename+" no existe"); |
||
147 | |||
148 | if(!f.canRead())
|
||
149 | throw new IOException("El archivo no puede leerse"); |
||
150 | |||
151 | 3540 | nacho | cPtr=openArrayNat(pszFilename.getBytes(), access); |
152 | //cPtr=openNat(pszFilename, access);
|
||
153 | 789 | igbrotru | |
154 | if(cPtr<=0) |
||
155 | throw new GdalException("Error en Open de GDAL"); |
||
156 | |||
157 | } |
||
158 | |||
159 | |||
160 | /**
|
||
161 | * Obtiene un array de Strings con los metadatos
|
||
162 | *
|
||
163 | * @throws GdalException
|
||
164 | * @return Array de Strings que corresponden a los metadatos que ofrece la im?gen
|
||
165 | */
|
||
166 | |||
167 | public String[] getMetadata()throws GdalException{ |
||
168 | |||
169 | |||
170 | if(cPtr <= 0) |
||
171 | throw new GdalException("Error en GDALGetMetadata(). La llamada GDALOpen no tuvo exito"); |
||
172 | String[] res = getMetadataNat(cPtr,null); |
||
173 | if(res == null) |
||
174 | return new String[0]; |
||
175 | else return res; |
||
176 | |||
177 | } |
||
178 | |||
179 | /**
|
||
180 | * Obtiene el n?mero de bandas de la im?gen
|
||
181 | *
|
||
182 | * @throws GdalException
|
||
183 | * @param hBand Entero que corresponde al n?mero de banda que se quiere recuperar
|
||
184 | * @return Objeto GdalRasterBand que representa la banda recuperada
|
||
185 | */
|
||
186 | |||
187 | public GdalRasterBand getRasterBand(int hBand)throws GdalException{ |
||
188 | |||
189 | long cPtr_rb;
|
||
190 | |||
191 | if(cPtr <= 0) |
||
192 | throw new GdalException("Error en GDALGetRasterBand(). La llamada GDALOpen no tuvo exito"); |
||
193 | |||
194 | cPtr_rb = getRasterBandNat(cPtr,hBand); |
||
195 | |||
196 | if(cPtr_rb < 0) |
||
197 | throw new GdalException("Error en GetRasterBand(). No ha podido obtenerse una banda"); |
||
198 | else return new GdalRasterBand(cPtr_rb); |
||
199 | |||
200 | } |
||
201 | |||
202 | |||
203 | |||
204 | /**
|
||
205 | * Obtiene la dimensi?n del raster en el eje X.
|
||
206 | *
|
||
207 | * @return Devuelve un entero con la longitud de la im?gen en el eje X en pixels.
|
||
208 | * @throws GdalException
|
||
209 | */
|
||
210 | |||
211 | public int getRasterXSize()throws GdalException{ |
||
212 | |||
213 | String msg1="Error en GDALGetRasterXSize. La llamada GDALOpen no tuvo ?xito"; |
||
214 | String msg2="Error en tama?o X"; |
||
215 | return baseSimpleFunctions(5,msg1,msg2); |
||
216 | |||
217 | } |
||
218 | |||
219 | |||
220 | /**
|
||
221 | * Obtiene la dimensi?n del raster en el eje Y.
|
||
222 | *
|
||
223 | * @return Devuelve un entero con la longitud de la im?gen en el eje Y en pixels.
|
||
224 | * @throws GdalException
|
||
225 | */
|
||
226 | |||
227 | public int getRasterYSize()throws GdalException{ |
||
228 | |||
229 | String msg1="Error en GDALGetRasterYSize. La llamada GDALOpen no tuvo ?xito"; |
||
230 | String msg2="Error en tama?o Y"; |
||
231 | return baseSimpleFunctions(6,msg1,msg2); |
||
232 | |||
233 | } |
||
234 | |||
235 | |||
236 | /**
|
||
237 | * Obtiene el n?mero de bandas de la im?gen
|
||
238 | *
|
||
239 | * @return Devuelve un entero con el n?mero de bandas que contiene la im?gen.
|
||
240 | * @throws GdalException
|
||
241 | */
|
||
242 | |||
243 | public int getRasterCount()throws GdalException{ |
||
244 | |||
245 | String msg1="Error en GDALGetRasterCount. . La llamada GDALOpen no tuvo ?xito"; |
||
246 | String msg2="Error en el conteo de n?mero de bandas"; |
||
247 | return baseSimpleFunctions(7,msg1,msg2); |
||
248 | |||
249 | } |
||
250 | |||
251 | |||
252 | /**
|
||
253 | * Obtiene el vector geoTransform de la im?gen que contiene los valores Origen y pixelSize
|
||
254 | *
|
||
255 | * @return Devuelve un vector de doubles que contiene los valores de coordenadas de origen y pixelSize.
|
||
256 | * @throws GdalException
|
||
257 | */
|
||
258 | |||
259 | public GeoTransform getGeoTransform()throws GdalException{ |
||
260 | |||
261 | |||
262 | if(cPtr <= 0) |
||
263 | throw new GdalException("Error en getGeoTransform(). La llamada Open no tuvo exito"); |
||
264 | |||
265 | GeoTransform gt=new GeoTransform();
|
||
266 | |||
267 | if(getGeoTransformNat(cPtr,gt)<0) |
||
268 | throw new GdalException("Error en getGeoTransform(). No se han obtenido valores para geoTransform."); |
||
269 | else{
|
||
270 | |||
271 | return gt;
|
||
272 | } |
||
273 | } |
||
274 | |||
275 | /**
|
||
276 | 3994 | nacho | * Obtiene el Nombre corto asociado al driver del dataset
|
277 | *
|
||
278 | * @return Cadena con el nombre del driver
|
||
279 | * @throws GdalException
|
||
280 | */
|
||
281 | |||
282 | public String getDriverShortName()throws GdalException{ |
||
283 | |||
284 | |||
285 | if(cPtr <= 0) |
||
286 | throw new GdalException("Error en getDriverShortName(). La llamada Open no tuvo exito"); |
||
287 | String shortName = getDriverShortNameNat(cPtr);
|
||
288 | |||
289 | if(shortName == null) |
||
290 | throw new GdalException("Error en getDriverShortName(). No ha podido obtenerse el driver"); |
||
291 | else
|
||
292 | return shortName;
|
||
293 | |||
294 | } |
||
295 | |||
296 | /**
|
||
297 | 789 | igbrotru | * A?ade el vector geoTransform a la im?gen que contiene los valores Origen y pixelSize
|
298 | *
|
||
299 | * @return Devuelve un vector de doubles que contiene los valores de coordenadas de origen y pixelSize.
|
||
300 | * @throws GdalException
|
||
301 | */
|
||
302 | |||
303 | public void setGeoTransform(GeoTransform gt)throws GdalException{ |
||
304 | |||
305 | |||
306 | if(cPtr <= 0) |
||
307 | throw new GdalException("Error en setGeoTransform(). La llamada Open no tuvo exito"); |
||
308 | |||
309 | int res = setGeoTransformNat(cPtr,gt);
|
||
310 | |||
311 | if(res<0) |
||
312 | throw new GdalException("Error en getGeoTransform(). No se ha podido a?adir valores para geoTransform. Es posible que el formato no lo soporte."); |
||
313 | |||
314 | } |
||
315 | |||
316 | /**
|
||
317 | * Obtiene el sistema de coordenadas de referencia de la im?gen.
|
||
318 | *
|
||
319 | * @return Devuelve un String con los datos del sistema de coordenadas de referencia.
|
||
320 | * @throws GdalException
|
||
321 | */
|
||
322 | |||
323 | public String getProjectionRef()throws GdalException{ |
||
324 | |||
325 | if(cPtr <= 0) |
||
326 | throw new GdalException("Error en getGetProjectionRef(). La llamada Open no tuvo exito"); |
||
327 | |||
328 | |||
329 | String res = getProjectionRefNat(cPtr);
|
||
330 | |||
331 | if(res == null)return new String(""); |
||
332 | else return res; |
||
333 | |||
334 | } |
||
335 | |||
336 | /**
|
||
337 | * Cierra el fichero de im?gen.
|
||
338 | *
|
||
339 | * @throws GdalException
|
||
340 | */
|
||
341 | |||
342 | public void close()throws GdalException{ |
||
343 | |||
344 | if(cPtr <= 0) |
||
345 | throw new GdalException("Error en Close(). La llamada Open no tuvo exito"); |
||
346 | closeNat(cPtr); |
||
347 | |||
348 | } |
||
349 | |||
350 | /**
|
||
351 | * Obtiene un driver a trav?s de su nombre
|
||
352 | *
|
||
353 | * @param name Nombre del driver
|
||
354 | */
|
||
355 | |||
356 | public static GdalDriver getDriverByName(String name)throws GdalException{ |
||
357 | |||
358 | long ptrdrv=-1; |
||
359 | |||
360 | ptrdrv=getDriverByNameNat(name); |
||
361 | //System.out.println("ptrdrv="+ptrdrv);
|
||
362 | if(ptrdrv > 0) |
||
363 | return (new GdalDriver(ptrdrv)); |
||
364 | else
|
||
365 | throw new GdalException("Error en getDriverByName(). No se ha podido obtener el driver."); |
||
366 | |||
367 | } |
||
368 | |||
369 | |||
370 | /**
|
||
371 | * Obtiene el n?mero de bandas de la im?gen
|
||
372 | *
|
||
373 | * @return Devuelve un entero con el n?mero de bandas que contiene la im?gen.
|
||
374 | * @throws GdalException
|
||
375 | */
|
||
376 | |||
377 | public int getGCPCount()throws GdalException{ |
||
378 | |||
379 | String msg1="Error en GDALGetRasterCount. . La llamada GDALOpen no tuvo ?xito"; |
||
380 | String msg2="Error en el conteo de n?mero de bandas"; |
||
381 | return baseSimpleFunctions(8,msg1,msg2); |
||
382 | |||
383 | } |
||
384 | |||
385 | 817 | igbrotru | /**
|
386 | *Asigna la proyecci?n especificada en la cadena que se le pasa por par?metro.
|
||
387 | *@param proj proyecci?n
|
||
388 | *@throws GdalException
|
||
389 | */
|
||
390 | |||
391 | 789 | igbrotru | public void setProjection(String proj)throws GdalException{ |
392 | |||
393 | if(cPtr <= 0) |
||
394 | throw new GdalException("Error en setProjection(). La llamada Open no tuvo exito"); |
||
395 | |||
396 | int res = setProjectionNat(cPtr, proj);
|
||
397 | |||
398 | if(res<0) |
||
399 | throw new GdalException("Error en setProjection(). No se ha podido asignar la proyecci?n."); |
||
400 | } |
||
401 | |||
402 | } |