diff --git a/.github/workflows/cmake_builds.yml b/.github/workflows/cmake_builds.yml index 4d7c95ce9619..c095b5d6d47e 100644 --- a/.github/workflows/cmake_builds.yml +++ b/.github/workflows/cmake_builds.yml @@ -429,7 +429,7 @@ jobs: cfitsio freexl geotiff libjpeg-turbo libpq libspatialite libwebp-base pcre pcre2 postgresql \ sqlite tiledb zstd cryptopp cgal doxygen librttopo libkml openssl xz \ openjdk ant qhull armadillo blas blas-devel libblas libcblas liblapack liblapacke blosc libarchive \ - arrow-cpp pyarrow libaec libavif cmake + arrow-cpp pyarrow libaec libheif libavif cmake - name: Check CMake version shell: bash -l {0} run: | @@ -485,6 +485,17 @@ jobs: PYTHONPATH=$GITHUB_WORKSPACE/install-gdal/lib/site-packages python -c "from osgeo import gdal;print(gdal.VersionInfo(None))" export PATH=$GITHUB_WORKSPACE/install-gdal/Scripts:$PATH PYTHONPATH=$GITHUB_WORKSPACE/install-gdal/lib/site-packages gdal_edit --version + - name: Check the build includes the expected drivers + shell: bash -l {0} + run: | + export PATH=$GITHUB_WORKSPACE/install-gdal/bin:$PATH + gdalinfo --formats > found_formats.txt + ogrinfo --formats >> found_formats.txt + cat found_formats.txt + cat $GITHUB_WORKSPACE/.github/workflows/windows_conda_expected_gdalinfo_formats.txt $GITHUB_WORKSPACE/.github/workflows/windows_conda_expected_ogrinfo_formats.txt > expected_formats.txt + dos2unix expected_formats.txt + dos2unix found_formats.txt + diff -u expected_formats.txt found_formats.txt - name: Show gdal.pc shell: bash -l {0} run: cat $GITHUB_WORKSPACE/build/gdal.pc diff --git a/.github/workflows/ubuntu_24.04/Dockerfile.ci b/.github/workflows/ubuntu_24.04/Dockerfile.ci index 213d1a36069a..9d4f4137480d 100644 --- a/.github/workflows/ubuntu_24.04/Dockerfile.ci +++ b/.github/workflows/ubuntu_24.04/Dockerfile.ci @@ -32,6 +32,7 @@ RUN apt-get update && \ libgif-dev \ libhdf4-alt-dev \ libhdf5-serial-dev \ + libheif-dev \ libjpeg-dev \ libjxl-dev \ libkml-dev \ diff --git a/.github/workflows/ubuntu_24.04/expected_gdalinfo_formats.txt b/.github/workflows/ubuntu_24.04/expected_gdalinfo_formats.txt new file mode 100644 index 000000000000..74da4f4d13c4 --- /dev/null +++ b/.github/workflows/ubuntu_24.04/expected_gdalinfo_formats.txt @@ -0,0 +1,156 @@ +Supported Formats: (ro:read-only, rw:read-write, +:update, v:virtual-I/O s:subdatasets) + VRT -raster,multidimensional raster- (rw+v): Virtual Raster (*.vrt) + GTI -raster- (rov): GDAL Raster Tile Index (*.gti.gpkg, *.gti.fgb, *.gti) + DERIVED -raster- (ro): Derived datasets using VRT pixel functions + GTiff -raster- (rw+vs): GeoTIFF (*.tif, *.tiff) + COG -raster- (wv): Cloud optimized GeoTIFF generator (*.tif, *.tiff) + NITF -raster- (rw+vs): National Imagery Transmission Format (*.ntf) + RPFTOC -raster- (rovs): Raster Product Format TOC format (*.toc) + ECRGTOC -raster- (rovs): ECRG TOC format (*.xml) + HFA -raster- (rw+v): Erdas Imagine Images (.img) (*.img) + SAR_CEOS -raster- (rov): CEOS SAR Image + CEOS -raster- (rov): CEOS Image + JAXAPALSAR -raster- (rov): JAXA PALSAR Product Reader (Level 1.1/1.5) + GFF -raster- (rov): Ground-based SAR Applications Testbed File Format (.gff) (*.gff) + ELAS -raster- (rw+v): ELAS + ESRIC -raster- (rov): Esri Compact Cache (*.json, *.tpkx) + AIG -raster- (rov): Arc/Info Binary Grid + AAIGrid -raster- (rwv): Arc/Info ASCII Grid (*.asc) + GRASSASCIIGrid -raster- (rov): GRASS ASCII Grid + ISG -raster- (rov): International Service for the Geoid (*.isg) + SDTS -raster- (rov): SDTS Raster (*.ddf) + DTED -raster- (rwv): DTED Elevation Raster (*.dt0, *.dt1, *.dt2) + PNG -raster- (rwv): Portable Network Graphics (*.png) + JPEG -raster- (rwv): JPEG JFIF (*.jpg, *.jpeg) + MEM -raster,multidimensional raster- (rw+): In Memory Raster + JDEM -raster- (rov): Japanese DEM (.mem) (*.mem) + GIF -raster- (rwv): Graphics Interchange Format (.gif) (*.gif) + BIGGIF -raster- (rov): Graphics Interchange Format (.gif) (*.gif) + ESAT -raster- (rov): Envisat Image Format (*.n1) + FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits) + BSB -raster- (rov): Maptech BSB Nautical Charts (*.kap) + XPM -raster- (rwv): X11 PixMap Format (*.xpm) + BMP -raster- (rw+v): MS Windows Device Independent Bitmap (*.bmp) + DIMAP -raster- (rovs): SPOT DIMAP + AirSAR -raster- (rov): AirSAR Polarimetric Image + RS2 -raster- (rovs): RadarSat 2 XML Product + SAFE -raster- (rov): Sentinel-1 SAR SAFE Product + PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix) + PCRaster -raster- (rw+): PCRaster Raster File (*.map) + ILWIS -raster- (rw+v): ILWIS Raster Map (*.mpr, *.mpl) + SGI -raster- (rw+v): SGI Image File Format 1.0 (*.rgb) + SRTMHGT -raster- (rwv): SRTMHGT File Format (*.hgt) + Leveller -raster- (rw+v): Leveller heightfield (*.ter) + Terragen -raster- (rw+v): Terragen heightfield (*.ter) + netCDF -raster,multidimensional raster,vector- (rw+vs): Network Common Data Format (*.nc) + HDF4 -raster,multidimensional raster- (ros): Hierarchical Data Format Release 4 (*.hdf) + HDF4Image -raster- (rw+): HDF4 Dataset + ISIS3 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 3) (*.lbl, *.cub) + ISIS2 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 2) + PDS -raster- (rov): NASA Planetary Data System + PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml) + VICAR -raster,vector- (rw+v): MIPL VICAR file + TIL -raster- (rov): EarthWatch .TIL + ERS -raster- (rw+v): ERMapper .ers Labelled (*.ers) + JP2OpenJPEG -raster,vector- (rwv): JPEG-2000 driver based on JP2OpenJPEG library (*.jp2, *.j2k) + L1B -raster- (rovs): NOAA Polar Orbiter Level 1b Data Set + FIT -raster- (rwv): FIT Image + GRIB -raster,multidimensional raster- (rwv): GRIdded Binary (.grb, .grb2) (*.grb, *.grb2, *.grib2) + RMF -raster- (rw+v): Raster Matrix Format (*.rsw) + WCS -raster- (rovs): OGC Web Coverage Service + WMS -raster- (rwvs): OGC Web Map Service + MSGN -raster- (rov): EUMETSAT Archive native (.nat) (*.nat) + RST -raster- (rw+v): Idrisi Raster A.1 (*.rst) + GSAG -raster- (rwv): Golden Software ASCII Grid (.grd) (*.grd) + GSBG -raster- (rw+v): Golden Software Binary Grid (.grd) (*.grd) + GS7BG -raster- (rw+v): Golden Software 7 Binary Grid (.grd) (*.grd) + COSAR -raster- (rov): COSAR Annotated Binary Matrix (TerraSAR-X) + TSX -raster- (rov): TerraSAR-X Product + COASP -raster- (ro): DRDC COASP SAR Processor Raster (*.hdr) + R -raster- (rwv): R Object Data Store (*.rda) + MAP -raster- (rov): OziExplorer .MAP + KMLSUPEROVERLAY -raster- (rwv): Kml Super Overlay (*.kml, *.kmz) + WEBP -raster- (rwv): WEBP (*.webp) + PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf) + Rasterlite -raster- (rwvs): Rasterlite (*.sqlite) + MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles) + PLMOSAIC -raster- (ro): Planet Labs Mosaics API + CALS -raster- (rwv): CALS (Type 1) (*.cal, *.ct1) + WMTS -raster- (rwv): OGC Web Map Tile Service + SENTINEL2 -raster- (rovs): Sentinel 2 + MRF -raster- (rw+v): Meta Raster Format (*.mrf) + PNM -raster- (rw+v): Portable Pixmap Format (netpbm) (*.pgm, *.ppm, *.pnm) + DOQ1 -raster- (rov): USGS DOQ (Old Style) + DOQ2 -raster- (rov): USGS DOQ (New Style) + PAux -raster- (rw+v): PCI .aux Labelled + MFF -raster- (rw+v): Vexcel MFF Raster (*.hdr) + MFF2 -raster- (rw+): Vexcel MFF2 (HKV) Raster + GSC -raster- (rov): GSC Geogrid + FAST -raster- (rov): EOSAT FAST Format + BT -raster- (rw+v): VTP .bt (Binary Terrain) 1.3 Format (*.bt) + LAN -raster- (rw+v): Erdas .LAN/.GIS + CPG -raster- (rov): Convair PolGASP + NDF -raster- (rov): NLAPS Data Format + EIR -raster- (rov): Erdas Imagine Raw + DIPEx -raster- (rov): DIPEx + LCP -raster- (rwv): FARSITE v.4 Landscape File (.lcp) (*.lcp) + GTX -raster- (rw+v): NOAA Vertical Datum .GTX (*.gtx) + LOSLAS -raster- (rov): NADCON .los/.las Datum Grid Shift + NTv2 -raster- (rw+vs): NTv2 Datum Grid Shift (*.gsb, *.gvb) + CTable2 -raster- (rw+v): CTable2 Datum Grid Shift + ACE2 -raster- (rov): ACE2 (*.ACE2) + SNODAS -raster- (rov): Snow Data Assimilation System (*.hdr) + KRO -raster- (rw+v): KOLOR Raw (*.kro) + ROI_PAC -raster- (rw+v): ROI_PAC raster + RRASTER -raster- (rw+v): R Raster (*.grd) + BYN -raster- (rw+v): Natural Resources Canada's Geoid (*.byn, *.err) + NOAA_B -raster- (rov): NOAA GEOCON/NADCON5 .b format (*.b) + NSIDCbin -raster- (rov): NSIDC Sea Ice Concentrations binary (.bin) (*.bin) + RIK -raster- (rov): Swedish Grid RIK (.rik) (*.rik) + USGSDEM -raster- (rwv): USGS Optional ASCII DEM (and CDED) (*.dem) + GXF -raster- (rov): GeoSoft Grid Exchange Format (*.gxf) + BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag) + S102 -raster,multidimensional raster- (rovs): S-102 Bathymetric Surface Product (*.h5) + S104 -raster,multidimensional raster- (rov): S-104 Water Level Information for Surface Navigation Product (*.h5) + S111 -raster,multidimensional raster- (rov): Surface Currents Product (*.h5) + HDF5 -raster,multidimensional raster- (rovs): Hierarchical Data Format Release 5 (*.h5, *.hdf5) + HDF5Image -raster- (rov): HDF5 Dataset + NWT_GRD -raster- (rw+v): Northwood Numeric Grid Format .grd/.tab (*.grd) + NWT_GRC -raster- (rov): Northwood Classified Grid Format .grc/.tab (*.grc) + ADRG -raster- (rw+vs): ARC Digitized Raster Graphics (*.gen) + SRP -raster- (rovs): Standard Raster Product (ASRP/USRP) (*.img) + BLX -raster- (rwv): Magellan topo (.blx) (*.blx) + GeoRaster -raster- (rw+s): Oracle Spatial GeoRaster + PostGISRaster -raster- (rws): PostGIS Raster driver + SAGA -raster- (rw+v): SAGA GIS Binary Grid (.sdat, .sg-grd-z) (*.sdat, *.sg-grd-z) + XYZ -raster- (rwv): ASCII Gridded XYZ (*.xyz) + HF2 -raster- (rwv): HF2/HFZ heightfield raster (*.hf2) + OZI -raster- (rov): OziExplorer Image File + CTG -raster- (rov): USGS LULC Composite Theme Grid + ZMap -raster- (rwv): ZMap Plus Grid (*.dat) + NGSGEOID -raster- (rov): NOAA NGS Geoid Height Grids (*.bin) + IRIS -raster- (rov): IRIS data (.PPI, .CAPPi etc) (*.ppi) + PRF -raster- (rov): Racurs PHOTOMOD PRF (*.prf) + EEDAI -raster- (ros): Earth Engine Data API Image + DAAS -raster- (ro): Airbus DS Intelligence Data As A Service driver + SIGDEM -raster- (rwv): Scaled Integer Gridded DEM .sigdem (*.sigdem) + EXR -raster- (rw+vs): Extended Dynamic Range Image File Format (*.exr) + AVIF -raster- (rwvs): AV1 Image File Format (*.avif) + HEIF -raster- (rov): ISO/IEC 23008-12:2017 High Efficiency Image File Format (*.heic) + TGA -raster- (rov): TGA/TARGA Image File Format (*.tga) + OGCAPI -raster,vector- (rov): OGCAPI + STACTA -raster- (rovs): Spatio-Temporal Asset Catalog Tiled Assets (*.json) + STACIT -raster- (rovs): Spatio-Temporal Asset Catalog Items + JPEGXL -raster- (rwv): JPEG-XL (*.jxl) + GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip) + SQLite -raster,vector- (rw+v): SQLite / Spatialite / RasterLite2 (*.sqlite, *.db) + OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb) + CAD -raster,vector- (rovs): AutoCAD Driver (*.dwg) + PLSCENES -raster,vector- (ro): Planet Labs Scenes API + NGW -raster,vector- (rw+s): NextGIS Web + GenBin -raster- (rov): Generic Binary (.hdr Labelled) + ENVI -raster- (rw+v): ENVI .hdr Labelled + EHdr -raster- (rw+v): ESRI .hdr Labelled (*.bil) + ISCE -raster- (rw+v): ISCE raster + Zarr -raster,multidimensional raster- (rw+vs): Zarr + HTTP -raster,vector- (ro): HTTP Fetching Wrapper diff --git a/.github/workflows/ubuntu_24.04/expected_ogrinfo_formats.txt b/.github/workflows/ubuntu_24.04/expected_ogrinfo_formats.txt new file mode 100644 index 000000000000..7e40f0480d3f --- /dev/null +++ b/.github/workflows/ubuntu_24.04/expected_ogrinfo_formats.txt @@ -0,0 +1,88 @@ +Supported Formats: (ro:read-only, rw:read-write, +:update, v:virtual-I/O s:subdatasets) + FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits) + PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix) + netCDF -raster,multidimensional raster,vector- (rw+vs): Network Common Data Format (*.nc) + PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml) + VICAR -raster,vector- (rw+v): MIPL VICAR file + JP2OpenJPEG -raster,vector- (rwv): JPEG-2000 driver based on JP2OpenJPEG library (*.jp2, *.j2k) + PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf) + MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles) + BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag) + EEDA -vector- (ro): Earth Engine Data API + OGCAPI -raster,vector- (rov): OGCAPI + ESRI Shapefile -vector- (rw+v): ESRI Shapefile (*.shp, *.dbf, *.shz, *.shp.zip) + MapInfo File -vector- (rw+v): MapInfo File (*.tab, *.mif, *.mid) + UK .NTF -vector- (rov): UK .NTF + LVBAG -vector- (rov): Kadaster LV BAG Extract 2.0 (*.xml) + OGR_SDTS -vector- (rov): SDTS + S57 -vector- (rw+v): IHO S-57 (ENC) (*.000) + DGN -vector- (rw+v): Microstation DGN (*.dgn) + OGR_VRT -vector- (rov): VRT - Virtual Datasource (*.vrt) + Memory -vector- (rw+): Memory + CSV -vector- (rw+v): Comma Separated Value (.csv) (*.csv, *.tsv, *.psv) + NAS -vector- (rov): NAS - ALKIS (*.xml) + GML -vector- (rw+v): Geography Markup Language (GML) (*.gml, *.xml) + GPX -vector- (rw+v): GPX (*.gpx) + LIBKML -vector- (rw+v): Keyhole Markup Language (LIBKML) (*.kml, *.kmz) + KML -vector- (rw+v): Keyhole Markup Language (KML) (*.kml) + GeoJSON -vector- (rw+v): GeoJSON (*.json, *.geojson) + GeoJSONSeq -vector- (rw+v): GeoJSON Sequence (*.geojsonl, *.geojsons) + ESRIJSON -vector- (rov): ESRIJSON (*.json) + TopoJSON -vector- (rov): TopoJSON (*.json, *.topojson) + Interlis 1 -vector- (rw+v): Interlis 1 (*.itf, *.ili) + Interlis 2 -vector- (rw+v): Interlis 2 (*.xtf, *.xml, *.ili) + OGR_GMT -vector- (rw+v): GMT ASCII Vectors (.gmt) (*.gmt) + GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip) + SQLite -raster,vector- (rw+v): SQLite / Spatialite / RasterLite2 (*.sqlite, *.db) + ODBC -vector- (ro): (*.mdb, *.accdb) + WAsP -vector- (rw+v): WAsP .map format (*.map) + PGeo -vector- (ro): ESRI Personal GeoDatabase (*.mdb) + MSSQLSpatial -vector- (rw+): Microsoft SQL Server Spatial Database (BCP) + OGR_OGDI -vector- (ro): OGDI Vectors (VPF, VMAP, DCW) + PostgreSQL -vector- (rw+): PostgreSQL/PostGIS + MySQL -vector- (rw+): MySQL + OCI -vector- (rw+): Oracle Spatial + OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb) + FileGDB -vector- (rw+): ESRI FileGDB (*.gdb) + DXF -vector- (rw+v): AutoCAD DXF (*.dxf) + CAD -raster,vector- (rovs): AutoCAD Driver (*.dwg) + FlatGeobuf -vector- (rw+v): FlatGeobuf (*.fgb) + Geoconcept -vector- (rw+v): Geoconcept (*.gxt, *.txt) + GeoRSS -vector- (rw+v): GeoRSS + VFK -vector- (ro): Czech Cadastral Exchange Data Format (*.vfk) + PGDUMP -vector- (w+v): PostgreSQL SQL dump (*.sql) + OSM -vector- (rov): OpenStreetMap XML and PBF (*.osm, *.pbf) + GPSBabel -vector- (rw+): GPSBabel (*.mps, *.gdb, *.osm, *.tcx, *.igc) + OGR_PDS -vector- (rov): Planetary Data Systems TABLE + WFS -vector- (rov): OGC WFS (Web Feature Service) + OAPIF -vector- (ro): OGC API - Features + SOSI -vector- (ro): Norwegian SOSI Standard + EDIGEO -vector- (rov): French EDIGEO exchange format (*.thf) + SVG -vector- (rov): Scalable Vector Graphics (*.svg) + Idrisi -vector- (rov): Idrisi Vector (.vct) (*.vct) + XLS -vector- (ro): MS Excel format (*.xls) + ODS -vector- (rw+v): Open Document/ LibreOffice / OpenOffice Spreadsheet (*.ods) + XLSX -vector- (rw+v): MS Office Open XML spreadsheet (*.xlsx, *.xlsm) + Elasticsearch -vector- (rw+): Elastic Search + Carto -vector- (rw+): Carto + AmigoCloud -vector- (rw+): AmigoCloud + SXF -vector- (rov): Storage and eXchange Format (*.sxf) + Selafin -vector- (rw+v): Selafin + JML -vector- (rw+v): OpenJUMP JML (*.jml) + PLSCENES -raster,vector- (ro): Planet Labs Scenes API + CSW -vector- (ro): OGC CSW (Catalog Service for the Web) + MongoDBv3 -vector- (ro): MongoDB (using libmongocxx v3 client) + VDV -vector- (rw+v): VDV-451/VDV-452/INTREST Data Format (*.txt, *.x10) + GMLAS -vector- (rwv): Geography Markup Language (GML) driven by application schemas (*.gml, *.xml) + MVT -vector- (rw+v): Mapbox Vector Tiles (*.mvt, *.mvt.gz, *.pbf) + NGW -raster,vector- (rw+s): NextGIS Web + MapML -vector- (rw+v): MapML + GTFS -vector- (rov): General Transit Feed Specification (*.zip) + PMTiles -vector- (rw+v): ProtoMap Tiles (*.pmtiles) + JSONFG -vector- (rw+v): OGC Features and Geometries JSON (*.json) + MiraMonVector -vector- (rw+v): MiraMon Vectors (.pol, .arc, .pnt) (*.pol, *.arc, *.pnt) + XODR -vector- (ro): OpenDRIVE - Open Dynamic Road Information for Vehicle Environment (*.xodr) + TIGER -vector- (rov): U.S. Census TIGER/Line + AVCBin -vector- (rov): Arc/Info Binary Coverage + AVCE00 -vector- (rov): Arc/Info E00 (ASCII) Coverage (*.e00) + HTTP -raster,vector- (ro): HTTP Fetching Wrapper diff --git a/.github/workflows/ubuntu_24.04/test.sh b/.github/workflows/ubuntu_24.04/test.sh index f653a1fdd752..9276321ef0c0 100755 --- a/.github/workflows/ubuntu_24.04/test.sh +++ b/.github/workflows/ubuntu_24.04/test.sh @@ -7,6 +7,13 @@ set -e LD_LIBRARY_PATH="/opt/instantclient_19_9:/opt/instantclient_19_9/lib:${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH +# Check the build includes the expected drivers +gdalinfo --formats > found_formats.txt +ogrinfo --formats >> found_formats.txt +cat found_formats.txt +cat ../.github/workflows/ubuntu_24.04/expected_gdalinfo_formats.txt ../.github/workflows/ubuntu_24.04/expected_ogrinfo_formats.txt > expected_formats.txt +diff -u expected_formats.txt found_formats.txt + # Test development launcher script gdal_edit --version diff --git a/.github/workflows/windows_conda_expected_gdalinfo_formats.txt b/.github/workflows/windows_conda_expected_gdalinfo_formats.txt new file mode 100644 index 000000000000..c3305b4b5f7a --- /dev/null +++ b/.github/workflows/windows_conda_expected_gdalinfo_formats.txt @@ -0,0 +1,155 @@ +Supported Formats: (ro:read-only, rw:read-write, +:update, v:virtual-I/O s:subdatasets) + VRT -raster,multidimensional raster- (rw+v): Virtual Raster (*.vrt) + GTI -raster- (rov): GDAL Raster Tile Index (*.gti.gpkg, *.gti.fgb, *.gti) + DERIVED -raster- (ro): Derived datasets using VRT pixel functions + GTiff -raster- (rw+vs): GeoTIFF (*.tif, *.tiff) + COG -raster- (wv): Cloud optimized GeoTIFF generator (*.tif, *.tiff) + NITF -raster- (rw+vs): National Imagery Transmission Format (*.ntf) + RPFTOC -raster- (rovs): Raster Product Format TOC format (*.toc) + ECRGTOC -raster- (rovs): ECRG TOC format (*.xml) + HFA -raster- (rw+v): Erdas Imagine Images (.img) (*.img) + SAR_CEOS -raster- (rov): CEOS SAR Image + CEOS -raster- (rov): CEOS Image + JAXAPALSAR -raster- (rov): JAXA PALSAR Product Reader (Level 1.1/1.5) + GFF -raster- (rov): Ground-based SAR Applications Testbed File Format (.gff) (*.gff) + ELAS -raster- (rw+v): ELAS + ESRIC -raster- (rov): Esri Compact Cache (*.json, *.tpkx) + AIG -raster- (rov): Arc/Info Binary Grid + AAIGrid -raster- (rwv): Arc/Info ASCII Grid (*.asc) + GRASSASCIIGrid -raster- (rov): GRASS ASCII Grid + ISG -raster- (rov): International Service for the Geoid (*.isg) + SDTS -raster- (rov): SDTS Raster (*.ddf) + DTED -raster- (rwv): DTED Elevation Raster (*.dt0, *.dt1, *.dt2) + PNG -raster- (rwv): Portable Network Graphics (*.png) + JPEG -raster- (rwv): JPEG JFIF (*.jpg, *.jpeg) + MEM -raster,multidimensional raster- (rw+): In Memory Raster + JDEM -raster- (rov): Japanese DEM (.mem) (*.mem) + GIF -raster- (rwv): Graphics Interchange Format (.gif) (*.gif) + BIGGIF -raster- (rov): Graphics Interchange Format (.gif) (*.gif) + ESAT -raster- (rov): Envisat Image Format (*.n1) + FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits) + BSB -raster- (rov): Maptech BSB Nautical Charts (*.kap) + XPM -raster- (rwv): X11 PixMap Format (*.xpm) + BMP -raster- (rw+v): MS Windows Device Independent Bitmap (*.bmp) + DIMAP -raster- (rovs): SPOT DIMAP + AirSAR -raster- (rov): AirSAR Polarimetric Image + RS2 -raster- (rovs): RadarSat 2 XML Product + SAFE -raster- (rov): Sentinel-1 SAR SAFE Product + PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix) + PCRaster -raster- (rw+): PCRaster Raster File (*.map) + ILWIS -raster- (rw+v): ILWIS Raster Map (*.mpr, *.mpl) + SGI -raster- (rw+v): SGI Image File Format 1.0 (*.rgb) + SRTMHGT -raster- (rwv): SRTMHGT File Format (*.hgt) + Leveller -raster- (rw+v): Leveller heightfield (*.ter) + Terragen -raster- (rw+v): Terragen heightfield (*.ter) + netCDF -raster,multidimensional raster,vector- (rw+s): Network Common Data Format (*.nc) + HDF4 -raster,multidimensional raster- (ros): Hierarchical Data Format Release 4 (*.hdf) + HDF4Image -raster- (rw+): HDF4 Dataset + ISIS3 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 3) (*.lbl, *.cub) + ISIS2 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 2) + PDS -raster- (rov): NASA Planetary Data System + PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml) + VICAR -raster,vector- (rw+v): MIPL VICAR file + TIL -raster- (rov): EarthWatch .TIL + ERS -raster- (rw+v): ERMapper .ers Labelled (*.ers) + JP2OpenJPEG -raster,vector- (rwv): JPEG-2000 driver based on JP2OpenJPEG library (*.jp2, *.j2k) + L1B -raster- (rovs): NOAA Polar Orbiter Level 1b Data Set + FIT -raster- (rwv): FIT Image + GRIB -raster,multidimensional raster- (rwv): GRIdded Binary (.grb, .grb2) (*.grb, *.grb2, *.grib2) + RMF -raster- (rw+v): Raster Matrix Format (*.rsw) + WCS -raster- (rovs): OGC Web Coverage Service + WMS -raster- (rwvs): OGC Web Map Service + MSGN -raster- (rov): EUMETSAT Archive native (.nat) (*.nat) + MSG -raster- (ro): MSG HRIT Data + RST -raster- (rw+v): Idrisi Raster A.1 (*.rst) + GSAG -raster- (rwv): Golden Software ASCII Grid (.grd) (*.grd) + GSBG -raster- (rw+v): Golden Software Binary Grid (.grd) (*.grd) + GS7BG -raster- (rw+v): Golden Software 7 Binary Grid (.grd) (*.grd) + COSAR -raster- (rov): COSAR Annotated Binary Matrix (TerraSAR-X) + TSX -raster- (rov): TerraSAR-X Product + COASP -raster- (ro): DRDC COASP SAR Processor Raster (*.hdr) + R -raster- (rwv): R Object Data Store (*.rda) + MAP -raster- (rov): OziExplorer .MAP + KMLSUPEROVERLAY -raster- (rwv): Kml Super Overlay (*.kml, *.kmz) + WEBP -raster- (rwv): WEBP (*.webp) + PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf) + Rasterlite -raster- (rwvs): Rasterlite (*.sqlite) + MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles) + PLMOSAIC -raster- (ro): Planet Labs Mosaics API + CALS -raster- (rwv): CALS (Type 1) (*.cal, *.ct1) + WMTS -raster- (rwv): OGC Web Map Tile Service + SENTINEL2 -raster- (rovs): Sentinel 2 + MRF -raster- (rw+v): Meta Raster Format (*.mrf) + TileDB -raster,multidimensional raster,vector- (rw+vs): TileDB + PNM -raster- (rw+v): Portable Pixmap Format (netpbm) (*.pgm, *.ppm, *.pnm) + DOQ1 -raster- (rov): USGS DOQ (Old Style) + DOQ2 -raster- (rov): USGS DOQ (New Style) + PAux -raster- (rw+v): PCI .aux Labelled + MFF -raster- (rw+v): Vexcel MFF Raster (*.hdr) + MFF2 -raster- (rw+): Vexcel MFF2 (HKV) Raster + GSC -raster- (rov): GSC Geogrid + FAST -raster- (rov): EOSAT FAST Format + BT -raster- (rw+v): VTP .bt (Binary Terrain) 1.3 Format (*.bt) + LAN -raster- (rw+v): Erdas .LAN/.GIS + CPG -raster- (rov): Convair PolGASP + NDF -raster- (rov): NLAPS Data Format + EIR -raster- (rov): Erdas Imagine Raw + DIPEx -raster- (rov): DIPEx + LCP -raster- (rwv): FARSITE v.4 Landscape File (.lcp) (*.lcp) + GTX -raster- (rw+v): NOAA Vertical Datum .GTX (*.gtx) + LOSLAS -raster- (rov): NADCON .los/.las Datum Grid Shift + NTv2 -raster- (rw+vs): NTv2 Datum Grid Shift (*.gsb, *.gvb) + CTable2 -raster- (rw+v): CTable2 Datum Grid Shift + ACE2 -raster- (rov): ACE2 (*.ACE2) + SNODAS -raster- (rov): Snow Data Assimilation System (*.hdr) + KRO -raster- (rw+v): KOLOR Raw (*.kro) + ROI_PAC -raster- (rw+v): ROI_PAC raster + RRASTER -raster- (rw+v): R Raster (*.grd) + BYN -raster- (rw+v): Natural Resources Canada's Geoid (*.byn, *.err) + NOAA_B -raster- (rov): NOAA GEOCON/NADCON5 .b format (*.b) + RIK -raster- (rov): Swedish Grid RIK (.rik) (*.rik) + USGSDEM -raster- (rwv): USGS Optional ASCII DEM (and CDED) (*.dem) + GXF -raster- (rov): GeoSoft Grid Exchange Format (*.gxf) + KEA -raster- (rw+v): KEA Image Format (.kea) (*.kea) + BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag) + S102 -raster,multidimensional raster- (rovs): S-102 Bathymetric Surface Product (*.h5) + S104 -raster,multidimensional raster- (rov): S-104 Water Level Information for Surface Navigation Product (*.h5) + S111 -raster,multidimensional raster- (rov): Surface Currents Product (*.h5) + HDF5 -raster,multidimensional raster- (rovs): Hierarchical Data Format Release 5 (*.h5, *.hdf5) + HDF5Image -raster- (rov): HDF5 Dataset + NWT_GRD -raster- (rw+v): Northwood Numeric Grid Format .grd/.tab (*.grd) + NWT_GRC -raster- (rov): Northwood Classified Grid Format .grc/.tab (*.grc) + ADRG -raster- (rw+vs): ARC Digitized Raster Graphics (*.gen) + SRP -raster- (rovs): Standard Raster Product (ASRP/USRP) (*.img) + BLX -raster- (rwv): Magellan topo (.blx) (*.blx) + PostGISRaster -raster- (rws): PostGIS Raster driver + SAGA -raster- (rw+v): SAGA GIS Binary Grid (.sdat, .sg-grd-z) (*.sdat, *.sg-grd-z) + XYZ -raster- (rwv): ASCII Gridded XYZ (*.xyz) + HF2 -raster- (rwv): HF2/HFZ heightfield raster (*.hf2) + OZI -raster- (rov): OziExplorer Image File + CTG -raster- (rov): USGS LULC Composite Theme Grid + ZMap -raster- (rwv): ZMap Plus Grid (*.dat) + NGSGEOID -raster- (rov): NOAA NGS Geoid Height Grids (*.bin) + IRIS -raster- (rov): IRIS data (.PPI, .CAPPi etc) (*.ppi) + PRF -raster- (rov): Racurs PHOTOMOD PRF (*.prf) + EEDAI -raster- (ros): Earth Engine Data API Image + DAAS -raster- (ro): Airbus DS Intelligence Data As A Service driver + SIGDEM -raster- (rwv): Scaled Integer Gridded DEM .sigdem (*.sigdem) + AVIF -raster- (rwvs): AV1 Image File Format (*.avif) + HEIF -raster- (rov): ISO/IEC 23008-12:2017 High Efficiency Image File Format (*.heic) + TGA -raster- (rov): TGA/TARGA Image File Format (*.tga) + OGCAPI -raster,vector- (rov): OGCAPI + STACTA -raster- (rovs): Spatio-Temporal Asset Catalog Tiled Assets (*.json) + STACIT -raster- (rovs): Spatio-Temporal Asset Catalog Items + NSIDCbin -raster- (rov): NSIDC Sea Ice Concentrations binary (.bin) (*.bin) + GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip) + OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb) + CAD -raster,vector- (rovs): AutoCAD Driver (*.dwg) + PLSCENES -raster,vector- (ro): Planet Labs Scenes API + NGW -raster,vector- (rw+s): NextGIS Web + GenBin -raster- (rov): Generic Binary (.hdr Labelled) + ENVI -raster- (rw+v): ENVI .hdr Labelled + EHdr -raster- (rw+v): ESRI .hdr Labelled (*.bil) + ISCE -raster- (rw+v): ISCE raster + Zarr -raster,multidimensional raster- (rw+vs): Zarr + HTTP -raster,vector- (ro): HTTP Fetching Wrapper diff --git a/.github/workflows/windows_conda_expected_ogrinfo_formats.txt b/.github/workflows/windows_conda_expected_ogrinfo_formats.txt new file mode 100644 index 000000000000..103ca446361d --- /dev/null +++ b/.github/workflows/windows_conda_expected_ogrinfo_formats.txt @@ -0,0 +1,83 @@ +Supported Formats: (ro:read-only, rw:read-write, +:update, v:virtual-I/O s:subdatasets) + FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits) + PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix) + netCDF -raster,multidimensional raster,vector- (rw+s): Network Common Data Format (*.nc) + PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml) + VICAR -raster,vector- (rw+v): MIPL VICAR file + JP2OpenJPEG -raster,vector- (rwv): JPEG-2000 driver based on JP2OpenJPEG library (*.jp2, *.j2k) + PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf) + MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles) + TileDB -raster,multidimensional raster,vector- (rw+vs): TileDB + BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag) + EEDA -vector- (ro): Earth Engine Data API + OGCAPI -raster,vector- (rov): OGCAPI + ESRI Shapefile -vector- (rw+v): ESRI Shapefile (*.shp, *.dbf, *.shz, *.shp.zip) + MapInfo File -vector- (rw+v): MapInfo File (*.tab, *.mif, *.mid) + UK .NTF -vector- (rov): UK .NTF + LVBAG -vector- (rov): Kadaster LV BAG Extract 2.0 (*.xml) + OGR_SDTS -vector- (rov): SDTS + S57 -vector- (rw+v): IHO S-57 (ENC) (*.000) + DGN -vector- (rw+v): Microstation DGN (*.dgn) + OGR_VRT -vector- (rov): VRT - Virtual Datasource (*.vrt) + Memory -vector- (rw+): Memory + CSV -vector- (rw+v): Comma Separated Value (.csv) (*.csv, *.tsv, *.psv) + NAS -vector- (rov): NAS - ALKIS (*.xml) + GML -vector- (rw+v): Geography Markup Language (GML) (*.gml, *.xml) + GPX -vector- (rw+v): GPX (*.gpx) + KML -vector- (rw+v): Keyhole Markup Language (KML) (*.kml) + GeoJSON -vector- (rw+v): GeoJSON (*.json, *.geojson) + GeoJSONSeq -vector- (rw+v): GeoJSON Sequence (*.geojsonl, *.geojsons) + ESRIJSON -vector- (rov): ESRIJSON (*.json) + TopoJSON -vector- (rov): TopoJSON (*.json, *.topojson) + Interlis 1 -vector- (rw+v): Interlis 1 (*.itf, *.ili) + Interlis 2 -vector- (rw+v): Interlis 2 (*.xtf, *.xml, *.ili) + OGR_GMT -vector- (rw+v): GMT ASCII Vectors (.gmt) (*.gmt) + GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip) + SQLite -vector- (rw+v): SQLite / Spatialite (*.sqlite, *.db) + ODBC -vector- (ro): (*.mdb, *.accdb) + WAsP -vector- (rw+v): WAsP .map format (*.map) + PGeo -vector- (ro): ESRI Personal GeoDatabase (*.mdb) + MSSQLSpatial -vector- (rw+): Microsoft SQL Server Spatial Database (BCP) + PostgreSQL -vector- (rw+): PostgreSQL/PostGIS + OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb) + DXF -vector- (rw+v): AutoCAD DXF (*.dxf) + CAD -raster,vector- (rovs): AutoCAD Driver (*.dwg) + FlatGeobuf -vector- (rw+v): FlatGeobuf (*.fgb) + Geoconcept -vector- (rw+v): Geoconcept (*.gxt, *.txt) + GeoRSS -vector- (rw+v): GeoRSS + VFK -vector- (ro): Czech Cadastral Exchange Data Format (*.vfk) + PGDUMP -vector- (w+v): PostgreSQL SQL dump (*.sql) + OSM -vector- (rov): OpenStreetMap XML and PBF (*.osm, *.pbf) + GPSBabel -vector- (rw+): GPSBabel (*.mps, *.gdb, *.osm, *.tcx, *.igc) + OGR_PDS -vector- (rov): Planetary Data Systems TABLE + WFS -vector- (rov): OGC WFS (Web Feature Service) + OAPIF -vector- (ro): OGC API - Features + EDIGEO -vector- (rov): French EDIGEO exchange format (*.thf) + SVG -vector- (rov): Scalable Vector Graphics (*.svg) + Idrisi -vector- (rov): Idrisi Vector (.vct) (*.vct) + XLS -vector- (ro): MS Excel format (*.xls) + ODS -vector- (rw+v): Open Document/ LibreOffice / OpenOffice Spreadsheet (*.ods) + XLSX -vector- (rw+v): MS Office Open XML spreadsheet (*.xlsx, *.xlsm) + Elasticsearch -vector- (rw+): Elastic Search + Carto -vector- (rw+): Carto + AmigoCloud -vector- (rw+): AmigoCloud + SXF -vector- (rov): Storage and eXchange Format (*.sxf) + Selafin -vector- (rw+v): Selafin + JML -vector- (rw+v): OpenJUMP JML (*.jml) + PLSCENES -raster,vector- (ro): Planet Labs Scenes API + CSW -vector- (ro): OGC CSW (Catalog Service for the Web) + VDV -vector- (rw+v): VDV-451/VDV-452/INTREST Data Format (*.txt, *.x10) + GMLAS -vector- (rwv): Geography Markup Language (GML) driven by application schemas (*.gml, *.xml) + MVT -vector- (rw+v): Mapbox Vector Tiles (*.mvt, *.mvt.gz, *.pbf) + NGW -raster,vector- (rw+s): NextGIS Web + MapML -vector- (rw+v): MapML + Parquet -vector- (rw+v): (Geo)Parquet (*.parquet) + Arrow -vector- (rw+v): (Geo)Arrow IPC File Format / Stream (*.arrow, *.feather, *.arrows, *.ipc) + GTFS -vector- (rov): General Transit Feed Specification (*.zip) + PMTiles -vector- (rw+v): ProtoMap Tiles (*.pmtiles) + JSONFG -vector- (rw+v): OGC Features and Geometries JSON (*.json) + MiraMonVector -vector- (rw+v): MiraMon Vectors (.pol, .arc, .pnt) (*.pol, *.arc, *.pnt) + TIGER -vector- (rov): U.S. Census TIGER/Line + AVCBin -vector- (rov): Arc/Info Binary Coverage + AVCE00 -vector- (rov): Arc/Info E00 (ASCII) Coverage (*.e00) + HTTP -raster,vector- (ro): HTTP Fetching Wrapper diff --git a/frmts/nitf/CMakeLists.txt b/frmts/nitf/CMakeLists.txt index 196e4521ae04..de3c59c9ff45 100644 --- a/frmts/nitf/CMakeLists.txt +++ b/frmts/nitf/CMakeLists.txt @@ -42,6 +42,11 @@ target_include_directories(gdal_NITF PRIVATE ${GDAL_RASTER_FORMAT_SOURCE_DIR}/gt set_property(SOURCE nitfwritejpeg.cpp nitfwritejpeg_12.cpp PROPERTY SKIP_UNITY_BUILD_INCLUSION ON) +# When build as plugin, initialize all drivers from GDALRegister_NITF +if (GDAL_ENABLE_DRIVER_NITF_PLUGIN) + target_compile_definitions(gdal_NITF PRIVATE -DNITF_PLUGIN) +endif () + if (GDAL_USE_TIFF_INTERNAL) gdal_add_vendored_lib(gdal_NITF libtiff) endif() diff --git a/frmts/nitf/ecrgtocdataset.cpp b/frmts/nitf/ecrgtocdataset.cpp index 3671363ed6ed..130c6d1af880 100644 --- a/frmts/nitf/ecrgtocdataset.cpp +++ b/frmts/nitf/ecrgtocdataset.cpp @@ -52,6 +52,7 @@ #include "gdal_proxy.h" #include "ogr_srs_api.h" #include "vrtdataset.h" +#include "nitfdrivercore.h" /** Overview of used classes : - ECRGTOCDataset : lists the different subdatasets, listed in the .xml, @@ -128,7 +129,6 @@ class ECRGTOCDataset final : public GDALPamDataset const std::string &osScale, const char *pszFilename); - static int Identify(GDALOpenInfo *poOpenInfo); static GDALDataset *Open(GDALOpenInfo *poOpenInfo); }; @@ -969,40 +969,6 @@ GDALDataset *ECRGTOCDataset::Build(const char *pszTOCFilename, return poDS; } -/************************************************************************/ -/* Identify() */ -/************************************************************************/ - -int ECRGTOCDataset::Identify(GDALOpenInfo *poOpenInfo) - -{ - const char *pszFilename = poOpenInfo->pszFilename; - - /* -------------------------------------------------------------------- */ - /* Is this a sub-dataset selector? If so, it is obviously ECRGTOC. */ - /* -------------------------------------------------------------------- */ - if (STARTS_WITH_CI(pszFilename, "ECRG_TOC_ENTRY:")) - return TRUE; - - /* -------------------------------------------------------------------- */ - /* First we check to see if the file has the expected header */ - /* bytes. */ - /* -------------------------------------------------------------------- */ - const char *pabyHeader = - reinterpret_cast(poOpenInfo->pabyHeader); - if (pabyHeader == nullptr) - return FALSE; - - if (strstr(pabyHeader, "pszFilename; @@ -1101,23 +1067,13 @@ GDALDataset *ECRGTOCDataset::Open(GDALOpenInfo *poOpenInfo) void GDALRegister_ECRGTOC() { - if (GDALGetDriverByName("ECRGTOC") != nullptr) + if (GDALGetDriverByName(ECRGTOC_DRIVER_NAME) != nullptr) return; GDALDriver *poDriver = new GDALDriver(); + ECRGTOCDriverSetCommonMetadata(poDriver); - poDriver->SetDescription("ECRGTOC"); - poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); - poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "ECRG TOC format"); - - poDriver->pfnIdentify = ECRGTOCDataset::Identify; poDriver->pfnOpen = ECRGTOCDataset::Open; - poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, - "drivers/raster/ecrgtoc.html"); - poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "xml"); - poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); - poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); - GetGDALDriverManager()->RegisterDriver(poDriver); } diff --git a/frmts/nitf/nitfdataset.cpp b/frmts/nitf/nitfdataset.cpp index c030a1ba82c2..c546c57d4d2a 100644 --- a/frmts/nitf/nitfdataset.cpp +++ b/frmts/nitf/nitfdataset.cpp @@ -7210,7 +7210,7 @@ void NITFDriver::InitCreationOptionList() void GDALRegister_NITF() { - if (GDALGetDriverByName(DRIVER_NAME) != nullptr) + if (GDALGetDriverByName(NITF_DRIVER_NAME) != nullptr) return; GDALDriver *poDriver = new NITFDriver(); @@ -7221,4 +7221,9 @@ void GDALRegister_NITF() poDriver->pfnCreateCopy = NITFDataset::NITFCreateCopy; GetGDALDriverManager()->RegisterDriver(poDriver); + +#ifdef NITF_PLUGIN + GDALRegister_RPFTOC(); + GDALRegister_ECRGTOC(); +#endif } diff --git a/frmts/nitf/nitfdrivercore.cpp b/frmts/nitf/nitfdrivercore.cpp index f3bc71f5c8c2..d91043484df0 100644 --- a/frmts/nitf/nitfdrivercore.cpp +++ b/frmts/nitf/nitfdrivercore.cpp @@ -87,7 +87,7 @@ int NITFDriverIdentify(GDALOpenInfo *poOpenInfo) void NITFDriverSetCommonMetadata(GDALDriver *poDriver) { - poDriver->SetDescription(DRIVER_NAME); + poDriver->SetDescription(NITF_DRIVER_NAME); poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "National Imagery Transmission Format"); @@ -116,6 +116,150 @@ void NITFDriverSetCommonMetadata(GDALDriver *poDriver) poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); } +/************************************************************************/ +/* RPFTOCDriverIdentify() */ +/************************************************************************/ + +int RPFTOCDriverIdentify(GDALOpenInfo *poOpenInfo) + +{ + const char *pszFilename = poOpenInfo->pszFilename; + + /* -------------------------------------------------------------------- */ + /* Is this a sub-dataset selector? If so, it is obviously RPFTOC. */ + /* -------------------------------------------------------------------- */ + + if (STARTS_WITH_CI(pszFilename, "NITF_TOC_ENTRY:")) + return TRUE; + + /* -------------------------------------------------------------------- */ + /* First we check to see if the file has the expected header */ + /* bytes. */ + /* -------------------------------------------------------------------- */ + if (poOpenInfo->nHeaderBytes < 48) + return FALSE; + + if (RPFTOCIsNonNITFFileTOC(poOpenInfo, pszFilename)) + return TRUE; + + if (!STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NITF") && + !STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NSIF") && + !STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NITF")) + return FALSE; + + /* If it is a NITF A.TOC file, it must contain A.TOC in its header */ + for (int i = 0; i < static_cast(poOpenInfo->nHeaderBytes) - + static_cast(strlen("A.TOC")); + i++) + { + if (STARTS_WITH_CI((const char *)poOpenInfo->pabyHeader + i, "A.TOC")) + return TRUE; + } + + return FALSE; +} + +/************************************************************************/ +/* IsNonNITFFileTOC() */ +/************************************************************************/ + +/* Check whether the file is a TOC file without NITF header */ +int RPFTOCIsNonNITFFileTOC(GDALOpenInfo *poOpenInfo, const char *pszFilename) +{ + const char pattern[] = {0, 0, '0', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', 'A', '.', 'T', 'O', 'C'}; + if (poOpenInfo) + { + if (poOpenInfo->nHeaderBytes < 48) + return FALSE; + return memcmp(pattern, poOpenInfo->pabyHeader, 15) == 0; + } + else + { + VSILFILE *fp = VSIFOpenL(pszFilename, "rb"); + if (fp == nullptr) + { + return FALSE; + } + + char buffer[48]; + int ret = (VSIFReadL(buffer, 1, 48, fp) == 48) && + memcmp(pattern, buffer, 15) == 0; + CPL_IGNORE_RET_VAL(VSIFCloseL(fp)); + return ret; + } +} + +/************************************************************************/ +/* RPFTOCDriverSetCommonMetadata() */ +/************************************************************************/ + +void RPFTOCDriverSetCommonMetadata(GDALDriver *poDriver) +{ + poDriver->SetDescription(RPFTOC_DRIVER_NAME); + poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, + "Raster Product Format TOC format"); + poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/rpftoc.html"); + poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "toc"); + poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); + poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); + poDriver->pfnIdentify = RPFTOCDriverIdentify; +} + +/************************************************************************/ +/* ECRGTOCDriverIdentify() */ +/************************************************************************/ + +int ECRGTOCDriverIdentify(GDALOpenInfo *poOpenInfo) + +{ + const char *pszFilename = poOpenInfo->pszFilename; + + /* -------------------------------------------------------------------- */ + /* Is this a sub-dataset selector? If so, it is obviously ECRGTOC. */ + /* -------------------------------------------------------------------- */ + if (STARTS_WITH_CI(pszFilename, "ECRG_TOC_ENTRY:")) + return TRUE; + + /* -------------------------------------------------------------------- */ + /* First we check to see if the file has the expected header */ + /* bytes. */ + /* -------------------------------------------------------------------- */ + const char *pabyHeader = + reinterpret_cast(poOpenInfo->pabyHeader); + if (pabyHeader == nullptr) + return FALSE; + + if (strstr(pabyHeader, "SetDescription(ECRGTOC_DRIVER_NAME); + poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "ECRG TOC format"); + poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, + "drivers/raster/ecrgtoc.html"); + poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "xml"); + poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); + poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); + poDriver->pfnIdentify = ECRGTOCDriverIdentify; +} + /************************************************************************/ /* DeclareDeferredNITFPlugin() */ /************************************************************************/ @@ -123,16 +267,39 @@ void NITFDriverSetCommonMetadata(GDALDriver *poDriver) #ifdef PLUGIN_FILENAME void DeclareDeferredNITFPlugin() { - if (GDALGetDriverByName(DRIVER_NAME) != nullptr) + if (GDALGetDriverByName(NITF_DRIVER_NAME) != nullptr) { return; } - auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); + + { + auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); +#ifdef PLUGIN_INSTALLATION_MESSAGE + poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, + PLUGIN_INSTALLATION_MESSAGE); +#endif + NITFDriverSetCommonMetadata(poDriver); + GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); + } + + { + auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); #ifdef PLUGIN_INSTALLATION_MESSAGE - poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, - PLUGIN_INSTALLATION_MESSAGE); + poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, + PLUGIN_INSTALLATION_MESSAGE); #endif - NITFDriverSetCommonMetadata(poDriver); - GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); + RPFTOCDriverSetCommonMetadata(poDriver); + GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); + } + + { + auto poDriver = new GDALPluginDriverProxy(PLUGIN_FILENAME); +#ifdef PLUGIN_INSTALLATION_MESSAGE + poDriver->SetMetadataItem(GDAL_DMD_PLUGIN_INSTALLATION_MESSAGE, + PLUGIN_INSTALLATION_MESSAGE); +#endif + ECRGTOCDriverSetCommonMetadata(poDriver); + GetGDALDriverManager()->DeclareDeferredPluginDriver(poDriver); + } } #endif diff --git a/frmts/nitf/nitfdrivercore.h b/frmts/nitf/nitfdrivercore.h index 5fdd3f481499..85bb083a2eb6 100644 --- a/frmts/nitf/nitfdrivercore.h +++ b/frmts/nitf/nitfdrivercore.h @@ -35,7 +35,7 @@ #include "gdal_priv.h" -constexpr const char *DRIVER_NAME = "NITF"; +constexpr const char *NITF_DRIVER_NAME = "NITF"; #define NITFDriverIdentify PLUGIN_SYMBOL_NAME(NITFDriverIdentify) #define NITFDriverSetCommonMetadata \ @@ -45,4 +45,27 @@ int NITFDriverIdentify(GDALOpenInfo *poOpenInfo); void NITFDriverSetCommonMetadata(GDALDriver *poDriver); +constexpr const char *RPFTOC_DRIVER_NAME = "RPFTOC"; + +#define RPFTOCDriverIdentify PLUGIN_SYMBOL_NAME(RPFTOCDriverIdentify) +#define RPFTOCDriverSetCommonMetadata \ + PLUGIN_SYMBOL_NAME(RPFTOCDriverSetCommonMetadata) +#define RPFTOCIsNonNITFFileTOC PLUGIN_SYMBOL_NAME(RPFTOCIsNonNITFFileTOC) + +int RPFTOCDriverIdentify(GDALOpenInfo *poOpenInfo); + +void RPFTOCDriverSetCommonMetadata(GDALDriver *poDriver); + +int RPFTOCIsNonNITFFileTOC(GDALOpenInfo *poOpenInfo, const char *pszFilename); + +constexpr const char *ECRGTOC_DRIVER_NAME = "ECRGTOC"; + +#define ECRGTOCDriverIdentify PLUGIN_SYMBOL_NAME(ECRGTOCDriverIdentify) +#define ECRGTOCDriverSetCommonMetadata \ + PLUGIN_SYMBOL_NAME(ECRGTOCDriverSetCommonMetadata) + +int ECRGTOCDriverIdentify(GDALOpenInfo *poOpenInfo); + +void ECRGTOCDriverSetCommonMetadata(GDALDriver *poDriver); + #endif diff --git a/frmts/nitf/nitflib.h b/frmts/nitf/nitflib.h index d4cf5ebdfdde..71b29877f418 100644 --- a/frmts/nitf/nitflib.h +++ b/frmts/nitf/nitflib.h @@ -66,7 +66,7 @@ typedef struct int nCCS_C; } NITFSegmentInfo; -typedef struct +typedef struct NITFFile { VSILFILE *fp; diff --git a/frmts/nitf/rpftocdataset.cpp b/frmts/nitf/rpftocdataset.cpp index 6f2bd3340631..dc94b2afe106 100644 --- a/frmts/nitf/rpftocdataset.cpp +++ b/frmts/nitf/rpftocdataset.cpp @@ -46,6 +46,7 @@ #include "ogr_spatialref.h" #include "nitflib.h" #include "vrtdataset.h" +#include "nitfdrivercore.h" constexpr int GEOTRSFRM_TOPLEFT_X = 0; constexpr int GEOTRSFRM_WE_RES = 1; @@ -140,13 +141,10 @@ class RPFTOCDataset final : public GDALPamDataset } static int IsNITFFileTOC(NITFFile *psFile); - static int IsNonNITFFileTOC(GDALOpenInfo *poOpenInfo, - const char *pszFilename); static GDALDataset *OpenFileTOC(NITFFile *psFile, const char *pszFilename, const char *entryName, const char *openInformationName); - static int Identify(GDALOpenInfo *poOpenInfo); static GDALDataset *Open(GDALOpenInfo *poOpenInfo); }; @@ -1076,38 +1074,6 @@ GDALDataset *RPFTOCSubDataset::CreateDataSetFromTocEntry( return poVirtualDS; } -/************************************************************************/ -/* IsNonNITFFileTOC() */ -/************************************************************************/ - -/* Check whether the file is a TOC file without NITF header */ -int RPFTOCDataset::IsNonNITFFileTOC(GDALOpenInfo *poOpenInfo, - const char *pszFilename) -{ - const char pattern[] = {0, 0, '0', ' ', ' ', ' ', ' ', ' ', - ' ', ' ', 'A', '.', 'T', 'O', 'C'}; - if (poOpenInfo) - { - if (poOpenInfo->nHeaderBytes < 48) - return FALSE; - return memcmp(pattern, poOpenInfo->pabyHeader, 15) == 0; - } - else - { - VSILFILE *fp = VSIFOpenL(pszFilename, "rb"); - if (fp == nullptr) - { - return FALSE; - } - - char buffer[48]; - int ret = (VSIFReadL(buffer, 1, 48, fp) == 48) && - memcmp(pattern, buffer, 15) == 0; - CPL_IGNORE_RET_VAL(VSIFCloseL(fp)); - return ret; - } -} - /************************************************************************/ /* IsNITFFileTOC() */ /************************************************************************/ @@ -1294,49 +1260,6 @@ GDALDataset *RPFTOCDataset::OpenFileTOC(NITFFile *psFile, return nullptr; } -/************************************************************************/ -/* Identify() */ -/************************************************************************/ - -int RPFTOCDataset::Identify(GDALOpenInfo *poOpenInfo) - -{ - const char *pszFilename = poOpenInfo->pszFilename; - - /* -------------------------------------------------------------------- */ - /* Is this a sub-dataset selector? If so, it is obviously RPFTOC. */ - /* -------------------------------------------------------------------- */ - - if (STARTS_WITH_CI(pszFilename, "NITF_TOC_ENTRY:")) - return TRUE; - - /* -------------------------------------------------------------------- */ - /* First we check to see if the file has the expected header */ - /* bytes. */ - /* -------------------------------------------------------------------- */ - if (poOpenInfo->nHeaderBytes < 48) - return FALSE; - - if (IsNonNITFFileTOC(poOpenInfo, pszFilename)) - return TRUE; - - if (!STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NITF") && - !STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NSIF") && - !STARTS_WITH_CI((char *)poOpenInfo->pabyHeader, "NITF")) - return FALSE; - - /* If it is a NITF A.TOC file, it must contain A.TOC in its header */ - for (int i = 0; i < static_cast(poOpenInfo->nHeaderBytes) - - static_cast(strlen("A.TOC")); - i++) - { - if (STARTS_WITH_CI((const char *)poOpenInfo->pabyHeader + i, "A.TOC")) - return TRUE; - } - - return FALSE; -} - /************************************************************************/ /* Open() */ /************************************************************************/ @@ -1344,7 +1267,7 @@ int RPFTOCDataset::Identify(GDALOpenInfo *poOpenInfo) GDALDataset *RPFTOCDataset::Open(GDALOpenInfo *poOpenInfo) { - if (!Identify(poOpenInfo)) + if (!RPFTOCDriverIdentify(poOpenInfo)) return nullptr; const char *pszFilename = poOpenInfo->pszFilename; @@ -1369,8 +1292,8 @@ GDALDataset *RPFTOCDataset::Open(GDALOpenInfo *poOpenInfo) pszFilename++; } - if (IsNonNITFFileTOC((entryName != nullptr) ? nullptr : poOpenInfo, - pszFilename)) + if (RPFTOCIsNonNITFFileTOC((entryName != nullptr) ? nullptr : poOpenInfo, + pszFilename)) { GDALDataset *poDS = OpenFileTOC(nullptr, pszFilename, entryName, poOpenInfo->pszFilename); @@ -1435,23 +1358,13 @@ GDALDataset *RPFTOCDataset::Open(GDALOpenInfo *poOpenInfo) void GDALRegister_RPFTOC() { - if (GDALGetDriverByName("RPFTOC") != nullptr) + if (GDALGetDriverByName(RPFTOC_DRIVER_NAME) != nullptr) return; GDALDriver *poDriver = new GDALDriver(); + RPFTOCDriverSetCommonMetadata(poDriver); - poDriver->SetDescription("RPFTOC"); - poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES"); - poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, - "Raster Product Format TOC format"); - - poDriver->pfnIdentify = RPFTOCDataset::Identify; poDriver->pfnOpen = RPFTOCDataset::Open; - poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/raster/rpftoc.html"); - poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "toc"); - poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES"); - poDriver->SetMetadataItem(GDAL_DMD_SUBDATASETS, "YES"); - GetGDALDriverManager()->RegisterDriver(poDriver); }