Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: OpenGIS Simple Features Reference Implementation 4 : * Purpose: TopoJSON driver 5 : * Author: Even Rouault, <even.rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2017, Even Rouault, <even.rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "cpl_port.h" 14 : #include "ogr_geojson.h" 15 : 16 : #include <stdlib.h> 17 : #include <string.h> 18 : 19 : #include "cpl_conv.h" 20 : #include "cpl_error.h" 21 : #include "gdal.h" 22 : #include "gdal_priv.h" 23 : #include "ogrgeojsonutils.h" 24 : #include "ogrsf_frmts.h" 25 : 26 : /************************************************************************/ 27 : /* OGRTopoJSONDriverIdentify() */ 28 : /************************************************************************/ 29 : 30 47357 : static int OGRTopoJSONDriverIdentify(GDALOpenInfo *poOpenInfo) 31 : { 32 47357 : GeoJSONSourceType nSrcType = TopoJSONDriverGetSourceType(poOpenInfo); 33 47357 : if (nSrcType == eGeoJSONSourceUnknown) 34 47335 : return FALSE; 35 22 : if (nSrcType == eGeoJSONSourceService) 36 : { 37 18 : if (poOpenInfo->IsSingleAllowedDriver("TopoJSON")) 38 1 : return TRUE; 39 17 : if (!STARTS_WITH_CI(poOpenInfo->pszFilename, "TopoJSON:")) 40 : { 41 17 : return -1; 42 : } 43 : } 44 4 : return TRUE; 45 : } 46 : 47 : /************************************************************************/ 48 : /* Open() */ 49 : /************************************************************************/ 50 : 51 13 : static GDALDataset *OGRTopoJSONDriverOpen(GDALOpenInfo *poOpenInfo) 52 : { 53 13 : GeoJSONSourceType nSrcType = TopoJSONDriverGetSourceType(poOpenInfo); 54 13 : if (nSrcType == eGeoJSONSourceUnknown) 55 0 : return nullptr; 56 13 : return OGRGeoJSONDriverOpenInternal(poOpenInfo, nSrcType, "TopoJSON"); 57 : } 58 : 59 : /************************************************************************/ 60 : /* RegisterOGRTopoJSON() */ 61 : /************************************************************************/ 62 : 63 1595 : void RegisterOGRTopoJSON() 64 : { 65 1595 : if (!GDAL_CHECK_VERSION("OGR/TopoJSON driver")) 66 0 : return; 67 : 68 1595 : if (GDALGetDriverByName("TopoJSON") != nullptr) 69 302 : return; 70 : 71 1293 : GDALDriver *poDriver = new GDALDriver(); 72 : 73 1293 : poDriver->SetDescription("TopoJSON"); 74 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES"); 75 1293 : poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "TopoJSON"); 76 1293 : poDriver->SetMetadataItem(GDAL_DMD_EXTENSIONS, "json topojson"); 77 1293 : poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, 78 1293 : "drivers/vector/topojson.html"); 79 : 80 1293 : poDriver->SetMetadataItem(GDAL_DMD_OPENOPTIONLIST, "<OpenOptionList/>"); 81 : 82 1293 : poDriver->SetMetadataItem(GDAL_DMD_CREATIONOPTIONLIST, 83 1293 : "<CreationOptionList/>"); 84 : 85 1293 : poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); 86 : 87 1293 : poDriver->pfnOpen = OGRTopoJSONDriverOpen; 88 1293 : poDriver->pfnIdentify = OGRTopoJSONDriverIdentify; 89 : 90 1293 : GetGDALDriverManager()->RegisterDriver(poDriver); 91 : }