Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: Zarr driver 5 : * Author: Even Rouault <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2021, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "zarrdrivercore.h" 14 : 15 : /************************************************************************/ 16 : /* CheckExistenceOfOneZarrFile() */ 17 : /************************************************************************/ 18 : 19 1441 : static bool CheckExistenceOfOneZarrFile(const char *pszFilename) 20 : { 21 : 22 : CPLString osMDFilename = 23 2882 : CPLFormFilenameSafe(pszFilename, ".zarray", nullptr); 24 : 25 : VSIStatBufL sStat; 26 1441 : if (VSIStatL(osMDFilename, &sStat) == 0) 27 480 : return true; 28 : 29 961 : osMDFilename = CPLFormFilenameSafe(pszFilename, ".zgroup", nullptr); 30 961 : if (VSIStatL(osMDFilename, &sStat) == 0) 31 440 : return true; 32 : 33 : // Zarr V3 34 521 : osMDFilename = CPLFormFilenameSafe(pszFilename, "zarr.json", nullptr); 35 521 : if (VSIStatL(osMDFilename, &sStat) == 0) 36 424 : return true; 37 : 38 97 : return false; 39 : } 40 : 41 : /************************************************************************/ 42 : /* ZARRDriverIdentify() */ 43 : /************************************************************************/ 44 : 45 47864 : int ZARRDriverIdentify(GDALOpenInfo *poOpenInfo) 46 : 47 : { 48 47864 : if (STARTS_WITH(poOpenInfo->pszFilename, "ZARR:")) 49 : { 50 46 : return TRUE; 51 : } 52 : 53 47818 : if (!poOpenInfo->bIsDirectory) 54 : { 55 46294 : return FALSE; 56 : } 57 : 58 1524 : return CheckExistenceOfOneZarrFile(poOpenInfo->pszFilename); 59 : } 60 : 61 : /************************************************************************/ 62 : /* ZARRDriverSetCommonMetadata() */ 63 : /************************************************************************/ 64 : 65 1385 : void ZARRDriverSetCommonMetadata(GDALDriver *poDriver) 66 : { 67 1385 : poDriver->SetDescription(DRIVER_NAME); 68 1385 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 69 1385 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES"); 70 1385 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Zarr"); 71 1385 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "zarr"); 72 1385 : poDriver->SetMetadataItem( 73 : GDAL_DMD_CREATIONDATATYPES, 74 : "Int8 Byte Int16 UInt16 Int32 UInt32 Int64 UInt64 " 75 1385 : "Float16 Float32 Float64 CFLoat16 CFloat32 CFloat64"); 76 1385 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 77 1385 : poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); 78 : 79 1385 : poDriver->SetMetadataItem( 80 : GDAL_DMD_OPENOPTIONLIST, 81 : "<OpenOptionList>" 82 : " <Option name='LIST_ALL_ARRAYS' type='boolean' " 83 : "description='Whether to list all arrays, and not only those whose " 84 : "dimension count is 2 or more' default='NO'/>" 85 : " <Option name='USE_ZMETADATA' type='boolean' description='Whether " 86 : "to use consolidated metadata from .zmetadata' default='YES'/>" 87 : " <Option name='CACHE_TILE_PRESENCE' type='boolean' " 88 : "description='Whether to establish an initial listing of present " 89 : "tiles' default='NO'/>" 90 : " <Option name='MULTIBAND' type='boolean' default='YES' " 91 : "description='Whether to expose >= 3D arrays as GDAL multiband " 92 : "datasets " 93 : "(when using the classic 2D API)'/>" 94 : " <Option name='DIM_X' type='string' description=" 95 : "'Name or index of the X dimension (only used when MULTIBAND=YES)'/>" 96 : " <Option name='DIM_Y' type='string' description=" 97 : "'Name or index of the Y dimension (only used when MULTIBAND=YES)'/>" 98 : " <Option name='LOAD_EXTRA_DIM_METADATA_DELAY' type='string' " 99 : "description=" 100 : "'Maximum delay in seconds allowed to set the DIM_{dimname}_VALUE band " 101 : "metadata items'/>" 102 1385 : "</OpenOptionList>"); 103 : 104 1385 : poDriver->SetMetadataItem( 105 : GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST, 106 : "<MultiDimDatasetCreationOptionList>" 107 : " <Option name='FORMAT' type='string-select' default='ZARR_V2'>" 108 : " <Value>ZARR_V2</Value>" 109 : " <Value>ZARR_V3</Value>" 110 : " </Option>" 111 : " <Option name='CREATE_ZMETADATA' type='boolean' " 112 : "description='Whether to create consolidated metadata into .zmetadata " 113 : "(Zarr V2 only)' default='YES'/>" 114 1385 : "</MultiDimDatasetCreationOptionList>"); 115 : 116 1385 : poDriver->pfnIdentify = ZARRDriverIdentify; 117 1385 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 118 1385 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES"); 119 1385 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_MULTIDIMENSIONAL, "YES"); 120 : 121 1385 : poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); 122 1385 : poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, 123 : "GeoTransform SRS NoData " 124 : "RasterValues " 125 1385 : "DatasetMetadata BandMetadata"); 126 1385 : } 127 : 128 : /************************************************************************/ 129 : /* DeclareDeferredZarrPlugin() */ 130 : /************************************************************************/ 131 : 132 : #ifdef PLUGIN_FILENAME 133 : void DeclareDeferredZarrPlugin() 134 : { 135 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 136 : { 137 : return; 138 : } 139 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 140 : #ifdef PLUGIN_INSTALLATION_MESSAGE 141 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 142 : PLUGIN_INSTALLATION_MESSAGE); 143 : #endif 144 : ZARRDriverSetCommonMetadata(poDriver); 145 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 146 : } 147 : #endif