1 : /******************************************************************************
2 : * $Id: hdf5imagedataset.cpp 18176 2009-12-05 00:13:26Z rouault $
3 : *
4 : * Project: Hierarchical Data Format Release 5 (HDF5)
5 : * Purpose: Read subdatasets of HDF5 file.
6 : * Author: Denis Nadeau <denis.nadeau@gmail.com>
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 2005, Frank Warmerdam <warmerdam@pobox.com>
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #define H5_USE_16_API
31 :
32 : #include "hdf5.h"
33 :
34 : #include "gdal_pam.h"
35 : #include "gdal_priv.h"
36 : #include "cpl_string.h"
37 : #include "hdf5dataset.h"
38 : #include "ogr_spatialref.h"
39 :
40 : CPL_CVSID("$Id: hdf5imagedataset.cpp 18176 2009-12-05 00:13:26Z rouault $");
41 :
42 : CPL_C_START
43 : void GDALRegister_HDF5Image(void);
44 : CPL_C_END
45 :
46 : /* release 1.6.3 or 1.6.4 changed the type of count in some api functions */
47 :
48 : #if H5_VERS_MAJOR == 1 && H5_VERS_MINOR <= 6 \
49 : && (H5_VERS_MINOR < 6 || H5_VERS_RELEASE < 3)
50 : # define H5OFFSET_TYPE hssize_t
51 : #else
52 : # define H5OFFSET_TYPE hsize_t
53 : #endif
54 :
55 : class HDF5ImageDataset : public HDF5Dataset
56 : {
57 :
58 : friend class HDF5ImageRasterBand;
59 :
60 : char *pszProjection;
61 : char *pszGCPProjection;
62 : GDAL_GCP *pasGCPList;
63 : int nGCPCount;
64 : OGRSpatialReference oSRS;
65 :
66 : hsize_t *dims,*maxdims;
67 : HDF5GroupObjects *poH5Objects;
68 : int ndims,dimensions;
69 : hid_t dataset_id;
70 : hid_t dataspace_id;
71 : hsize_t size;
72 : int address;
73 : hid_t datatype;
74 : hid_t native;
75 : H5T_class_t clas;
76 :
77 : public:
78 : HDF5ImageDataset();
79 : ~HDF5ImageDataset();
80 :
81 : CPLErr CreateProjections( );
82 : static GDALDataset *Open( GDALOpenInfo * );
83 : static int Identify( GDALOpenInfo * );
84 :
85 : const char *GetProjectionRef();
86 : virtual int GetGCPCount( );
87 : virtual const char *GetGCPProjection();
88 : virtual const GDAL_GCP *GetGCPs( );
89 :
90 : };
91 :
92 : /************************************************************************/
93 : /* ==================================================================== */
94 : /* HDF5ImageDataset */
95 : /* ==================================================================== */
96 : /************************************************************************/
97 :
98 : /************************************************************************/
99 : /* HDF5ImageDataset() */
100 : /************************************************************************/
101 9 : HDF5ImageDataset::HDF5ImageDataset()
102 : {
103 9 : nGCPCount = 0;
104 9 : pszProjection = NULL;
105 9 : pszGCPProjection= NULL;
106 9 : pasGCPList = NULL;
107 9 : poH5Objects = NULL;
108 9 : poH5RootGroup = NULL;
109 9 : dims = NULL;
110 9 : maxdims = NULL;
111 9 : papszMetadata = NULL;
112 9 : }
113 :
114 : /************************************************************************/
115 : /* ~HDF5ImageDataset() */
116 : /************************************************************************/
117 18 : HDF5ImageDataset::~HDF5ImageDataset( )
118 : {
119 9 : FlushCache();
120 :
121 9 : CPLFree(pszProjection);
122 9 : CPLFree(pszGCPProjection);
123 :
124 9 : if( dims )
125 9 : CPLFree( dims );
126 :
127 9 : if( maxdims )
128 9 : CPLFree( maxdims );
129 :
130 9 : if( nGCPCount > 0 )
131 : {
132 0 : for( int i = 0; i < nGCPCount; i++ )
133 : {
134 0 : if( pasGCPList[i].pszId )
135 0 : CPLFree( pasGCPList[i].pszId );
136 0 : if( pasGCPList[i].pszInfo )
137 0 : CPLFree( pasGCPList[i].pszInfo );
138 : }
139 :
140 0 : CPLFree( pasGCPList );
141 : }
142 18 : }
143 :
144 : /************************************************************************/
145 : /* ==================================================================== */
146 : /* Hdf5imagerasterband */
147 : /* ==================================================================== */
148 : /************************************************************************/
149 : class HDF5ImageRasterBand : public GDALPamRasterBand
150 : {
151 : friend class HDF5ImageDataset;
152 :
153 : int bNoDataSet;
154 : double dfNoDataValue;
155 : char *pszFilename;
156 :
157 : public:
158 :
159 : HDF5ImageRasterBand( HDF5ImageDataset *, int, GDALDataType );
160 : ~HDF5ImageRasterBand();
161 :
162 : virtual CPLErr IReadBlock( int, int, void * );
163 : virtual double GetNoDataValue( int * );
164 : virtual CPLErr SetNoDataValue( double );
165 : /* virtual CPLErr IWriteBlock( int, int, void * ); */
166 : };
167 :
168 : /************************************************************************/
169 : /* ~HDF5ImageRasterBand() */
170 : /************************************************************************/
171 :
172 18 : HDF5ImageRasterBand::~HDF5ImageRasterBand()
173 : {
174 :
175 18 : }
176 : /************************************************************************/
177 : /* HDF5ImageRasterBand() */
178 : /************************************************************************/
179 9 : HDF5ImageRasterBand::HDF5ImageRasterBand( HDF5ImageDataset *poDS, int nBand,
180 9 : GDALDataType eType )
181 :
182 : {
183 : char **papszMetaGlobal;
184 9 : this->poDS = poDS;
185 9 : this->nBand = nBand;
186 9 : eDataType = eType;
187 9 : bNoDataSet = FALSE;
188 9 : dfNoDataValue = -9999;
189 9 : nBlockXSize = poDS->GetRasterXSize( );
190 9 : nBlockYSize = 1;
191 :
192 : /* -------------------------------------------------------------------- */
193 : /* Take a copy of Global Metadata since I can't pass Raster */
194 : /* variable to Iterate function. */
195 : /* -------------------------------------------------------------------- */
196 9 : papszMetaGlobal = CSLDuplicate( poDS->papszMetadata );
197 9 : CSLDestroy( poDS->papszMetadata );
198 9 : poDS->papszMetadata = NULL;
199 :
200 9 : if( poDS->poH5Objects->nType == H5G_DATASET ) {
201 9 : poDS->CreateMetadata( poDS->poH5Objects, H5G_DATASET );
202 : }
203 :
204 : /* -------------------------------------------------------------------- */
205 : /* Recover Global Metadat and set Band Metadata */
206 : /* -------------------------------------------------------------------- */
207 :
208 9 : SetMetadata( poDS->papszMetadata );
209 :
210 9 : CSLDestroy( poDS->papszMetadata );
211 9 : poDS->papszMetadata = CSLDuplicate( papszMetaGlobal );
212 9 : CSLDestroy( papszMetaGlobal );
213 :
214 : /* check for chunksize and set it as the blocksize (optimizes read) */
215 9 : hid_t listid = H5Dget_create_plist(((HDF5ImageDataset * )poDS)->dataset_id);
216 9 : if (listid>0)
217 : {
218 9 : if(H5Pget_layout(listid) == H5D_CHUNKED)
219 : {
220 : hsize_t panChunkDims[3];
221 0 : int nDimSize = H5Pget_chunk(listid, 3, panChunkDims);
222 0 : nBlockXSize = panChunkDims[nDimSize-1];
223 0 : nBlockYSize = panChunkDims[nDimSize-2];
224 : }
225 9 : H5Pclose(listid);
226 : }
227 :
228 9 : }
229 :
230 : /************************************************************************/
231 : /* GetNoDataValue() */
232 : /************************************************************************/
233 2 : double HDF5ImageRasterBand::GetNoDataValue( int * pbSuccess )
234 :
235 : {
236 2 : if( bNoDataSet )
237 : {
238 0 : if( pbSuccess )
239 0 : *pbSuccess = bNoDataSet;
240 :
241 0 : return dfNoDataValue;
242 : }
243 : else
244 2 : return GDALPamRasterBand::GetNoDataValue( pbSuccess );
245 : }
246 :
247 : /************************************************************************/
248 : /* SetNoDataValue() */
249 : /************************************************************************/
250 0 : CPLErr HDF5ImageRasterBand::SetNoDataValue( double dfNoData )
251 :
252 : {
253 0 : bNoDataSet = TRUE;
254 0 : dfNoDataValue = dfNoData;
255 :
256 0 : return CE_None;
257 : }
258 :
259 : /************************************************************************/
260 : /* IReadBlock() */
261 : /************************************************************************/
262 919 : CPLErr HDF5ImageRasterBand::IReadBlock( int nBlockXOff, int nBlockYOff,
263 : void * pImage )
264 : {
265 : herr_t status;
266 : hsize_t count[3];
267 : H5OFFSET_TYPE offset[3];
268 : int nSizeOfData;
269 : hid_t memspace;
270 : hsize_t col_dims[3];
271 : hsize_t rank;
272 :
273 919 : HDF5ImageDataset *poGDS = ( HDF5ImageDataset * ) poDS;
274 :
275 919 : if( poGDS->eAccess == GA_Update ) {
276 : memset( pImage, 0,
277 : nBlockXSize * nBlockYSize *
278 0 : GDALGetDataTypeSize( eDataType )/8 );
279 0 : return CE_None;
280 : }
281 :
282 919 : rank=2;
283 :
284 919 : if( poGDS->ndims == 3 ){
285 0 : rank=3;
286 0 : offset[0] = nBand-1;
287 0 : count[0] = 1;
288 0 : col_dims[0] = 1;
289 : }
290 :
291 919 : offset[poGDS->ndims - 2] = nBlockYOff*nBlockYSize;
292 919 : offset[poGDS->ndims - 1] = nBlockXOff*nBlockXSize;
293 919 : count[poGDS->ndims - 2] = nBlockYSize;
294 919 : count[poGDS->ndims - 1] = nBlockXSize;
295 :
296 919 : nSizeOfData = H5Tget_size( poGDS->native );
297 919 : memset( pImage,0,nBlockXSize*nBlockYSize*nSizeOfData );
298 :
299 : /* blocksize may not be a multiple of imagesize */
300 1845 : count[poGDS->ndims - 2] = MIN( size_t(nBlockYSize),
301 : poDS->GetRasterYSize() -
302 1845 : offset[poGDS->ndims - 2]);
303 2757 : count[poGDS->ndims - 1] = MIN( size_t(nBlockXSize),
304 : poDS->GetRasterXSize()-
305 2757 : offset[poGDS->ndims - 1]);
306 :
307 : /* -------------------------------------------------------------------- */
308 : /* Select block from file space */
309 : /* -------------------------------------------------------------------- */
310 : status = H5Sselect_hyperslab( poGDS->dataspace_id,
311 : H5S_SELECT_SET,
312 : offset, NULL,
313 919 : count, NULL );
314 :
315 : /* -------------------------------------------------------------------- */
316 : /* Create memory space to receive the data */
317 : /* -------------------------------------------------------------------- */
318 919 : col_dims[poGDS->ndims-2]=nBlockYSize;
319 919 : col_dims[poGDS->ndims-1]=nBlockXSize;
320 919 : memspace = H5Screate_simple( rank, col_dims, NULL );
321 919 : H5OFFSET_TYPE mem_offset[3] = {0, 0, 0};
322 : status = H5Sselect_hyperslab(memspace,
323 : H5S_SELECT_SET,
324 : mem_offset, NULL,
325 919 : count, NULL);
326 :
327 : status = H5Dread ( poGDS->dataset_id,
328 : poGDS->native,
329 : memspace,
330 : poGDS->dataspace_id,
331 : H5P_DEFAULT,
332 919 : pImage );
333 :
334 919 : return CE_None;
335 : }
336 :
337 : /************************************************************************/
338 : /* Identify() */
339 : /************************************************************************/
340 :
341 7727 : int HDF5ImageDataset::Identify( GDALOpenInfo *poOpenInfo )
342 :
343 : {
344 7727 : if(!EQUALN( poOpenInfo->pszFilename, "HDF5:", 5 ) )
345 7727 : return FALSE;
346 : else
347 0 : return TRUE;
348 : }
349 :
350 : /************************************************************************/
351 : /* Open() */
352 : /************************************************************************/
353 729 : GDALDataset *HDF5ImageDataset::Open( GDALOpenInfo * poOpenInfo )
354 : {
355 : int i;
356 : HDF5ImageDataset *poDS;
357 : char szFilename[2048];
358 :
359 729 : if(!EQUALN( poOpenInfo->pszFilename, "HDF5:", 5 ) ||
360 : strlen(poOpenInfo->pszFilename) > sizeof(szFilename) - 3 )
361 720 : return NULL;
362 :
363 : /* -------------------------------------------------------------------- */
364 : /* Confirm the requested access is supported. */
365 : /* -------------------------------------------------------------------- */
366 9 : if( poOpenInfo->eAccess == GA_Update )
367 : {
368 : CPLError( CE_Failure, CPLE_NotSupported,
369 : "The HDF5ImageDataset driver does not support update access to existing"
370 0 : " datasets.\n" );
371 0 : return NULL;
372 : }
373 :
374 9 : poDS = new HDF5ImageDataset();
375 :
376 : /* -------------------------------------------------------------------- */
377 : /* Create a corresponding GDALDataset. */
378 : /* -------------------------------------------------------------------- */
379 : /* printf("poOpenInfo->pszFilename %s\n",poOpenInfo->pszFilename); */
380 : char **papszName = CSLTokenizeString2( poOpenInfo->pszFilename,
381 9 : ":", CSLT_HONOURSTRINGS );
382 :
383 9 : if( !((CSLCount(papszName) == 3) || (CSLCount(papszName) == 4)) )
384 : {
385 0 : CSLDestroy(papszName);
386 0 : delete poDS;
387 0 : return NULL;
388 : }
389 :
390 9 : poDS->SetDescription( poOpenInfo->pszFilename );
391 :
392 : /* -------------------------------------------------------------------- */
393 : /* Check for drive name in windows HDF5:"D:\... */
394 : /* -------------------------------------------------------------------- */
395 9 : strcpy(szFilename, papszName[1]);
396 :
397 9 : if( strlen(papszName[1]) == 1 && papszName[3] != NULL )
398 : {
399 0 : strcat(szFilename, ":");
400 0 : strcat(szFilename, papszName[2]);
401 :
402 0 : poDS->SetSubdatasetName( papszName[3] );
403 : }
404 : else
405 9 : poDS->SetSubdatasetName( papszName[2] );
406 :
407 9 : CSLDestroy(papszName);
408 9 : papszName = NULL;
409 :
410 9 : if( !H5Fis_hdf5(szFilename) ) {
411 0 : delete poDS;
412 0 : return NULL;
413 : }
414 :
415 9 : poDS->SetPhysicalFilename( szFilename );
416 :
417 : /* -------------------------------------------------------------------- */
418 : /* Try opening the dataset. */
419 : /* -------------------------------------------------------------------- */
420 : poDS->hHDF5 = H5Fopen(szFilename,
421 : H5F_ACC_RDONLY,
422 9 : H5P_DEFAULT );
423 :
424 9 : if( poDS->hHDF5 < 0 ) {
425 0 : delete poDS;
426 0 : return NULL;
427 : }
428 :
429 9 : poDS->hGroupID = H5Gopen( poDS->hHDF5, "/" );
430 9 : if( poDS->hGroupID < 0 ){
431 0 : poDS->bIsHDFEOS=false;
432 0 : delete poDS;
433 0 : return NULL;
434 : }
435 :
436 : /* -------------------------------------------------------------------- */
437 : /* THIS IS AN HDF5 FILE */
438 : /* -------------------------------------------------------------------- */
439 9 : poDS->bIsHDFEOS=TRUE;
440 9 : poDS->ReadGlobalAttributes( FALSE );
441 :
442 : /* -------------------------------------------------------------------- */
443 : /* Create HDF5 Data Hierarchy in a link list */
444 : /* -------------------------------------------------------------------- */
445 : poDS->poH5Objects =
446 : poDS->HDF5FindDatasetObjectsbyPath( poDS->poH5RootGroup,
447 9 : (char *)poDS->GetSubdatasetName() );
448 :
449 9 : if( poDS->poH5Objects == NULL ) {
450 0 : return NULL;
451 : }
452 : /* -------------------------------------------------------------------- */
453 : /* Retrieve HDF5 data information */
454 : /* -------------------------------------------------------------------- */
455 9 : poDS->dataset_id = H5Dopen( poDS->hHDF5,poDS->poH5Objects->pszPath );
456 9 : poDS->dataspace_id = H5Dget_space( poDS->dataset_id );
457 9 : poDS->ndims = H5Sget_simple_extent_ndims( poDS->dataspace_id );
458 : poDS->dims = ( hsize_t * )CPLCalloc( poDS->ndims,
459 9 : sizeof( hsize_t ) );
460 : poDS->maxdims = ( hsize_t * )CPLCalloc( poDS->ndims,
461 9 : sizeof( hsize_t ) );
462 : poDS->dimensions = H5Sget_simple_extent_dims( poDS->dataspace_id,
463 : poDS->dims,
464 9 : poDS->maxdims );
465 9 : poDS->datatype = H5Dget_type( poDS->dataset_id );
466 9 : poDS->clas = H5Tget_class( poDS->datatype );
467 9 : poDS->size = H5Tget_size( poDS->datatype );
468 9 : poDS->address = H5Dget_offset( poDS->dataset_id );
469 9 : poDS->native = H5Tget_native_type( poDS->datatype, H5T_DIR_ASCEND );
470 :
471 9 : poDS->nRasterYSize=poDS->dims[poDS->ndims-2]; // Y
472 9 : poDS->nRasterXSize=poDS->dims[poDS->ndims-1]; // X alway last
473 :
474 9 : poDS->nBands=1;
475 :
476 9 : if( poDS->ndims == 3 ) poDS->nBands=poDS->dims[0];
477 :
478 :
479 18 : for( i = 1; i <= poDS->nBands; i++ ) {
480 : HDF5ImageRasterBand *poBand =
481 : new HDF5ImageRasterBand( poDS, i,
482 9 : poDS->GetDataType( poDS->native ) );
483 :
484 9 : poDS->SetBand( i, poBand );
485 9 : if( poBand->bNoDataSet )
486 0 : poBand->SetNoDataValue( 255 );
487 : }
488 :
489 :
490 9 : poDS->oSRS.SetWellKnownGeogCS( "WGS84" );
491 9 : poDS->oSRS.exportToWkt( &poDS->pszProjection );
492 9 : poDS->CreateProjections( );
493 :
494 9 : poDS->SetMetadata( poDS->papszMetadata );
495 :
496 : /* -------------------------------------------------------------------- */
497 : /* Setup/check for pam .aux.xml. */
498 : /* -------------------------------------------------------------------- */
499 9 : poDS->TryLoadXML();
500 :
501 : /* -------------------------------------------------------------------- */
502 : /* Setup overviews. */
503 : /* -------------------------------------------------------------------- */
504 9 : poDS->oOvManager.Initialize( poDS, ":::VIRTUAL:::" );
505 :
506 9 : return( poDS );
507 : }
508 :
509 :
510 : /************************************************************************/
511 : /* GDALRegister_HDF5Image() */
512 : /************************************************************************/
513 338 : void GDALRegister_HDF5Image( )
514 :
515 : {
516 : GDALDriver *poDriver;
517 :
518 338 : if (! GDAL_CHECK_VERSION("HDF5Image driver"))
519 0 : return;
520 :
521 338 : if( GDALGetDriverByName( "HDF5Image" ) == NULL )
522 : {
523 336 : poDriver = new GDALDriver( );
524 :
525 336 : poDriver->SetDescription( "HDF5Image" );
526 : poDriver->SetMetadataItem( GDAL_DMD_LONGNAME,
527 336 : "HDF5 Dataset" );
528 : poDriver->SetMetadataItem( GDAL_DMD_HELPTOPIC,
529 336 : "frmt_hdf5.html" );
530 336 : poDriver->pfnOpen = HDF5ImageDataset::Open;
531 336 : poDriver->pfnIdentify = HDF5ImageDataset::Identify;
532 :
533 336 : GetGDALDriverManager( )->RegisterDriver( poDriver );
534 : }
535 : }
536 :
537 : /************************************************************************/
538 : /* CreateProjections() */
539 : /************************************************************************/
540 9 : CPLErr HDF5ImageDataset::CreateProjections()
541 : {
542 : #define NBGCPLAT 100
543 : #define NBGCPLON 30
544 :
545 9 : hid_t LatitudeDatasetID = -1;
546 9 : hid_t LongitudeDatasetID = -1;
547 : hid_t LatitudeDataspaceID;
548 : hid_t LongitudeDataspaceID;
549 : float* Latitude;
550 : float* Longitude;
551 : int i,j;
552 : int nDeltaLat;
553 : int nDeltaLon;
554 :
555 9 : nDeltaLat = nRasterYSize / NBGCPLAT;
556 9 : nDeltaLon = nRasterXSize / NBGCPLON;
557 :
558 : /* -------------------------------------------------------------------- */
559 : /* Create HDF5 Data Hierarchy in a link list */
560 : /* -------------------------------------------------------------------- */
561 9 : poH5Objects=HDF5FindDatasetObjects( poH5RootGroup, "Latitude" );
562 9 : if( !poH5Objects ) {
563 9 : return CE_None;
564 : }
565 : /* -------------------------------------------------------------------- */
566 : /* The Lattitude and Longitude arrays must have a rank of 2 to */
567 : /* retrieve GCPs. */
568 : /* -------------------------------------------------------------------- */
569 0 : if( poH5Objects->nRank != 2 ) {
570 0 : return CE_None;
571 : }
572 :
573 : /* -------------------------------------------------------------------- */
574 : /* Retrieve HDF5 data information */
575 : /* -------------------------------------------------------------------- */
576 0 : LatitudeDatasetID = H5Dopen( hHDF5,poH5Objects->pszPath );
577 0 : LatitudeDataspaceID = H5Dget_space( dataset_id );
578 :
579 0 : poH5Objects=HDF5FindDatasetObjects( poH5RootGroup, "Longitude" );
580 0 : LongitudeDatasetID = H5Dopen( hHDF5,poH5Objects->pszPath );
581 0 : LongitudeDataspaceID = H5Dget_space( dataset_id );
582 :
583 0 : if( ( LatitudeDatasetID > 0 ) && ( LongitudeDatasetID > 0) ) {
584 :
585 : Latitude = ( float * ) CPLCalloc( nRasterYSize*nRasterXSize,
586 0 : sizeof( float ) );
587 : Longitude = ( float * ) CPLCalloc( nRasterYSize*nRasterXSize,
588 0 : sizeof( float ) );
589 0 : memset( Latitude, 0, nRasterXSize*nRasterYSize*sizeof( float ) );
590 0 : memset( Longitude, 0, nRasterXSize*nRasterYSize*sizeof( float ) );
591 :
592 : H5Dread ( LatitudeDatasetID,
593 : H5T_NATIVE_FLOAT,
594 : H5S_ALL,
595 : H5S_ALL,
596 : H5P_DEFAULT,
597 0 : Latitude );
598 :
599 : H5Dread ( LongitudeDatasetID,
600 : H5T_NATIVE_FLOAT,
601 : H5S_ALL,
602 : H5S_ALL,
603 : H5P_DEFAULT,
604 0 : Longitude );
605 :
606 0 : oSRS.SetWellKnownGeogCS( "WGS84" );
607 0 : CPLFree(pszProjection);
608 0 : oSRS.exportToWkt( &pszProjection );
609 0 : oSRS.exportToWkt( &pszGCPProjection );
610 :
611 : /* -------------------------------------------------------------------- */
612 : /* Fill the GCPs list. */
613 : /* -------------------------------------------------------------------- */
614 0 : nGCPCount = nRasterYSize/nDeltaLat * nRasterXSize/nDeltaLon;
615 :
616 : pasGCPList = ( GDAL_GCP * )
617 0 : CPLCalloc( nGCPCount, sizeof( GDAL_GCP ) );
618 :
619 0 : GDALInitGCPs( nGCPCount, pasGCPList );
620 0 : int k=0;
621 :
622 0 : int nYLimit = ((int)nRasterYSize/nDeltaLat) * nDeltaLat;
623 0 : int nXLimit = ((int)nRasterXSize/nDeltaLon) * nDeltaLon;
624 0 : for( j = 0; j < nYLimit; j+=nDeltaLat ) {
625 0 : for( i = 0; i < nXLimit; i+=nDeltaLon ) {
626 0 : int iGCP = j * nRasterXSize + i;
627 0 : pasGCPList[k].dfGCPX = ( double ) Longitude[iGCP]+180.0;
628 0 : pasGCPList[k].dfGCPY = ( double ) Latitude[iGCP];
629 :
630 0 : pasGCPList[k].dfGCPPixel = i + 0.5;
631 0 : pasGCPList[k++].dfGCPLine = j + 0.5;
632 :
633 : }
634 : }
635 :
636 0 : CPLFree( Latitude );
637 0 : CPLFree( Longitude );
638 : }
639 0 : return CE_None;
640 :
641 : }
642 : /************************************************************************/
643 : /* GetProjectionRef() */
644 : /************************************************************************/
645 :
646 0 : const char *HDF5ImageDataset::GetProjectionRef( )
647 :
648 : {
649 0 : return pszProjection;
650 : }
651 :
652 : /************************************************************************/
653 : /* GetGCPCount() */
654 : /************************************************************************/
655 :
656 0 : int HDF5ImageDataset::GetGCPCount( )
657 :
658 : {
659 0 : if( nGCPCount > 0 )
660 0 : return nGCPCount;
661 : else
662 0 : return GDALPamDataset::GetGCPCount();
663 : }
664 :
665 : /************************************************************************/
666 : /* GetGCPProjection() */
667 : /************************************************************************/
668 :
669 0 : const char *HDF5ImageDataset::GetGCPProjection( )
670 :
671 : {
672 0 : if( nGCPCount > 0 )
673 0 : return pszGCPProjection;
674 : else
675 0 : return GDALPamDataset::GetGCPProjection();
676 : }
677 :
678 : /************************************************************************/
679 : /* GetGCPs() */
680 : /************************************************************************/
681 :
682 0 : const GDAL_GCP *HDF5ImageDataset::GetGCPs( )
683 : {
684 0 : if( nGCPCount > 0 )
685 0 : return pasGCPList;
686 : else
687 0 : return GDALPamDataset::GetGCPs();
688 : }
689 :
690 :
691 :
692 :
693 :
|