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 1425 : static bool CheckExistenceOfOneZarrFile(const char *pszFilename) 20 : { 21 : 22 : CPLString osMDFilename = 23 2850 : CPLFormFilenameSafe(pszFilename, ".zarray", nullptr); 24 : 25 : VSIStatBufL sStat; 26 1425 : if (VSIStatL(osMDFilename, &sStat) == 0) 27 470 : return true; 28 : 29 955 : osMDFilename = CPLFormFilenameSafe(pszFilename, ".zgroup", nullptr); 30 955 : if (VSIStatL(osMDFilename, &sStat) == 0) 31 438 : return true; 32 : 33 : // Zarr V3 34 517 : osMDFilename = CPLFormFilenameSafe(pszFilename, "zarr.json", nullptr); 35 517 : if (VSIStatL(osMDFilename, &sStat) == 0) 36 420 : return true; 37 : 38 97 : return false; 39 : } 40 : 41 : /************************************************************************/ 42 : /* ZARRDriverIdentify() */ 43 : /************************************************************************/ 44 : 45 50672 : int ZARRDriverIdentify(GDALOpenInfo *poOpenInfo) 46 : 47 : { 48 50672 : if (STARTS_WITH(poOpenInfo->pszFilename, "ZARR:")) 49 : { 50 46 : return TRUE; 51 : } 52 : 53 50626 : if (!poOpenInfo->bIsDirectory) 54 : { 55 49178 : return FALSE; 56 : } 57 : 58 1448 : return CheckExistenceOfOneZarrFile(poOpenInfo->pszFilename); 59 : } 60 : 61 : /************************************************************************/ 62 : /* ZARRDriverSetCommonMetadata() */ 63 : /************************************************************************/ 64 : 65 1384 : void ZARRDriverSetCommonMetadata(GDALDriver *poDriver) 66 : { 67 1384 : poDriver->SetDescription(DRIVER_NAME); 68 1384 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 69 1384 : poDriver->SetMetadataItem(GDAL_DCAP_MULTIDIM_RASTER, "YES"); 70 1384 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Zarr"); 71 1384 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "zarr"); 72 1384 : poDriver->SetMetadataItem( 73 : GDAL_DMD_CREATIONDATATYPES, 74 : "Int8 Byte Int16 UInt16 Int32 UInt32 Int64 UInt64 " 75 1384 : "Float16 Float32 Float64 CFLoat16 CFloat32 CFloat64"); 76 1384 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 77 1384 : poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); 78 : 79 1384 : poDriver->SetMetadataItem( 80 : GDAL_DMD_OPENOPTIONLIST, 81 : "<OpenOptionList>" 82 : " <Option name='USE_ZMETADATA' type='boolean' description='Whether " 83 : "to use consolidated metadata from .zmetadata' default='YES'/>" 84 : " <Option name='CACHE_TILE_PRESENCE' type='boolean' " 85 : "description='Whether to establish an initial listing of present " 86 : "tiles' default='NO'/>" 87 : " <Option name='MULTIBAND' type='boolean' default='YES' " 88 : "description='Whether to expose >= 3D arrays as GDAL multiband " 89 : "datasets " 90 : "(when using the classic 2D API)'/>" 91 : " <Option name='DIM_X' type='string' description=" 92 : "'Name or index of the X dimension (only used when MULTIBAND=YES)'/>" 93 : " <Option name='DIM_Y' type='string' description=" 94 : "'Name or index of the Y dimension (only used when MULTIBAND=YES)'/>" 95 : " <Option name='LOAD_EXTRA_DIM_METADATA_DELAY' type='string' " 96 : "description=" 97 : "'Maximum delay in seconds allowed to set the DIM_{dimname}_VALUE band " 98 : "metadata items'/>" 99 1384 : "</OpenOptionList>"); 100 : 101 1384 : poDriver->SetMetadataItem( 102 : GDAL_DMD_MULTIDIM_DATASET_CREATIONOPTIONLIST, 103 : "<MultiDimDatasetCreationOptionList>" 104 : " <Option name='FORMAT' type='string-select' default='ZARR_V2'>" 105 : " <Value>ZARR_V2</Value>" 106 : " <Value>ZARR_V3</Value>" 107 : " </Option>" 108 : " <Option name='CREATE_ZMETADATA' type='boolean' " 109 : "description='Whether to create consolidated metadata into .zmetadata " 110 : "(Zarr V2 only)' default='YES'/>" 111 1384 : "</MultiDimDatasetCreationOptionList>"); 112 : 113 1384 : poDriver->pfnIdentify = ZARRDriverIdentify; 114 1384 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 115 1384 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES"); 116 1384 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_MULTIDIMENSIONAL, "YES"); 117 : 118 1384 : poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); 119 1384 : poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, 120 : "GeoTransform SRS NoData " 121 : "RasterValues " 122 1384 : "DatasetMetadata BandMetadata"); 123 1384 : } 124 : 125 : /************************************************************************/ 126 : /* DeclareDeferredZarrPlugin() */ 127 : /************************************************************************/ 128 : 129 : #ifdef PLUGIN_FILENAME 130 : void DeclareDeferredZarrPlugin() 131 : { 132 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 133 : { 134 : return; 135 : } 136 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 137 : #ifdef PLUGIN_INSTALLATION_MESSAGE 138 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 139 : PLUGIN_INSTALLATION_MESSAGE); 140 : #endif 141 : ZARRDriverSetCommonMetadata(poDriver); 142 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 143 : } 144 : #endif