Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL Rasterlite driver 4 : * Purpose: Implement GDAL Rasterlite support using OGR SQLite driver 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ********************************************************************** 8 : * Copyright (c) 2009-2013, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * Permission is hereby granted, free of charge, to any person obtaining a 11 : * copy of this software and associated documentation files (the "Software"), 12 : * to deal in the Software without restriction, including without limitation 13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 : * and/or sell copies of the Software, and to permit persons to whom the 15 : * Software is furnished to do so, subject to the following conditions: 16 : * 17 : * The above copyright notice and this permission notice shall be included 18 : * in all copies or substantial portions of the Software. 19 : * 20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 : * DEALINGS IN THE SOFTWARE. 27 : ****************************************************************************/ 28 : 29 : #include "rasterlitedrivercore.h" 30 : 31 : /************************************************************************/ 32 : /* RasterliteDriverIdentify() */ 33 : /************************************************************************/ 34 : 35 49835 : int RasterliteDriverIdentify(GDALOpenInfo *poOpenInfo) 36 : 37 : { 38 : #ifdef ENABLE_SQL_SQLITE_FORMAT 39 49835 : if (poOpenInfo->pabyHeader && 40 4192 : STARTS_WITH((const char *)poOpenInfo->pabyHeader, "-- SQL RASTERLITE")) 41 : { 42 2 : return TRUE; 43 : } 44 : #endif 45 : 46 49833 : if (!EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "MBTILES") && 47 49659 : !EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "GPKG") && 48 48072 : poOpenInfo->nHeaderBytes >= 1024 && poOpenInfo->pabyHeader && 49 1972 : STARTS_WITH_CI((const char *)poOpenInfo->pabyHeader, 50 99491 : "SQLite Format 3") && 51 : // Do not match direct Amazon S3 signed URLs that contains .mbtiles in 52 : // the middle of the URL 53 72 : strstr(poOpenInfo->pszFilename, ".mbtiles") == nullptr) 54 : { 55 : // Could be a SQLite/Spatialite file as well 56 72 : return -1; 57 : } 58 49760 : else if (STARTS_WITH_CI(poOpenInfo->pszFilename, "RASTERLITE:")) 59 : { 60 37 : return TRUE; 61 : } 62 : 63 49723 : return FALSE; 64 : } 65 : 66 : /************************************************************************/ 67 : /* RasterliteDriverSetCommonMetadata() */ 68 : /************************************************************************/ 69 : 70 1219 : void RasterliteDriverSetCommonMetadata(GDALDriver *poDriver) 71 : { 72 1219 : poDriver->SetDescription(DRIVER_NAME); 73 1219 : poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); 74 1219 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Rasterlite"); 75 1219 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, 76 1219 : "drivers/raster/rasterlite.html"); 77 1219 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "sqlite"); 78 1219 : poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); 79 1219 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONDATATYPES, 80 : "Byte UInt16 Int16 UInt32 Int32 Float32 " 81 1219 : "Float64 CInt16 CInt32 CFloat32 CFloat64"); 82 1219 : poDriver->SetMetadataItem( 83 : GDAL_DMD_CREATIONOPTIONLIST, 84 : "<CreationOptionList>" 85 : " <Option name='WIPE' type='boolean' default='NO' description='Erase " 86 : "all preexisting data in the specified table'/>" 87 : " <Option name='TILED' type='boolean' default='YES' description='Use " 88 : "tiling'/>" 89 : " <Option name='BLOCKXSIZE' type='int' default='256' " 90 : "description='Tile Width'/>" 91 : " <Option name='BLOCKYSIZE' type='int' default='256' " 92 : "description='Tile Height'/>" 93 : " <Option name='DRIVER' type='string' description='GDAL driver to " 94 : "use for storing tiles' default='GTiff'/>" 95 : " <Option name='COMPRESS' type='string' description='(GTiff driver) " 96 : "Compression method' default='NONE'/>" 97 : " <Option name='QUALITY' type='int' description='(JPEG-compressed " 98 : "GTiff, JPEG and WEBP drivers) JPEG/WEBP Quality 1-100' default='75'/>" 99 : " <Option name='PHOTOMETRIC' type='string-select' " 100 : "description='(GTiff driver) Photometric interpretation'>" 101 : " <Value>MINISBLACK</Value>" 102 : " <Value>MINISWHITE</Value>" 103 : " <Value>PALETTE</Value>" 104 : " <Value>RGB</Value>" 105 : " <Value>CMYK</Value>" 106 : " <Value>YCBCR</Value>" 107 : " <Value>CIELAB</Value>" 108 : " <Value>ICCLAB</Value>" 109 : " <Value>ITULAB</Value>" 110 : " </Option>" 111 1219 : "</CreationOptionList>"); 112 1219 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 113 : 114 : #ifdef ENABLE_SQL_SQLITE_FORMAT 115 1219 : poDriver->SetMetadataItem("ENABLE_SQL_SQLITE_FORMAT", "YES"); 116 : #endif 117 : 118 1219 : poDriver->pfnIdentify = RasterliteDriverIdentify; 119 1219 : poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); 120 1219 : poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); 121 1219 : } 122 : 123 : /************************************************************************/ 124 : /* DeclareDeferredRasterlitePlugin() */ 125 : /************************************************************************/ 126 : 127 : #ifdef PLUGIN_FILENAME 128 : void DeclareDeferredRasterlitePlugin() 129 : { 130 : if (GDALGetDriverByName(DRIVER_NAME) != nullptr) 131 : { 132 : return; 133 : } 134 : auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); 135 : #ifdef PLUGIN_INSTALLATION_MESSAGE 136 : poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, 137 : PLUGIN_INSTALLATION_MESSAGE); 138 : #endif 139 : RasterliteDriverSetCommonMetadata(poDriver); 140 : GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); 141 : } 142 : #endif