Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: Interlis 2 Translator 4 : * Purpose: Implements OGRILI2Layer class. 5 : * Author: Markus Schnider, Sourcepole AG 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2004, Pirmin Kalberer, Sourcepole AG 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "xercesc_headers.h" 14 : 15 : #include "cpl_conv.h" 16 : #include "ogr_ili2.h" 17 : #include "ogrsf_frmts.h" 18 : 19 : /************************************************************************/ 20 : /* Open() */ 21 : /************************************************************************/ 22 : 23 30958 : static GDALDataset *OGRILI2DriverOpen(GDALOpenInfo *poOpenInfo) 24 : 25 : { 26 30958 : if (poOpenInfo->pabyHeader != nullptr) 27 : { 28 4257 : if (poOpenInfo->pabyHeader[0] != '<' || 29 276 : (strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader), 30 275 : "interlis.ch/INTERLIS2") == nullptr && 31 275 : strstr(reinterpret_cast<char *>(poOpenInfo->pabyHeader), 32 : "//www.interlis.ch/xtf/") == nullptr)) 33 : { 34 4255 : return nullptr; 35 : } 36 : } 37 26701 : else if (poOpenInfo->bIsDirectory) 38 634 : return nullptr; 39 : 40 26069 : OGRILI2DataSource *poDS = new OGRILI2DataSource(); 41 : 42 26069 : const bool bTestOpen = (poOpenInfo->pabyHeader == nullptr); 43 26069 : if (!poDS->Open(poOpenInfo->pszFilename, poOpenInfo->papszOpenOptions, 44 26073 : bTestOpen) || 45 4 : poDS->GetLayerCount() == 0) 46 : { 47 26065 : delete poDS; 48 26065 : return nullptr; 49 : } 50 : 51 4 : return poDS; 52 : } 53 : 54 : /************************************************************************/ 55 : /* RegisterOGRILI2() */ 56 : /************************************************************************/ 57 : 58 2040 : void RegisterOGRILI2() 59 : { 60 2040 : if (GDALGetDriverByName("Interlis 2") != nullptr) 61 283 : return; 62 : 63 1757 : GDALDriver *poDriver = new GDALDriver(); 64 : 65 1757 : poDriver->SetDescription("Interlis 2"); 66 1757 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 67 1757 : poDriver->SetMetadataItem(GDAL_DCAP_CURVE_GEOMETRIES, "YES"); 68 1757 : poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); 69 1757 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "Interlis 2"); 70 1757 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ili.html"); 71 1757 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "xtf xml ili"); 72 1757 : poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); 73 1757 : poDriver->SetMetadataItem( 74 : GDAL_DMD_OPENOPTIONLIST, 75 : "<OpenOptionList>" 76 : " <Option name='MODEL' type='string' description='Filename of the " 77 : "model in IlisMeta format (.imd)'/>" 78 1757 : "</OpenOptionList>"); 79 1757 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 80 : 81 1757 : poDriver->pfnOpen = OGRILI2DriverOpen; 82 : 83 1757 : GetGDALDriverManager()->RegisterDriver(poDriver); 84 : }