Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Interlis 1 Translator 4 : * Purpose: Implements OGRILI1Layer class. 5 : * Author: Pirmin Kalberer, Sourcepole AG 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2004, Pirmin Kalberer, Sourcepole AG 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "cpl_conv.h" 14 : #include "ogr_ili1.h" 15 : #include "ogrsf_frmts.h" 16 : 17 : /************************************************************************/ 18 : /* Open() */ 19 : /************************************************************************/ 20 : 21 26497 : static GDALDataset *OGRILI1DriverOpen(GDALOpenInfo *poOpenInfo) 22 : 23 : { 24 26497 : if (poOpenInfo->eAccess == GA_Update || 25 25701 : (!poOpenInfo->bStatOK && 26 21869 : strchr(poOpenInfo->pszFilename, ',') == nullptr)) 27 22592 : return nullptr; 28 : 29 3905 : if (poOpenInfo->pabyHeader != nullptr) 30 : { 31 3334 : if (strstr((const char *)poOpenInfo->pabyHeader, "SCNT") == nullptr) 32 : { 33 3302 : return nullptr; 34 : } 35 : } 36 571 : else if (poOpenInfo->bIsDirectory) 37 495 : return nullptr; 38 : 39 108 : OGRILI1DataSource *poDS = new OGRILI1DataSource(); 40 : 41 108 : if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions, 42 156 : TRUE) || 43 48 : poDS->GetLayerCount() == 0) 44 : { 45 60 : delete poDS; 46 60 : return nullptr; 47 : } 48 : 49 48 : return poDS; 50 : } 51 : 52 : /************************************************************************/ 53 : /* Create() */ 54 : /************************************************************************/ 55 : 56 22 : static GDALDataset *OGRILI1DriverCreate(const char *pszName, int /* nBands */, 57 : int /* nXSize */, int /* nYSize */, 58 : GDALDataType /* eDT */, 59 : char **papszOptions) 60 : { 61 22 : OGRILI1DataSource *poDS = new OGRILI1DataSource(); 62 : 63 22 : if (!poDS->Create(pszName, papszOptions)) 64 : { 65 1 : delete poDS; 66 1 : return nullptr; 67 : } 68 : 69 21 : return poDS; 70 : } 71 : 72 : /************************************************************************/ 73 : /* RegisterOGRILI1() */ 74 : /************************************************************************/ 75 : 76 1595 : void RegisterOGRILI1() 77 : { 78 1595 : if (GDALGetDriverByName("Interlis 1") != nullptr) 79 302 : return; 80 : 81 1293 : GDALDriver *poDriver = new GDALDriver(); 82 : 83 1293 : poDriver->SetDescription("Interlis 1"); 84 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 85 1293 : poDriver->SetMetadataItem(GDAL_DCAP_CREATE_FIELD, "YES"); 86 1293 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); 87 1293 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 88 1293 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Interlis 1"); 89 1293 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ili.html"); 90 1293 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "itf ili"); 91 1293 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 92 1293 : poDriver->SetMetadataItem( 93 : GDAL_DMD_OPENOPTIONLIST, 94 : "<OpenOptionList>" 95 : " <Option name='MODEL' type='string' description='Filename of the " 96 : "model in IlisMeta format (.imd)'/>" 97 1293 : "</OpenOptionList>"); 98 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 99 : 100 1293 : poDriver->pfnOpen = OGRILI1DriverOpen; 101 1293 : poDriver->pfnCreate = OGRILI1DriverCreate; 102 : 103 1293 : GetGDALDriverManager()->RegisterDriver(poDriver); 104 : }