diff -Nru gdal-2.2.3+dfsg/alg/gdalwarpoperation.cpp gdal-2.2.4+dfsg/alg/gdalwarpoperation.cpp --- gdal-2.2.3+dfsg/alg/gdalwarpoperation.cpp 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/alg/gdalwarpoperation.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -49,7 +49,7 @@ #include "ogr_api.h" #include "ogr_core.h" -CPL_CVSID("$Id: gdalwarpoperation.cpp 39828 2017-08-16 08:07:41Z rouault $"); +CPL_CVSID("$Id: gdalwarpoperation.cpp 41328 2018-01-24 21:57:56Z rouault $"); struct _GDALWarpChunk { int dx, dy, dsx, dsy; @@ -1776,7 +1776,7 @@ if( psOptions->nBandCount == 1 ) { // Particular case to simplify the stack a bit. - eErr = poSrcDS->GetRasterBand(psOptions->panDstBands[0])->RasterIO( + eErr = poSrcDS->GetRasterBand(psOptions->panSrcBands[0])->RasterIO( GF_Read, nSrcXOff, nSrcYOff, nSrcXSize, nSrcYSize, oWK.papabySrcImage[0], nSrcXSize, nSrcYSize, diff -Nru gdal-2.2.3+dfsg/alg/llrasterize.cpp gdal-2.2.4+dfsg/alg/llrasterize.cpp --- gdal-2.2.3+dfsg/alg/llrasterize.cpp 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/alg/llrasterize.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -39,7 +39,7 @@ #include "gdal_alg.h" -CPL_CVSID("$Id: llrasterize.cpp 38818 2017-06-02 12:08:07Z rouault $"); +CPL_CVSID("$Id: llrasterize.cpp 41013 2017-12-12 12:05:53Z rouault $"); static int llCompareInt(const void *a, const void *b) { @@ -452,7 +452,7 @@ int iY = static_cast(floor(dfY)); int iYEnd = (int) floor(dfYEnd); - if( iX >= nRasterXSize ) + if( iX < 0 || iX >= nRasterXSize ) continue; double dfDeltaVariant = 0.0; @@ -495,7 +495,7 @@ const int iY = static_cast(floor(dfY)); int iXEnd = (int) floor(dfXEnd); - if( iY >= nRasterYSize ) + if( iY < 0 || iY >= nRasterYSize ) continue; // Clip to the borders of the target region. diff -Nru gdal-2.2.3+dfsg/alg/thinplatespline.cpp gdal-2.2.4+dfsg/alg/thinplatespline.cpp --- gdal-2.2.3+dfsg/alg/thinplatespline.cpp 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/alg/thinplatespline.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -57,7 +57,7 @@ #include "cpl_error.h" #include "cpl_vsi.h" -CPL_CVSID("$Id: thinplatespline.cpp 37119 2017-01-12 12:22:02Z rouault $"); +CPL_CVSID("$Id: thinplatespline.cpp 41859 2018-03-17 23:39:06Z rouault $"); ////////////////////////////////////////////////////////////////////////////// //// vizGeorefSpline2D @@ -435,13 +435,13 @@ const double* xr, const double* yr ) { double dist0 = SQ( xr[0] - pxy[0] ) + SQ( yr[0] - pxy[1] ); - res[0] = dist0 ? dist0 * log(dist0) : 0.0; + res[0] = dist0 != 0.0 ? dist0 * log(dist0) : 0.0; double dist1 = SQ( xr[1] - pxy[0] ) + SQ( yr[1] - pxy[1] ); - res[1] = dist1 ? dist1 * log(dist1) : 0.0; + res[1] = dist1 != 0.0 ? dist1 * log(dist1) : 0.0; double dist2 = SQ( xr[2] - pxy[0] ) + SQ( yr[2] - pxy[1] ); - res[2] = dist2 ? dist2 * log(dist2) : 0.0; + res[2] = dist2 != 0.0 ? dist2 * log(dist2) : 0.0; double dist3 = SQ( xr[3] - pxy[0] ) + SQ( yr[3] - pxy[1] ); - res[3] = dist3 ? dist3 * log(dist3) : 0.0; + res[3] = dist3 != 0.0 ? dist3 * log(dist3) : 0.0; } #endif // defined(USE_OPTIMIZED_VizGeorefSpline2DBase_func4) diff -Nru gdal-2.2.3+dfsg/apps/gdalinfo_lib.cpp gdal-2.2.4+dfsg/apps/gdalinfo_lib.cpp --- gdal-2.2.3+dfsg/apps/gdalinfo_lib.cpp 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/apps/gdalinfo_lib.cpp 2018-03-19 13:26:52.000000000 +0000 @@ -55,12 +55,13 @@ #include "ogr_api.h" #include "ogr_json_header.h" #include "ogr_srs_api.h" +#include "ogr_spatialref.h" #include "ogrgeojsonreader.h" #include "ogrgeojsonwriter.h" using std::vector; -CPL_CVSID("$Id: gdalinfo_lib.cpp 38115 2017-04-23 07:24:41Z rouault $"); +CPL_CVSID("$Id: gdalinfo_lib.cpp 41753 2018-03-12 15:58:55Z rouault $"); /*! output format */ typedef enum { @@ -591,6 +592,20 @@ else { hLatLong = OSRCloneGeogCS( hProj ); + if( hLatLong ) + { + // Drop GEOGCS|UNIT child to be sure to output as degrees + OGRSpatialReference* poLatLong = reinterpret_cast< + OGRSpatialReference*>(hLatLong); + OGR_SRSNode *poGEOGCS = poLatLong->GetRoot(); + if( poGEOGCS ) + { + const int iUnitChild = + poGEOGCS->FindChild("UNIT"); + if( iUnitChild != -1 ) + poGEOGCS->DestroyChild(iUnitChild); + } + } } } @@ -1181,7 +1196,9 @@ iOverview < GDALGetOverviewCount(hMaskBand); iOverview++ ) { - GDALRasterBandH hOverview; + GDALRasterBandH hOverview = GDALGetOverview( hMaskBand, iOverview ); + if( !hOverview ) + break; json_object *poMaskOverview = NULL; json_object *poMaskOverviewSize = NULL; @@ -1196,7 +1213,6 @@ Concat(osStr, psOptions->bStdoutOutput, ", " ); } - hOverview = GDALGetOverview( hMaskBand, iOverview ); if(bJson) { json_object *poMaskOverviewSizeX = diff -Nru gdal-2.2.3+dfsg/apps/gdalwarp_lib.cpp gdal-2.2.4+dfsg/apps/gdalwarp_lib.cpp --- gdal-2.2.3+dfsg/apps/gdalwarp_lib.cpp 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/apps/gdalwarp_lib.cpp 2018-03-19 13:26:52.000000000 +0000 @@ -59,7 +59,7 @@ #include "ogr_srs_api.h" #include "vrtdataset.h" -CPL_CVSID("$Id: gdalwarp_lib.cpp 40601 2017-11-01 10:47:26Z rouault $"); +CPL_CVSID("$Id: gdalwarp_lib.cpp 40943 2017-12-04 13:20:48Z rouault $"); /************************************************************************/ /* GDALWarpAppOptions */ @@ -2012,6 +2012,8 @@ osThisTargetSRS = pszThisTargetSRS; } + CPLStringList aoTOList(papszTO, FALSE); + for( iSrc = 0; iSrc < nSrcCount; iSrc++ ) { const char *pszThisSourceSRS = CSLFetchNameValue(papszTO,"SRC_SRS"); @@ -2062,9 +2064,10 @@ } /* -------------------------------------------------------------------- */ -/* Get the sourcesrs from the dataset, if not set already. */ +/* If we are processing the first file, get the source srs from */ +/* dataset, if not set already. */ /* -------------------------------------------------------------------- */ - if( pszThisSourceSRS == NULL ) + if( iSrc == 0 && osThisTargetSRS.empty() ) { const char *pszMethod = CSLFetchNameValue( papszTO, "METHOD" ); @@ -2082,17 +2085,20 @@ pszThisSourceSRS = SRS_WKT_WGS84; else pszThisSourceSRS = ""; - } - if( osThisTargetSRS.empty() ) - osThisTargetSRS = pszThisSourceSRS; + if( pszThisSourceSRS != NULL && pszThisSourceSRS[0] != '\0' ) + { + osThisTargetSRS = pszThisSourceSRS; + aoTOList.SetNameValue("DST_SRS", pszThisSourceSRS); + } + } /* -------------------------------------------------------------------- */ /* Create a transformation object from the source to */ /* destination coordinate system. */ /* -------------------------------------------------------------------- */ hTransformArg = - GDALCreateGenImgProjTransformer2( pahSrcDS[iSrc], NULL, papszTO ); + GDALCreateGenImgProjTransformer2( pahSrcDS[iSrc], NULL, aoTOList.List() ); if( hTransformArg == NULL ) { diff -Nru gdal-2.2.3+dfsg/apps/ogr2ogr_lib.cpp gdal-2.2.4+dfsg/apps/ogr2ogr_lib.cpp --- gdal-2.2.3+dfsg/apps/ogr2ogr_lib.cpp 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/apps/ogr2ogr_lib.cpp 2018-03-19 13:26:52.000000000 +0000 @@ -61,7 +61,7 @@ #include "ogrlayerdecorator.h" #include "ogrsf_frmts.h" -CPL_CVSID("$Id: ogr2ogr_lib.cpp 39771 2017-08-07 19:33:50Z rouault $"); +CPL_CVSID("$Id: ogr2ogr_lib.cpp 41373 2018-02-01 10:09:27Z rouault $"); typedef enum { @@ -2057,6 +2057,7 @@ /* Various tests to avoid overwriting the source layer(s) */ /* or to avoid appending a layer to itself */ if( bUpdate && strcmp(osDestFilename, poDS->GetDescription()) == 0 && + !EQUAL(poDS->GetDriverName(), "Memory") && (bOverwrite || bAppend) ) { bool bError = false; @@ -3865,8 +3866,30 @@ const char* pszFIDColumn = poDstLayer->GetFIDColumn(); - for( int iField = 0; iField < nSrcFieldCount; iField++ ) + std::vector anSrcFieldIndices; + if( m_papszSelFields ) { + for( int iField=0; m_papszSelFields[iField] != NULL; iField++) + { + const int iSrcField = + poSrcFDefn->GetFieldIndex(m_papszSelFields[iField]); + if (iSrcField >= 0) + { + anSrcFieldIndices.push_back(iSrcField); + } + } + } + else + { + for( int iField = 0; iField < nSrcFieldCount; iField++ ) + { + anSrcFieldIndices.push_back(iField); + } + } + + for( size_t i = 0; i < anSrcFieldIndices.size(); i++ ) + { + const int iField = anSrcFieldIndices[i]; OGRFieldDefn* poSrcFieldDefn = poSrcFDefn->GetFieldDefn(iField); OGRFieldDefn oFieldDefn( poSrcFieldDefn ); diff -Nru gdal-2.2.3+dfsg/ci/travis/precise_clang/script.sh gdal-2.2.4+dfsg/ci/travis/precise_clang/script.sh --- gdal-2.2.3+dfsg/ci/travis/precise_clang/script.sh 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/ci/travis/precise_clang/script.sh 2018-03-19 13:26:54.000000000 +0000 @@ -38,6 +38,7 @@ cd ogr python ogr_pgeo.py mv ogr_pgeo.* disabled +mv ogr_mongodb.* disabled cd .. # Run all the Python autotests GDAL_SKIP="JP2ECW ECW" python run_all.py @@ -51,6 +52,7 @@ git checkout ogr/ogr_fgdb.py git checkout ogr/ogr_pgeo.py +git checkout ogr/ogr_mongodb.py if test `git diff | wc -l` != "0"; then echo "Files have been modified duing testsuite run:" git diff diff -Nru gdal-2.2.3+dfsg/ci/travis/python3/script.sh gdal-2.2.4+dfsg/ci/travis/python3/script.sh --- gdal-2.2.3+dfsg/ci/travis/python3/script.sh 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/ci/travis/python3/script.sh 2018-03-19 13:26:54.000000000 +0000 @@ -37,6 +37,7 @@ cd ogr python3 ogr_pgeo.py mv ogr_pgeo.* disabled +mv ogr_mongodb.* disabled cd .. # Run all the Python autotests GDAL_SKIP="JP2ECW ECW" python3 run_all.py diff -Nru gdal-2.2.3+dfsg/configure gdal-2.2.4+dfsg/configure --- gdal-2.2.3+dfsg/configure 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/configure 2018-03-19 13:26:52.000000000 +0000 @@ -25561,6 +25561,7 @@ ECW_FLAGS= ECW_LIBS= ECW_INCLUDE= +ECW_54= # Check whether --with-ecw was given. @@ -25715,21 +25716,63 @@ # ECW SDK 5.0 style and also for the case where license type is included in path i.e. specific license type is requested. elif test -r $with_ecw/lib/$ECW_ARCH/$ECW_CONF/libNCSEcw.a ; then - ECW_LIBDIR=$with_ecw/lib/$ECW_ARCH/$ECW_CONF - ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&5 + # Test if we must use the newabi version (SDK 5.4) + if test -r $with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF/libNCSEcw.a; then + echo "#include " > testnewabi.cpp + echo "namespace NCS { class CString { public: static std::wstring Utf8Decode (const std::string &sUtf8); }; }" >> testnewabi.cpp + echo "int main() { return static_cast(NCS::CString::Utf8Decode(std::string()).size()); }" >> testnewabi.cpp + if test -z "`${CXX} ${CPPFLAGS} testnewabi.cpp -L$with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF -lNCSEcw -o testnewabi 2>&1`" ; then + ECW_LIBDIR=$with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + ECW_54="yes" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}." >&5 +$as_echo "found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}." >&6; } + rm -f testnewabi.* + rm -f testnewabi + break + fi + rm -f testnewabi.* + rm -f testnewabi + fi + if test "$ECW_LIBS" = ""; then + ECW_LIBDIR=$with_ecw/lib/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&5 $as_echo "found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&6; } + fi # ECWJP2 SDK 5.1 style elif test -d $with_ecw; then for ecw_license_type in "Desktop_Read-Write" "Server_Read-Only_EndUser" "Server_Read-Only" "Server_Read-Write" "Desktop_Read-Only" do - ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/$ECW_ARCH/$ECW_CONF - if test -r $ECW_LIBDIR/libNCSEcw.a; then - ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" - with_ecw=$with_ecw/$ecw_license_type - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&5 + # Test if we must use the newabi version (SDK 5.4) + if test -r $with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF/libNCSEcw.a; then + echo "#include " > testnewabi.cpp + echo "namespace NCS { class CString { public: static std::wstring Utf8Decode (const std::string &sUtf8); }; }" >> testnewabi.cpp + echo "int main() { return static_cast(NCS::CString::Utf8Decode(std::string()).size()); }" >> testnewabi.cpp + if test -z "`${CXX} ${CPPFLAGS} testnewabi.cpp -L$with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF -lNCSEcw -o testnewabi 2>&1`" ; then + ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}." >&5 +$as_echo "found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}." >&6; } + ECW_54="yes" + rm -f testnewabi.* + rm -f testnewabi + break + fi + rm -f testnewabi.* + rm -f testnewabi + fi + if test "$ECW_LIBS" = ""; then + ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/$ECW_ARCH/$ECW_CONF + if test -r $ECW_LIBDIR/libNCSEcw.a; then + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&5 $as_echo "found Intergraph 5.x+ SDK in ${ECW_LIBDIR}." >&6; } - break + break + fi fi done else @@ -36854,3 +36897,8 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --without-static-proj and --with-fgdb are both available. There might be some incompatibility between system libproj and the embedded copy within libFileGDBAPI" >&5 $as_echo "$as_me: WARNING: --without-static-proj and --with-fgdb are both available. There might be some incompatibility between system libproj and the embedded copy within libFileGDBAPI" >&2;} fi + +if test "$HAVE_TEIGHA" = "yes" -a "$ECW_54" = "yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Both Teigha SDK and ECW SDK >= 5.4 found. This was found to cause crashes in ECW driver." >&5 +$as_echo "$as_me: WARNING: Both Teigha SDK and ECW SDK >= 5.4 found. This was found to cause crashes in ECW driver." >&2;} +fi diff -Nru gdal-2.2.3+dfsg/configure.ac gdal-2.2.4+dfsg/configure.ac --- gdal-2.2.3+dfsg/configure.ac 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/configure.ac 2018-03-19 13:26:52.000000000 +0000 @@ -1,5 +1,5 @@ dnl *************************************************************************** -dnl $Id: configure.ac 40330 2017-10-05 12:56:50Z rouault $ +dnl $Id: configure.ac 41784 2018-03-13 20:20:56Z rouault $ dnl dnl Project: GDAL dnl Purpose: Configure source file. @@ -2682,6 +2682,7 @@ ECW_FLAGS= ECW_LIBS= ECW_INCLUDE= +ECW_54= AC_ARG_WITH(ecw,[ --with-ecw[=ARG] Include ECW support (ARG=ECW SDK Path, yes or no)],,) @@ -2744,19 +2745,59 @@ # ECW SDK 5.0 style and also for the case where license type is included in path i.e. specific license type is requested. elif test -r $with_ecw/lib/$ECW_ARCH/$ECW_CONF/libNCSEcw.a ; then - ECW_LIBDIR=$with_ecw/lib/$ECW_ARCH/$ECW_CONF - ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" - AC_MSG_RESULT([found Intergraph 5.x+ SDK in ${ECW_LIBDIR}.]) + # Test if we must use the newabi version (SDK 5.4) + if test -r $with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF/libNCSEcw.a; then + echo "#include " > testnewabi.cpp + echo "namespace NCS { class CString { public: static std::wstring Utf8Decode (const std::string &sUtf8); }; }" >> testnewabi.cpp + echo "int main() { return static_cast(NCS::CString::Utf8Decode(std::string()).size()); }" >> testnewabi.cpp + if test -z "`${CXX} ${CPPFLAGS} testnewabi.cpp -L$with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF -lNCSEcw -o testnewabi 2>&1`" ; then + ECW_LIBDIR=$with_ecw/lib/newabi/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + ECW_54="yes" + AC_MSG_RESULT([found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}.]) + rm -f testnewabi.* + rm -f testnewabi + break + fi + rm -f testnewabi.* + rm -f testnewabi + fi + if test "$ECW_LIBS" = ""; then + ECW_LIBDIR=$with_ecw/lib/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + AC_MSG_RESULT([found Intergraph 5.x+ SDK in ${ECW_LIBDIR}.]) + fi # ECWJP2 SDK 5.1 style elif test -d $with_ecw; then for ecw_license_type in "Desktop_Read-Write" "Server_Read-Only_EndUser" "Server_Read-Only" "Server_Read-Write" "Desktop_Read-Only" do - ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/$ECW_ARCH/$ECW_CONF - if test -r $ECW_LIBDIR/libNCSEcw.a; then - ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" - with_ecw=$with_ecw/$ecw_license_type - AC_MSG_RESULT([found Intergraph 5.x+ SDK in ${ECW_LIBDIR}.]) - break + # Test if we must use the newabi version (SDK 5.4) + if test -r $with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF/libNCSEcw.a; then + echo "#include " > testnewabi.cpp + echo "namespace NCS { class CString { public: static std::wstring Utf8Decode (const std::string &sUtf8); }; }" >> testnewabi.cpp + echo "int main() { return static_cast(NCS::CString::Utf8Decode(std::string()).size()); }" >> testnewabi.cpp + if test -z "`${CXX} ${CPPFLAGS} testnewabi.cpp -L$with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF -lNCSEcw -o testnewabi 2>&1`" ; then + ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/newabi/$ECW_ARCH/$ECW_CONF + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + AC_MSG_RESULT([found Intergraph 5.4+ SDK with newabi in ${ECW_LIBDIR}.]) + ECW_54="yes" + rm -f testnewabi.* + rm -f testnewabi + break + fi + rm -f testnewabi.* + rm -f testnewabi + fi + if test "$ECW_LIBS" = ""; then + ECW_LIBDIR=$with_ecw/$ecw_license_type/lib/$ECW_ARCH/$ECW_CONF + if test -r $ECW_LIBDIR/libNCSEcw.a; then + ECW_LIBS="-L$ECW_LIBDIR -lNCSEcw $ECW_FRAMEWORK_COCOA" + with_ecw=$with_ecw/$ecw_license_type + AC_MSG_RESULT([found Intergraph 5.x+ SDK in ${ECW_LIBDIR}.]) + break + fi fi done else @@ -5576,3 +5617,7 @@ if test "$PROJ_STATIC" = "no" -a "$FGDB_ENABLED" = "yes" -a "$FGDB_HAS_PROJ4" = "yes"; then AC_MSG_WARN([--without-static-proj and --with-fgdb are both available. There might be some incompatibility between system libproj and the embedded copy within libFileGDBAPI]) fi + +if test "$HAVE_TEIGHA" = "yes" -a "$ECW_54" = "yes"; then + AC_MSG_WARN([Both Teigha SDK and ECW SDK >= 5.4 found. This was found to cause crashes in ECW driver.]) +fi diff -Nru gdal-2.2.3+dfsg/debian/changelog gdal-2.2.4+dfsg/debian/changelog --- gdal-2.2.3+dfsg/debian/changelog 2018-02-06 06:39:14.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/changelog 2018-03-21 15:14:53.000000000 +0000 @@ -1,3 +1,23 @@ +gdal (2.2.4+dfsg-1) unstable; urgency=medium + + * New upstream release. + * Update watch file for final releases. + * Simplify overrides for vcs-deprecated-in-debian-infrastructure. + * Add python3-distutils to build dependencies. + * Move from experimental to unstable. + + -- Bas Couwenberg Wed, 21 Mar 2018 16:14:53 +0100 + +gdal (2.2.4~rc1+dfsg-1~exp1) experimental; urgency=medium + + * New upstream release candidate. + * Update watch file for 2.2.4 (pre-)releases. + * Drop patches included upstream. Refresh remaining patches. + * Update C++ symbols files. + * Add lintian overrides for vcs-deprecated-in-debian-infrastructure. + + -- Bas Couwenberg Mon, 19 Mar 2018 15:35:59 +0100 + gdal (2.2.3+dfsg-2) unstable; urgency=medium * Update spelling-errors.patch to also fix 'Altitude' typo. diff -Nru gdal-2.2.3+dfsg/debian/control gdal-2.2.4+dfsg/debian/control --- gdal-2.2.3+dfsg/debian/control 2018-01-29 21:42:01.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/control 2018-03-21 15:14:53.000000000 +0000 @@ -54,6 +54,7 @@ python-numpy, python3-all-dev, python3-numpy, + python3-distutils, swig, unixodbc-dev (>= 2.2.11), zlib1g-dev diff -Nru gdal-2.2.3+dfsg/debian/libgdal20.symbols.hurd-i386 gdal-2.2.4+dfsg/debian/libgdal20.symbols.hurd-i386 --- gdal-2.2.3+dfsg/debian/libgdal20.symbols.hurd-i386 2018-02-06 06:39:14.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/libgdal20.symbols.hurd-i386 2018-03-21 15:09:30.000000000 +0000 @@ -3839,5 +3839,5 @@ (c++)"vtable for OGRLayer@Base" 1.10.1 1 (c++)"vtable for OGRPoint@Base" 1.10.1 1 (c++)"vtable for VRTSource@Base" 1.11.0 1 - (c++)"CPLErr VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.1.3 1 - (c++)"CPLErr VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.1.3 1 + (c++)"VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.2.3 1 + (c++)"VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.2.3 1 diff -Nru gdal-2.2.3+dfsg/debian/libgdal20.symbols.m68k gdal-2.2.4+dfsg/debian/libgdal20.symbols.m68k --- gdal-2.2.3+dfsg/debian/libgdal20.symbols.m68k 2018-02-06 06:39:14.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/libgdal20.symbols.m68k 2018-03-21 15:09:30.000000000 +0000 @@ -3169,6 +3169,7 @@ (c++)"std::vector >::_M_default_append(unsigned int)@Base" 2.1.3 1 (c++)"void std::vector >::emplace_back(OGRFieldDefn*&&)@Base" 2.1.3 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRFieldDefn* const&)@Base" 2.2.2 1 + (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRFieldDefn*&&)@Base" 2.2.3 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRDataSource* const&)@Base" 2.2.2 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRLinearRing* const&)@Base" 2.2.2 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRLinearRing*&&)@Base" 2.2.2 1 @@ -3183,6 +3184,7 @@ (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRSpatialReference*&&)@Base" 2.2.2 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, GMLGeometryPropertyDefn* const&)@Base" 2.2.2 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRCoordinateTransformation* const&)@Base" 2.2.2 1 + (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRCoordinateTransformation*&&)@Base" 2.2.3 1 (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, OGRCurve* const&)@Base" 2.2.2 1 (c++)"std::vector >::_M_erase(__gnu_cxx::__normal_iterator > >)@Base" 2.1.3 1 (c++)"void std::vector >::emplace_back(OGRLayer*&&)@Base" 2.1.3 1 @@ -3263,7 +3265,7 @@ (c++)"std::vector >::operator=(std::vector > const&)@Base" 2.1.3 1 (c++)"void std::vector >::emplace_back(unsigned char&&)@Base" 2.2.0 1 (c++)"std::vector >::_M_default_append(unsigned int)@Base" 2.1.3 1 - (c++)"void std::vector >::_M_realloc_insert(__gnu_cxx::__normal_iterator > >, unsigned char const&)@Base" 2.2.2 1 + (c++)"std::vector >::operator=(std::vector > const&)@Base" 2.2.3 1 (c++)"void std::vector >::emplace_back(int&&)@Base" 2.1.3 1 (c++)"std::vector >::_M_fill_insert(__gnu_cxx::__normal_iterator > >, unsigned int, int const&)@Base" 2.1.3 1 (c++)"std::vector >::_M_default_append(unsigned int)@Base" 2.1.3 1 @@ -3909,5 +3911,5 @@ (c++)"vtable for OGRLayer@Base" 2.1.3 1 (c++)"vtable for OGRPoint@Base" 2.1.3 1 (c++)"vtable for VRTSource@Base" 2.1.3 1 - (c++)"CPLErr VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.1.3 1 - (c++)"CPLErr VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.1.3 1 + (c++)"VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.2.3 1 + (c++)"VRTComplexSource::RasterIOInternal(int, int, int, int, void*, int, int, GDALDataType, long long, long long, GDALRasterIOExtraArg*, GDALDataType)::bHasWarned@Base" 2.2.3 1 diff -Nru gdal-2.2.3+dfsg/debian/patches/perl-doxyfile gdal-2.2.4+dfsg/debian/patches/perl-doxyfile --- gdal-2.2.3+dfsg/debian/patches/perl-doxyfile 2018-01-02 15:46:57.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/patches/perl-doxyfile 2018-03-21 15:09:30.000000000 +0000 @@ -2,9 +2,10 @@ Author: Francesco Paolo Lovergine Last-Update: 2018-01-02 Forwarded: https://github.com/ajolma/Geo-GDAL-2.02/pull/1 +Applied-Upstream: https://github.com/ajolma/Geo-GDAL-2.02/commit/cf17a59dc1f6f14ef42047051d8efd10ffe266cc ---- gdal.orig/swig/perl/Doxyfile -+++ gdal/swig/perl/Doxyfile +--- a/swig/perl/Doxyfile ++++ b/swig/perl/Doxyfile @@ -280,7 +280,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. diff -Nru gdal-2.2.3+dfsg/debian/patches/series gdal-2.2.4+dfsg/debian/patches/series --- gdal-2.2.3+dfsg/debian/patches/series 2018-01-30 06:09:29.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/patches/series 2018-03-21 15:09:30.000000000 +0000 @@ -10,5 +10,4 @@ privacy-breach-logo.patch privacy-breach-generic.patch perl-doxyfile -svn-r41303_gnm-avoid-potential-issue-with-CPL-circular-buffers.patch spelling-errors.patch diff -Nru gdal-2.2.3+dfsg/debian/patches/spatialite gdal-2.2.4+dfsg/debian/patches/spatialite --- gdal-2.2.3+dfsg/debian/patches/spatialite 2017-12-25 18:42:56.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/patches/spatialite 2018-03-21 15:09:30.000000000 +0000 @@ -5,7 +5,7 @@ --- a/configure +++ b/configure -@@ -28977,7 +28977,7 @@ if ${ac_cv_lib_spatialite_spatialite_ini +@@ -29020,7 +29020,7 @@ if ${ac_cv_lib_spatialite_spatialite_ini $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -14,7 +14,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -@@ -29041,7 +29041,7 @@ if ${ac_cv_lib_spatialite_spatialite_ini +@@ -29084,7 +29084,7 @@ if ${ac_cv_lib_spatialite_spatialite_ini $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -23,7 +23,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -@@ -29431,7 +29431,7 @@ if ${ac_cv_lib_spatialite_spatialite_tar +@@ -29474,7 +29474,7 @@ if ${ac_cv_lib_spatialite_spatialite_tar $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS diff -Nru gdal-2.2.3+dfsg/debian/patches/svn-r41303_gnm-avoid-potential-issue-with-CPL-circular-buffers.patch gdal-2.2.4+dfsg/debian/patches/svn-r41303_gnm-avoid-potential-issue-with-CPL-circular-buffers.patch --- gdal-2.2.3+dfsg/debian/patches/svn-r41303_gnm-avoid-potential-issue-with-CPL-circular-buffers.patch 2018-01-29 21:28:35.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/patches/svn-r41303_gnm-avoid-potential-issue-with-CPL-circular-buffers.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -Description: GNM: avoid potential issue with CPL circular buffers (can happen if there are extra drivers that use CPLGet....() functions) -Author: Even Rouault -Origin: https://trac.osgeo.org/gdal/changeset/41303/ - ---- a/gnm/gnm_frmts/file/gnmfilenetwork.cpp -+++ b/gnm/gnm_frmts/file/gnmfilenetwork.cpp -@@ -101,10 +101,10 @@ CPLErr GNMFileNetwork::Open(GDALOpenInfo - } - - m_poLayerDriver = m_pMetadataDS->GetDriver(); -- const char* pszExt = CPLGetExtension(soMetadatafile); -+ CPLString osExt = CPLGetExtension(soMetadatafile); - - CPLString soGraphfile = CPLFormFilename(m_soNetworkFullName, -- GNM_SYSLAYER_GRAPH, pszExt); -+ GNM_SYSLAYER_GRAPH, osExt); - m_pGraphDS = (GDALDataset*) GDALOpenEx( soGraphfile, GDAL_OF_VECTOR | - GDAL_OF_UPDATE, NULL, NULL, NULL ); - if( NULL == m_pGraphDS ) -@@ -120,7 +120,7 @@ CPLErr GNMFileNetwork::Open(GDALOpenInfo - } - - CPLString soFeaturesfile = CPLFormFilename(m_soNetworkFullName, -- GNM_SYSLAYER_FEATURES, pszExt); -+ GNM_SYSLAYER_FEATURES, osExt); - m_pFeaturesDS = (GDALDataset*) GDALOpenEx( soFeaturesfile, GDAL_OF_VECTOR | - GDAL_OF_UPDATE, NULL, NULL, NULL ); - if( NULL == m_pFeaturesDS ) diff -Nru gdal-2.2.3+dfsg/debian/source/lintian-overrides gdal-2.2.4+dfsg/debian/source/lintian-overrides --- gdal-2.2.3+dfsg/debian/source/lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ gdal-2.2.4+dfsg/debian/source/lintian-overrides 2018-03-21 15:14:53.000000000 +0000 @@ -0,0 +1,3 @@ +# Package not officially migrated to Salsa yet. +gdal source: vcs-deprecated-in-debian-infrastructure * https://anonscm.debian.org/* + diff -Nru gdal-2.2.3+dfsg/frmts/airsar/airsardataset.cpp gdal-2.2.4+dfsg/frmts/airsar/airsardataset.cpp --- gdal-2.2.3+dfsg/frmts/airsar/airsardataset.cpp 2017-11-20 10:45:39.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/airsar/airsardataset.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -33,7 +33,7 @@ #include "gdal_frmts.h" #include "gdal_pam.h" -CPL_CVSID("$Id: airsardataset.cpp 36501 2016-11-25 14:09:24Z rouault $"); +CPL_CVSID("$Id: airsardataset.cpp 41376 2018-02-01 17:02:05Z rouault $"); /************************************************************************/ /* ==================================================================== */ @@ -238,7 +238,7 @@ pafLine[iPixel*2 + 0] = (float)(SQRT_2 * (m[M13] - m[M23])); // imaginary - pafLine[iPixel*2 + 1] = (float)(SQRT_2 * (m[M23] - m[M14])); + pafLine[iPixel*2 + 1] = (float)(SQRT_2 * (m[M24] - m[M14])); } } else if( nBand == 6 ) /* C33 */ diff -Nru gdal-2.2.3+dfsg/frmts/gtiff/geotiff.cpp gdal-2.2.4+dfsg/frmts/gtiff/geotiff.cpp --- gdal-2.2.3+dfsg/frmts/gtiff/geotiff.cpp 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/gtiff/geotiff.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -106,7 +106,7 @@ #include "xtiffio.h" -CPL_CVSID("$Id: geotiff.cpp 40691 2017-11-11 16:25:25Z rouault $"); +CPL_CVSID("$Id: geotiff.cpp 41666 2018-03-08 14:53:26Z rouault $"); #if SIZEOF_VOIDP == 4 static bool bGlobalStripIntegerOverflow = false; @@ -9413,9 +9413,9 @@ poColorTable->GetColorEntryAsRGB( iColor, &sRGB ); - anTRed[iColor] = static_cast(256 * sRGB.c1); - anTGreen[iColor] = static_cast(256 * sRGB.c2); - anTBlue[iColor] = static_cast(256 * sRGB.c3); + anTRed[iColor] = static_cast(257 * sRGB.c1); + anTGreen[iColor] = static_cast(257 * sRGB.c2); + anTBlue[iColor] = static_cast(257 * sRGB.c3); } else { @@ -13168,7 +13168,7 @@ for( int iColor = nColorCount - 1; iColor >= 0; iColor-- ) { // TODO(schwehr): Ensure the color entries are never negative? - const unsigned short divisor = 256; + const unsigned short divisor = 257; const GDALColorEntry oEntry = { static_cast(panRed[iColor] / divisor), static_cast(panGreen[iColor] / divisor), @@ -15521,7 +15521,7 @@ for( int iColor = nColorCount - 1; iColor >= 0; iColor-- ) { - const unsigned short divisor = 256; + const unsigned short divisor = 257; const GDALColorEntry oEntry = { static_cast(panRed[iColor] / divisor), static_cast(panGreen[iColor] / divisor), @@ -16042,9 +16042,9 @@ poCT->GetColorEntryAsRGB( iColor, &sRGB ); - panTRed[iColor] = static_cast(256 * sRGB.c1); - panTGreen[iColor] = static_cast(256 * sRGB.c2); - panTBlue[iColor] = static_cast(256 * sRGB.c3); + panTRed[iColor] = static_cast(257 * sRGB.c1); + panTGreen[iColor] = static_cast(257 * sRGB.c2); + panTBlue[iColor] = static_cast(257 * sRGB.c3); } else { diff -Nru gdal-2.2.3+dfsg/frmts/netcdf/netcdfdataset.cpp gdal-2.2.4+dfsg/frmts/netcdf/netcdfdataset.cpp --- gdal-2.2.3+dfsg/frmts/netcdf/netcdfdataset.cpp 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/netcdf/netcdfdataset.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -62,7 +62,7 @@ #include "ogr_core.h" #include "ogr_srs_api.h" -CPL_CVSID("$Id: netcdfdataset.cpp 40424 2017-10-13 14:32:37Z rouault $"); +CPL_CVSID("$Id: netcdfdataset.cpp 40853 2017-11-27 10:19:18Z rouault $"); // Internal function declarations. @@ -150,7 +150,8 @@ bool bSignedData; bool bCheckLongitude; - CPLErr CreateBandMetadata( const int *paDimIds ); + CPLErr CreateBandMetadata( const int *paDimIds, + const int* panExtraDimVarIds ); template void CheckData ( void *pImage, void *pImageNC, size_t nTmpBlockXSize, size_t nTmpBlockYSize, @@ -167,7 +168,8 @@ const int *panBandZLen, const int *panBandPos, const int *paDimIds, - int nBand ); + int nBand, + const int *panExtraDimVarIds ); netCDFRasterBand( netCDFDataset *poDS, GDALDataType eType, int nBand, @@ -206,7 +208,8 @@ const int *panBandZLevIn, const int *panBandZPosIn, const int *paDimIds, - int nBandIn ) : + int nBandIn, + const int *panExtraDimVarIds ) : nc_datatype(NC_NAT), cdfid(poNCDFDS->GetCDFID()), nZId(nZIdIn), @@ -468,7 +471,7 @@ SetNoDataValue(dfNoData); // Create Band Metadata. - CreateBandMetadata(paDimIds); + CreateBandMetadata(paDimIds, panExtraDimVarIds); // Attempt to fetch the scale_factor and add_offset attributes for the // variable and set them. If these values are not available, set @@ -1116,10 +1119,80 @@ } /************************************************************************/ +/* Get1DVariableIndexedByDimension() */ +/************************************************************************/ + +static int Get1DVariableIndexedByDimension( int cdfid, int nDimId, + const char* pszDimName, + bool bVerboseError ) +{ + int nVarID; + // First try to find a variable whose name is identical to the dimension + // name, and check that it is indeed indexed by this dimension + if( nc_inq_varid(cdfid, pszDimName, &nVarID) == NC_NOERR ) + { + int nDimCountOfVariable = 0; + nc_inq_varndims(cdfid, nVarID, &nDimCountOfVariable); + if( nDimCountOfVariable == 1 ) + { + int nDimIdOfVariable = -1; + nc_inq_vardimid(cdfid, nVarID, &nDimIdOfVariable); + if( nDimIdOfVariable == nDimId ) + { + return nVarID; + } + } + } + + // Otherwise iterate over the variables to find potential candidates + int nvars = 0; + CPL_IGNORE_RET_VAL( nc_inq(cdfid, NULL, &nvars, NULL, NULL) ); + + int nCountCandidateVars = 0; + int nCandidateVarID = -1; + for( int k = 0; k < nvars; k++ ) + { + int nDimCountOfVariable = 0; + nc_inq_varndims(cdfid, k, &nDimCountOfVariable); + if( nDimCountOfVariable == 1 ) + { + int nDimIdOfVariable = -1; + nc_inq_vardimid(cdfid, k, &nDimIdOfVariable); + if( nDimIdOfVariable == nDimId ) + { + nCountCandidateVars ++; + nCandidateVarID = k; + } + } + } + if( nCountCandidateVars > 1 ) + { + if( bVerboseError ) + { + CPLError(CE_Warning, CPLE_AppDefined, + "Several 1D variables are indexed by dimension %s", + pszDimName); + } + return -1; + } + else if( nCandidateVarID < 0 ) + { + if( bVerboseError ) + { + CPLError(CE_Warning, CPLE_AppDefined, + "No 1D variable is indexed by dimension %s", + pszDimName); + } + } + return nCandidateVarID; +} + +/************************************************************************/ /* CreateBandMetadata() */ /************************************************************************/ -CPLErr netCDFRasterBand::CreateBandMetadata( const int *paDimIds ) +CPLErr netCDFRasterBand::CreateBandMetadata( const int *paDimIds, + const int* panExtraDimVarIds ) { netCDFDataset *l_poDS = reinterpret_cast(poDS); @@ -1148,7 +1221,6 @@ } // Loop over non-spatial dimensions. - int nVarID = -1; int result = 0; int Taken = 0; @@ -1171,131 +1243,131 @@ snprintf(szVarName, sizeof(szVarName), "%s", l_poDS->papszDimName[paDimIds[panBandZPos[i]]]); - // TODO: Make sure all the status checks make sense. + char szMetaName[NC_MAX_NAME + 1 + 32]; + snprintf(szMetaName, sizeof(szMetaName), "NETCDF_DIM_%s", szVarName); - status = nc_inq_varid(cdfid, szVarName, &nVarID); - if( status != NC_NOERR ) + int nVarID = panExtraDimVarIds[i]; + if( nVarID < 0 ) { - // Try to uppercase the first letter of the variable. - // Note: Why is this needed? Leaving for safety. - szVarName[0] = static_cast(toupper(szVarName[0])); - /* status = */ nc_inq_varid(cdfid, szVarName, &nVarID); + SetMetadataItem(szMetaName, CPLSPrintf("%d", result + 1)); } + else + { + // TODO: Make sure all the status checks make sense. - nc_type nVarType = NC_NAT; - /* status = */ nc_inq_vartype(cdfid, nVarID, &nVarType); + nc_type nVarType = NC_NAT; + /* status = */ nc_inq_vartype(cdfid, nVarID, &nVarType); - int nDims = 0; - /* status = */ nc_inq_varndims(cdfid, nVarID, &nDims); + int nDims = 0; + /* status = */ nc_inq_varndims(cdfid, nVarID, &nDims); - char szMetaTemp[256] = {}; - if( nDims == 1 ) - { - size_t count[1] = { 1 }; - size_t start[1] = { static_cast(result) }; - - switch( nVarType ) + char szMetaTemp[256] = {}; + if( nDims == 1 ) { - case NC_BYTE: - // TODO: Check for signed/unsigned byte. - signed char cData; - /* status = */ nc_get_vara_schar(cdfid, nVarID, - start, - count, &cData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", cData); - break; - case NC_SHORT: - short sData; - /* status = */ nc_get_vara_short(cdfid, nVarID, - start, - count, &sData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", sData); - break; - case NC_INT: - { - int nData; - /* status = */ nc_get_vara_int(cdfid, nVarID, - start, - count, &nData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", nData); - break; - } - case NC_FLOAT: - float fData; - /* status = */ nc_get_vara_float(cdfid, nVarID, - start, - count, &fData); - CPLsnprintf(szMetaTemp, sizeof(szMetaTemp), - "%.8g", fData); - break; - case NC_DOUBLE: - double dfData; - /* status = */ nc_get_vara_double(cdfid, nVarID, - start, - count, &dfData); - CPLsnprintf(szMetaTemp, sizeof(szMetaTemp), - "%.16g", dfData); - break; -#ifdef NETCDF_HAS_NC4 - case NC_UBYTE: - unsigned char ucData; - /* status = */ nc_get_vara_uchar(cdfid, nVarID, - start, - count, &ucData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", ucData); - break; - case NC_USHORT: - unsigned short usData; - /* status = */ nc_get_vara_ushort(cdfid, nVarID, - start, - count, &usData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", usData); - break; - case NC_UINT: - { - unsigned int unData; - /* status = */ nc_get_vara_uint(cdfid, nVarID, - start, - count, &unData); - snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", unData); - break; - } - case NC_INT64: + size_t count[1] = { 1 }; + size_t start[1] = { static_cast(result) }; + + switch( nVarType ) { - long long nData; - /* status = */ nc_get_vara_longlong(cdfid, nVarID, + case NC_BYTE: + // TODO: Check for signed/unsigned byte. + signed char cData; + /* status = */ nc_get_vara_schar(cdfid, nVarID, + start, + count, &cData); + snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", cData); + break; + case NC_SHORT: + short sData; + /* status = */ nc_get_vara_short(cdfid, nVarID, + start, + count, &sData); + snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", sData); + break; + case NC_INT: + { + int nData; + /* status = */ nc_get_vara_int(cdfid, nVarID, start, count, &nData); - snprintf(szMetaTemp, sizeof(szMetaTemp), CPL_FRMT_GIB, nData); - break; - } - case NC_UINT64: - { - unsigned long long unData; - /* status = */ nc_get_vara_ulonglong(cdfid, nVarID, - start, - count, &unData); - snprintf(szMetaTemp, sizeof(szMetaTemp), CPL_FRMT_GUIB, unData); - break; + snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", nData); + break; + } + case NC_FLOAT: + float fData; + /* status = */ nc_get_vara_float(cdfid, nVarID, + start, + count, &fData); + CPLsnprintf(szMetaTemp, sizeof(szMetaTemp), + "%.8g", fData); + break; + case NC_DOUBLE: + double dfData; + /* status = */ nc_get_vara_double(cdfid, nVarID, + start, + count, &dfData); + CPLsnprintf(szMetaTemp, sizeof(szMetaTemp), + "%.16g", dfData); + break; + #ifdef NETCDF_HAS_NC4 + case NC_UBYTE: + unsigned char ucData; + /* status = */ nc_get_vara_uchar(cdfid, nVarID, + start, + count, &ucData); + snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", ucData); + break; + case NC_USHORT: + unsigned short usData; + /* status = */ nc_get_vara_ushort(cdfid, nVarID, + start, + count, &usData); + snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", usData); + break; + case NC_UINT: + { + unsigned int unData; + /* status = */ nc_get_vara_uint(cdfid, nVarID, + start, + count, &unData); + snprintf(szMetaTemp, sizeof(szMetaTemp), "%u", unData); + break; + } + case NC_INT64: + { + long long nData; + /* status = */ nc_get_vara_longlong(cdfid, nVarID, + start, + count, &nData); + snprintf(szMetaTemp, sizeof(szMetaTemp), CPL_FRMT_GIB, nData); + break; + } + case NC_UINT64: + { + unsigned long long unData; + /* status = */ nc_get_vara_ulonglong(cdfid, nVarID, + start, + count, &unData); + snprintf(szMetaTemp, sizeof(szMetaTemp), CPL_FRMT_GUIB, unData); + break; + } + #endif + default: + CPLDebug("GDAL_netCDF", "invalid dim %s, type=%d", + szMetaTemp, nVarType); + break; } -#endif - default: - CPLDebug("GDAL_netCDF", "invalid dim %s, type=%d", - szMetaTemp, nVarType); - break; } - } - else - { - snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", result + 1); - } + else + { + snprintf(szMetaTemp, sizeof(szMetaTemp), "%d", result + 1); + } - // Save dimension value. - // NOTE: removed #original_units as not part of CF-1. + // Save dimension value. + // NOTE: removed #original_units as not part of CF-1. - char szMetaName[NC_MAX_NAME + 1 + 32]; - snprintf(szMetaName, sizeof(szMetaName), "NETCDF_DIM_%s", szVarName); - SetMetadataItem(szMetaName, szMetaTemp); + SetMetadataItem(szMetaName, szMetaTemp); + } Taken += result * Sum; } // End loop non-spatial dimensions. @@ -6655,6 +6727,7 @@ nc_type nType = NC_NAT; CPLString osExtraDimNames; + int anExtraDimVarIds[NC_MAX_NAME] = { -1 }; if( nd > 2 ) { @@ -6673,7 +6746,7 @@ nc_inq_dimlen(cdfid, paDimIds[j], &lev_count); nTotLevCount *= lev_count; panBandZLev[nDim - 2] = static_cast(lev_count); - panBandDimPos[nDim++] = j; // Save Position of ZDim + panBandDimPos[nDim] = j; // Save Position of ZDim // Save non-spatial dimension names. if( nc_inq_dimname(cdfid, paDimIds[j], szDimName) == NC_NOERR ) @@ -6683,25 +6756,40 @@ { osExtraDimNames += ","; } - nc_inq_varid(cdfid, szDimName, &nVarID); - nc_inq_vartype(cdfid, nVarID, &nType); - char szExtraDimDef[NC_MAX_NAME + 1]; - snprintf(szExtraDimDef, sizeof(szExtraDimDef), "{%ld,%d}", - (long)lev_count, nType); - char szTemp[NC_MAX_NAME + 32 + 1]; - snprintf(szTemp, sizeof(szTemp), "NETCDF_DIM_%s_DEF", - szDimName); - poDS->papszMetadata = CSLSetNameValue( - poDS->papszMetadata, szTemp, szExtraDimDef); - if( NCDFGet1DVar(cdfid, nVarID, &pszTemp) == CE_None ) + + int nIdxVarID = Get1DVariableIndexedByDimension(cdfid, + paDimIds[j], + szDimName, + true); + anExtraDimVarIds[nDim-2] = nIdxVarID; + + if( nIdxVarID >= 0 ) { - snprintf(szTemp, sizeof(szTemp), "NETCDF_DIM_%s_VALUES", - szDimName); + nc_inq_vartype(cdfid, nIdxVarID, &nType); + char szExtraDimDef[NC_MAX_NAME + 1]; + snprintf(szExtraDimDef, sizeof(szExtraDimDef), "{%ld,%d}", + (long)lev_count, nType); + char szTemp[NC_MAX_NAME + 32 + 1]; + snprintf(szTemp, sizeof(szTemp), "NETCDF_DIM_%s_DEF", + szDimName); poDS->papszMetadata = CSLSetNameValue( - poDS->papszMetadata, szTemp, pszTemp); - CPLFree(pszTemp); + poDS->papszMetadata, szTemp, szExtraDimDef); + if( NCDFGet1DVar(cdfid, nIdxVarID, &pszTemp) == CE_None ) + { + snprintf(szTemp, sizeof(szTemp), "NETCDF_DIM_%s_VALUES", + szDimName); + poDS->papszMetadata = CSLSetNameValue( + poDS->papszMetadata, szTemp, pszTemp); + CPLFree(pszTemp); + } } } + else + { + anExtraDimVarIds[nDim-2] = -1; + } + + nDim ++; } } osExtraDimNames += "}"; @@ -6731,7 +6819,8 @@ { netCDFRasterBand *poBand = new netCDFRasterBand(poDS, var, nDim, lev, panBandZLev, - panBandDimPos, paDimIds, lev + 1); + panBandDimPos, paDimIds, lev + 1, + anExtraDimVarIds); poDS->SetBand(lev + 1, poBand); } diff -Nru gdal-2.2.3+dfsg/frmts/nitf/nitfimage.c gdal-2.2.4+dfsg/frmts/nitf/nitfimage.c --- gdal-2.2.3+dfsg/frmts/nitf/nitfimage.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/nitf/nitfimage.c 2018-03-19 13:26:55.000000000 +0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: nitfimage.c 36380 2016-11-21 10:21:20Z rouault $ + * $Id: nitfimage.c 41147 2017-12-30 09:06:46Z rouault $ * * Project: NITF Read/Write Library * Purpose: Module responsible for implementation of most NITFImage @@ -36,7 +36,7 @@ #include "cpl_conv.h" #include "cpl_string.h" -CPL_CVSID("$Id: nitfimage.c 36380 2016-11-21 10:21:20Z rouault $"); +CPL_CVSID("$Id: nitfimage.c 41147 2017-12-30 09:06:46Z rouault $"); CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {} @@ -4290,11 +4290,11 @@ for( count = 0; count < 20; ++count ) { - psRPC->LINE_NUM_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, count*22, 22) ); - psRPC->LINE_DEN_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 440+count*22, 22) ); + psRPC->SAMP_NUM_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, count*22, 22) ); + psRPC->SAMP_DEN_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 440+count*22, 22) ); - psRPC->SAMP_NUM_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 880+count*22, 22) ); - psRPC->SAMP_DEN_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 1320+count*22, 22) ); + psRPC->LINE_NUM_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 880+count*22, 22) ); + psRPC->LINE_DEN_COEFF[count] = CPLAtof( NITFGetField(szTemp, pachTreIMRFCA, 1320+count*22, 22) ); } psRPC->SUCCESS = 1; diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/GNUmakefile gdal-2.2.4+dfsg/frmts/pcraster/GNUmakefile --- gdal-2.2.3+dfsg/frmts/pcraster/GNUmakefile 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/GNUmakefile 2018-03-19 13:26:55.000000000 +0000 @@ -5,7 +5,7 @@ ifeq ($(PCRASTER_SETTING),internal) CPPFLAGS += -DUSE_IN_GDAL -Ilibcsf -OBJ = _getcell.o _getrow.o _gsomece.o _putcell.o _rputrow.o angle.o attravai.o attrsize.o cellsize.o create2.o csfglob.o csfsup.o delattr.o dumconv.o endian.o filename.o gattrblk.o gattridx.o gcellrep.o gdattype.o getattr.o getx0.o gety0.o ggisfid.o gmaxval.o gminval.o gnrcols.o gnrrows.o gproj.o gputproj.o gvalscal.o gvartype.o gversion.o ismv.o kernlcsf.o legend.o mclose.o mopen.o moreattr.o mperror.o pgisfid.o pmaxval.o pminval.o putallmv.o putattr.o putsomec.o putx0.o puty0.o pvalscal.o rattrblk.o rcomp.o rcoords.o rdup2.o reseterr.o rextend.o rmalloc.o rrowcol.o ruseas.o setangle.o setmv.o setvtmv.o strconst.o strpad.o swapio.o trackmm.o vs2.o vsdef.o vsis.o vsvers.o wattrblk.o +OBJ = _getcell.o _getrow.o _gsomece.o _putcell.o _rputrow.o angle.o attravai.o attrsize.o cellsize.o create2.o csfglob.o csfsup.o delattr.o dumconv.o endian.o file.o filename.o gattrblk.o gattridx.o gcellrep.o gdattype.o getattr.o getx0.o gety0.o ggisfid.o gmaxval.o gminval.o gnrcols.o gnrrows.o gproj.o gputproj.o gvalscal.o gvartype.o gversion.o ismv.o kernlcsf.o legend.o mclose.o mopen.o moreattr.o mperror.o pgisfid.o pmaxval.o pminval.o putallmv.o putattr.o putsomec.o putx0.o puty0.o pvalscal.o rattrblk.o rcomp.o rcoords.o rdup2.o reseterr.o rextend.o rmalloc.o rrowcol.o ruseas.o setangle.o setmv.o setvtmv.o strconst.o strpad.o swapio.o trackmm.o vs2.o vsdef.o vsis.o vsvers.o wattrblk.o endif OBJ += pcrasterdataset.o pcrastermisc.o pcrasterrasterband.o pcrasterutil.o diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/attrsize.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/attrsize.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/attrsize.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/attrsize.c 2018-03-19 13:26:55.000000000 +0000 @@ -1,5 +1,6 @@ #include "csf.h" #include "csfimpl.h" +#include /* get the size of an attribute (LIBRARY_INTERNAL) * returns diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/create2.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/create2.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/create2.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/create2.c 2018-03-19 13:26:55.000000000 +0000 @@ -193,14 +193,14 @@ /* enlarge the file to the length needed by seeking and writing one byte of crap */ - if ( fseek(newMap->fp, (long)(fileSize-1),SEEK_SET) || /* fsetpos() is better */ + if ( csf_fseek(newMap->fp, fileSize-1, SEEK_SET) || /* fsetpos() is better */ newMap->write(&crap, (size_t)1, (size_t)1, newMap->fp) != 1 ) { M_ERROR(NOSPACE); goto error_open; } (void)fflush(newMap->fp); - if ( ftell(newMap->fp) != (long)fileSize) + if ( csf_ftell(newMap->fp) != (CSF_FADDR)fileSize) { M_ERROR(NOSPACE); goto error_open; diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/csf.h gdal-2.2.4+dfsg/frmts/pcraster/libcsf/csf.h --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/csf.h 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/csf.h 2018-03-19 13:26:55.000000000 +0000 @@ -40,7 +40,12 @@ * (0) of the file */ typedef UINT4 CSF_FADDR32; -typedef long CSF_FADDR; +#if defined(_WIN32) && !defined(__MINGW32__) + /* long is 32 bit on Windows */ + typedef __int64 CSF_FADDR; +#else + typedef long CSF_FADDR; +#endif /* value for first 27 bytes of MAIN_HEADER.signature */ #define CSF_SIG "RUU CROSS SYSTEM MAP FORMAT" diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/csfimpl.h gdal-2.2.4+dfsg/frmts/pcraster/libcsf/csfimpl.h --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/csfimpl.h 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/csfimpl.h 2018-03-19 13:26:55.000000000 +0000 @@ -235,4 +235,11 @@ M_ERROR(ILLHANDLE); \ } + +int csf_fseek (FILE* file, + CSF_FADDR offset, + int origin); + +CSF_FADDR csf_ftell (FILE* file); + #endif /* CSF__IMPL_H */ diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/file.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/file.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/file.c 1970-01-01 00:00:00.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/file.c 2018-03-19 13:26:55.000000000 +0000 @@ -0,0 +1,26 @@ +#include "csf.h" +#include "csfimpl.h" + + +int csf_fseek( + FILE* file, + CSF_FADDR offset, + int origin) +{ +#if defined(_WIN32) && !defined(__MINGW32__) + return _fseeki64(file, offset, origin); +#else + return fseek(file, offset, origin); +#endif +} + + +CSF_FADDR csf_ftell( + FILE* file) +{ +#if defined(_WIN32) && !defined(__MINGW32__) + return _ftelli64(file); +#else + return ftell(file); +#endif +} diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/getattr.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/getattr.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/getattr.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/getattr.c 2018-03-19 13:26:55.000000000 +0000 @@ -37,7 +37,7 @@ *nmemb /= elSize; POSTCOND( (*nmemb) > 0); pos = b.attrs[i].attrOffset; - (void)fseek(m->fp, (long)pos, SEEK_SET); + (void)csf_fseek(m->fp, pos, SEEK_SET); m->read(attr,elSize, (size_t)(*nmemb),m->fp); return(id); } diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/_gsomece.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/_gsomece.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/_gsomece.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/_gsomece.c 2018-03-19 13:26:55.000000000 +0000 @@ -27,7 +27,7 @@ offset <<= LOG_CELLSIZE(inFileCR); readAt = ADDR_DATA + (CSF_FADDR)offset; - if( fseek(map->fp, (long)readAt, SEEK_SET) != 0 ) + if(csf_fseek(map->fp, readAt, SEEK_SET) != 0 ) return 0; cellsRead = map->read(buf, (size_t)CELLSIZE(inFileCR), (size_t)nrCells, map->fp); diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/legend.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/legend.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/legend.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/legend.c 2018-03-19 13:26:55.000000000 +0000 @@ -66,7 +66,7 @@ size_t i,nr,start = 0; if (pos == 0) return 0; - if( fseek(m->fp, (long)pos, SEEK_SET) != 0 ) + if( csf_fseek(m->fp, pos, SEEK_SET) != 0 ) return 0; if (id == ATTR_ID_LEGEND_V1) { diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/makefile.vc gdal-2.2.4+dfsg/frmts/pcraster/libcsf/makefile.vc --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/makefile.vc 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/makefile.vc 2018-03-19 13:26:55.000000000 +0000 @@ -7,7 +7,7 @@ vsvers.obj legend.obj strpad.obj strconst.obj vsis.obj ruseas.obj rmalloc.obj create2.obj \ _getcell.obj _getrow.obj _gsomece.obj _putcell.obj _rputrow.obj\ attravai.obj attrsize.obj csfglob.obj csfsup.obj delattr.obj\ -filename.obj gattrblk.obj gattridx.obj gcellrep.obj \ +file.obj filename.obj gattrblk.obj gattridx.obj gcellrep.obj \ cellsize.obj gdattype.obj getattr.obj getx0.obj\ gety0.obj ggisfid.obj gmaxval.obj gminval.obj gnrcols.obj gnrrows.obj\ gproj.obj gputproj.obj gvalscal.obj gvartype.obj gversion.obj ismv.obj\ diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/mclose.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/mclose.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/mclose.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/mclose.c 2018-03-19 13:26:55.000000000 +0000 @@ -37,7 +37,7 @@ CsfSwap((void*)&(m->raster.maxVal), CELLSIZE(m->raster.cellRepr),(size_t)1); } - if(fseek(m->fp,(long)ADDR_MAIN_HEADER,SEEK_SET) != 0 || + if(csf_fseek(m->fp, ADDR_MAIN_HEADER,SEEK_SET) != 0 || m->write((void*)&(m->main.signature),sizeof(char), CSF_SIG_SPACE,m->fp) != CSF_SIG_SPACE || m->write((void*)&(m->main.version),sizeof(UINT2),(size_t)1,m->fp)!=1 || @@ -54,7 +54,7 @@ } - if ( fseek(m->fp,ADDR_SECOND_HEADER, SEEK_SET) != 0 || + if ( csf_fseek(m->fp,ADDR_SECOND_HEADER, SEEK_SET) != 0 || m->write((void*)&(m->raster.valueScale),sizeof(UINT2),(size_t)1,m->fp) !=1 || m->write((void*)&(m->raster.cellRepr), sizeof(UINT2),(size_t)1,m->fp) !=1 || fwrite((void*)&(m->raster.minVal), sizeof(CSF_VAR_TYPE),(size_t)1,m->fp) !=1 || diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/mopen.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/mopen.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/mopen.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/mopen.c 2018-03-19 13:26:55.000000000 +0000 @@ -85,14 +85,14 @@ * fail */ - (void)fseek(m->fp,0L, SEEK_END); - if (ftell(m->fp) < (long)ADDR_DATA) + (void)csf_fseek(m->fp,0, SEEK_END); + if (csf_ftell(m->fp) < ADDR_DATA) { M_ERROR(NOT_CSF); goto error_open; } - (void)fseek(m->fp, 14+CSF_SIG_SPACE, SEEK_SET); + (void)csf_fseek(m->fp, 14+CSF_SIG_SPACE, SEEK_SET); if (1 != fread((void *)&s, sizeof(UINT4),(size_t)1,m->fp)) { fprintf(stderr, "WARNING: Unable to read ORD_OK in CSF.\n"); @@ -116,7 +116,7 @@ #endif } - (void)fseek(m->fp, ADDR_MAIN_HEADER, SEEK_SET); + (void)csf_fseek(m->fp, ADDR_MAIN_HEADER, SEEK_SET); m->read((void *)&(m->main.signature), sizeof(char), CSF_SIG_SPACE,m->fp); m->read((void *)&(m->main.version), sizeof(UINT2),(size_t)1,m->fp); m->read((void *)&(m->main.gisFileId), sizeof(UINT4),(size_t)1,m->fp); @@ -127,7 +127,7 @@ /* 14+CSF_SIG_SPACE */ - (void)fseek(m->fp, ADDR_SECOND_HEADER, SEEK_SET); + (void)csf_fseek(m->fp, ADDR_SECOND_HEADER, SEEK_SET); m->read((void *)&(m->raster.valueScale), sizeof(UINT2),(size_t)1,m->fp); m->read((void *)&(m->raster.cellRepr), sizeof(UINT2),(size_t)1,m->fp); diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/putattr.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/putattr.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/putattr.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/putattr.c 2018-03-19 13:26:55.000000000 +0000 @@ -1,5 +1,7 @@ #include "csf.h" #include "csfimpl.h" +#include +#include /* make block empty */ @@ -177,10 +179,16 @@ noPosFound = 0; break; case ATTR_NOT_USED: - if (i+1 == NR_ATTR_IN_BLOCK) + /* + KDJ: Commented out because control flow will never + reach it. See while condition above. + Added assert to document/verify this. + if (i == NR_ATTR_IN_BLOCK) endBlock = b.next; else - endBlock = b.attrs[i+1].attrOffset; + */ + assert(i < NR_ATTR_IN_BLOCK); + endBlock = b.attrs[i+1].attrOffset; if ( (size_t)( endBlock - b.attrs[i].attrOffset) >= size) /* this position can hold the attr */ @@ -210,7 +218,7 @@ M_ERROR(WRITE_ERROR); resultPos = 0; } - if( fseek(m->fp, (long)resultPos, SEEK_SET) != 0 ) /* fsetpos() is better */ + if( csf_fseek(m->fp, resultPos, SEEK_SET) != 0 ) /* fsetpos() is better */ { M_ERROR(WRITE_ERROR); resultPos = 0; diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/putsomec.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/putsomec.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/putsomec.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/putsomec.c 2018-03-19 13:26:55.000000000 +0000 @@ -257,7 +257,7 @@ writeAt = ((CSF_FADDR)offset) << LOG_CELLSIZE(cr); writeAt += ADDR_DATA; - if( fseek(map->fp, (long)writeAt, SEEK_SET) != 0 ) + if( csf_fseek(map->fp, writeAt, SEEK_SET) != 0 ) return 0; return(map->write(buf, (size_t)CELLSIZE(cr), (size_t)nrCells, map->fp)); } diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/rattrblk.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/rattrblk.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/rattrblk.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/rattrblk.c 2018-03-19 13:26:55.000000000 +0000 @@ -9,7 +9,7 @@ ATTR_CNTRL_BLOCK *b) /* write-only. attribute control block read */ { int i; - if (fseek(m->fp, (long)pos, SEEK_SET) != 0 ) + if (csf_fseek(m->fp, pos, SEEK_SET) != 0 ) return; for(i=0; i < NR_ATTR_IN_BLOCK; i++) { diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/README gdal-2.2.4+dfsg/frmts/pcraster/libcsf/README --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/README 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/README 2018-03-19 13:26:55.000000000 +0000 @@ -2,10 +2,9 @@ More information about PCRaster can be found at: http://www.pcraster.eu -http://pcraster.geo.uu.nl Questions can be directed to the PCRaster mailing list: http://pcraster.geo.uu.nl/support/questions-2/ -Bug reports can be submitted to the PCRaster SourceForge page: -http://sourceforge.net/p/pcraster/bugs-and-feature-requests/milestone/PCRaster/ +Bug reports can be submitted to the Github page: +https://github.com/pcraster/rasterformat/issues diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/ruseas.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/ruseas.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/ruseas.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/ruseas.c 2018-03-19 13:26:55.000000000 +0000 @@ -1,5 +1,6 @@ #include "csf.h" #include "csfimpl.h" +#include static void UINT1tLdd(size_t nrCells, void *Buf) { diff -Nru gdal-2.2.3+dfsg/frmts/pcraster/libcsf/wattrblk.c gdal-2.2.4+dfsg/frmts/pcraster/libcsf/wattrblk.c --- gdal-2.2.3+dfsg/frmts/pcraster/libcsf/wattrblk.c 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/pcraster/libcsf/wattrblk.c 2018-03-19 13:26:54.000000000 +0000 @@ -12,7 +12,7 @@ { int i; - if ( fseek(m->fp,(long) pos, SEEK_SET) ) + if ( csf_fseek(m->fp, pos, SEEK_SET) ) return 1; for(i=0; i < NR_ATTR_IN_BLOCK; i++) diff -Nru gdal-2.2.3+dfsg/frmts/raw/ehdrdataset.cpp gdal-2.2.4+dfsg/frmts/raw/ehdrdataset.cpp --- gdal-2.2.3+dfsg/frmts/raw/ehdrdataset.cpp 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/raw/ehdrdataset.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -57,7 +57,7 @@ #include "ogr_core.h" #include "ogr_spatialref.h" -CPL_CVSID("$Id: ehdrdataset.cpp 37531 2017-03-01 04:56:18Z goatbar $"); +CPL_CVSID("$Id: ehdrdataset.cpp 41628 2018-03-04 11:38:29Z rouault $"); static const int HAS_MIN_FLAG = 0x1; static const int HAS_MAX_FLAG = 0x2; @@ -167,16 +167,18 @@ return RawRasterBand::IReadBlock(nBlockXOff, nBlockYOff, pImage); // Establish desired position. - const vsi_l_offset nLineBytesBig = - (static_cast(nPixelOffsetBits) * nBlockXSize + 7) / 8; - if( nLineBytesBig > - static_cast(std::numeric_limits::max()) ) - return CE_Failure; - const unsigned int nLineBytes = static_cast(nLineBytesBig); const vsi_l_offset nLineStart = (nStartBit + nLineOffsetBits * nBlockYOff) / 8; int iBitOffset = static_cast((nStartBit + nLineOffsetBits * nBlockYOff) % 8); + const vsi_l_offset nLineEnd = + (nStartBit + nLineOffsetBits * nBlockYOff + + static_cast(nPixelOffsetBits) * nBlockXSize - 1) / 8; + const vsi_l_offset nLineBytesBig = nLineEnd - nLineStart + 1; + if( nLineBytesBig > + static_cast(std::numeric_limits::max()) ) + return CE_Failure; + const unsigned int nLineBytes = static_cast(nLineBytesBig); // Read data into buffer. GByte *pabyBuffer = static_cast(VSI_MALLOC_VERBOSE(nLineBytes)); @@ -229,16 +231,18 @@ return RawRasterBand::IWriteBlock(nBlockXOff, nBlockYOff, pImage); // Establish desired position. - const vsi_l_offset nLineBytesBig = - (static_cast(nPixelOffsetBits) * nBlockXSize + 7) / 8; - if( nLineBytesBig > - static_cast(std::numeric_limits::max()) ) - return CE_Failure; - const unsigned int nLineBytes = static_cast(nLineBytesBig); const vsi_l_offset nLineStart = (nStartBit + nLineOffsetBits * nBlockYOff) / 8; int iBitOffset = static_cast((nStartBit + nLineOffsetBits * nBlockYOff) % 8); + const vsi_l_offset nLineEnd = + (nStartBit + nLineOffsetBits * nBlockYOff + + static_cast(nPixelOffsetBits) * nBlockXSize - 1) / 8; + const vsi_l_offset nLineBytesBig = nLineEnd - nLineStart + 1; + if( nLineBytesBig > + static_cast(std::numeric_limits::max()) ) + return CE_Failure; + const unsigned int nLineBytes = static_cast(nLineBytesBig); // Read data into buffer. GByte *pabyBuffer = diff -Nru gdal-2.2.3+dfsg/frmts/raw/rrasterdataset.cpp gdal-2.2.4+dfsg/frmts/raw/rrasterdataset.cpp --- gdal-2.2.3+dfsg/frmts/raw/rrasterdataset.cpp 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/raw/rrasterdataset.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -33,7 +33,7 @@ #include "rawdataset.h" #include "ogr_spatialref.h" -CPL_CVSID("$Id: rrasterdataset.cpp 36682 2016-12-04 20:34:45Z rouault $"); +CPL_CVSID("$Id: rrasterdataset.cpp 41816 2018-03-16 11:33:00Z rouault $"); /************************************************************************/ /* ==================================================================== */ @@ -509,10 +509,10 @@ poDS->SetBand( i, poBand ); if( EQUAL(osDataType, "INT1S") ) { - poDS->GetRasterBand(i)->SetMetadataItem( - "SIGNEDBYTE", "PIXELTYPE", "IMAGE_STRUCTURE" ); + poDS->GetRasterBand(i)->GDALRasterBand::SetMetadataItem( + "PIXELTYPE", "SIGNEDBYTE", "IMAGE_STRUCTURE" ); } - if( !EQUAL(osNoDataValue, "NA") ) + if( !osNoDataValue.empty() && !EQUAL(osNoDataValue, "NA") ) { double dfNoDataValue = CPLAtof(osNoDataValue); poBand->SetNoDataValue(dfNoDataValue); diff -Nru gdal-2.2.3+dfsg/frmts/sentinel2/sentinel2dataset.cpp gdal-2.2.4+dfsg/frmts/sentinel2/sentinel2dataset.cpp --- gdal-2.2.3+dfsg/frmts/sentinel2/sentinel2dataset.cpp 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/sentinel2/sentinel2dataset.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -49,7 +49,7 @@ #define STARTS_WITH_CI(a,b) EQUALN(a,b,strlen(b)) #endif -CPL_CVSID("$Id: sentinel2dataset.cpp 40547 2017-10-24 17:42:31Z rouault $"); +CPL_CVSID("$Id: sentinel2dataset.cpp 41673 2018-03-09 14:12:44Z rouault $"); CPL_C_START // TODO: Leave this declaration while Sentinel2 folks use this as a @@ -3266,7 +3266,7 @@ } GDALProxyPoolDataset* proxyDS = NULL; - if( bIsPreview ) + if( bIsPreview || bIsTCI ) { proxyDS = oMapPVITile[osTile]; if( proxyDS == NULL ) @@ -3300,7 +3300,7 @@ if( nBand != nAlphaBand ) { - poBand->AddSimpleSource( proxyDS->GetRasterBand((bIsPreview) ? nBand : 1), + poBand->AddSimpleSource( proxyDS->GetRasterBand((bIsPreview || bIsTCI) ? nBand : 1), 0, 0, oGranuleInfo.nWidth, oGranuleInfo.nHeight, diff -Nru gdal-2.2.3+dfsg/frmts/vrt/vrtderivedrasterband.cpp gdal-2.2.4+dfsg/frmts/vrt/vrtderivedrasterband.cpp --- gdal-2.2.3+dfsg/frmts/vrt/vrtderivedrasterband.cpp 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/vrt/vrtderivedrasterband.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -49,7 +49,7 @@ /*! @cond Doxygen_Suppress */ -CPL_CVSID("$Id: vrtderivedrasterband.cpp 38039 2017-04-16 13:08:39Z rouault $"); +CPL_CVSID("$Id: vrtderivedrasterband.cpp 41339 2018-01-26 12:21:36Z rouault $"); // #define GDAL_VRT_DISABLE_PYTHON // #define PYTHONSO_DEFAULT "libpython2.7.so" @@ -463,24 +463,27 @@ // First try in the current process in case the python symbols would // be already loaded HANDLE hProcess = GetCurrentProcess(); - HMODULE ahModules[100]; + const size_t nMaxModules = 10000; + HMODULE* pahModules = static_cast( + CPLMalloc(nMaxModules * sizeof(HMODULE))); DWORD nSizeNeeded = 0; - EnumProcessModules(hProcess, ahModules, sizeof(ahModules), + EnumProcessModules(hProcess, pahModules, nMaxModules * sizeof(HMODULE), &nSizeNeeded); const size_t nModules = - std::min(size_t(100), + std::min(nMaxModules, static_cast(nSizeNeeded) / sizeof(HMODULE)); for( size_t i = 0; i < nModules; i++ ) { - if( GetProcAddress(ahModules[i], "Py_SetProgramName") ) + if( GetProcAddress(pahModules[i], "Py_SetProgramName") ) { - libHandle = ahModules[i]; + libHandle = pahModules[i]; CPLDebug("VRT", "Current process has python symbols loaded"); break; } } + CPLFree(pahModules); // Then try the user provided shared object name if( libHandle == NULL && pszPythonSO != NULL ) diff -Nru gdal-2.2.3+dfsg/frmts/vrt/vrtrasterband.cpp gdal-2.2.4+dfsg/frmts/vrt/vrtrasterband.cpp --- gdal-2.2.3+dfsg/frmts/vrt/vrtrasterband.cpp 2017-11-20 10:45:38.000000000 +0000 +++ gdal-2.2.4+dfsg/frmts/vrt/vrtrasterband.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -49,7 +49,7 @@ /*! @cond Doxygen_Suppress */ -CPL_CVSID("$Id: vrtrasterband.cpp 37310 2017-02-06 11:42:54Z goatbar $"); +CPL_CVSID("$Id: vrtrasterband.cpp 41753 2018-03-12 15:58:55Z rouault $"); /************************************************************************/ /* ==================================================================== */ @@ -1099,7 +1099,7 @@ || iOverview >= static_cast( poVRTDS->m_apoOverviews.size() ) ) return NULL; - return poVRTDS->m_apoOverviews[iOverview]->GetRasterBand(nBand); + return poVRTDS->m_apoOverviews[iOverview]->GetRasterBand(nBand ? nBand : 1); } return NULL; diff -Nru gdal-2.2.3+dfsg/gcore/gdal_version.h gdal-2.2.4+dfsg/gcore/gdal_version.h --- gdal-2.2.3+dfsg/gcore/gdal_version.h 2017-11-20 10:45:40.000000000 +0000 +++ gdal-2.2.4+dfsg/gcore/gdal_version.h 2018-03-19 13:26:55.000000000 +0000 @@ -1,4 +1,4 @@ -/* $Id: gdal_version.h 40767 2017-11-20 10:39:34Z rouault $ */ +/* $Id: gdal_version.h 41865 2018-03-19 12:04:41Z rouault $ */ /* -------------------------------------------------------------------- */ /* GDAL Version Information. */ @@ -7,7 +7,7 @@ #ifndef GDAL_VERSION_MAJOR # define GDAL_VERSION_MAJOR 2 # define GDAL_VERSION_MINOR 2 -# define GDAL_VERSION_REV 3 +# define GDAL_VERSION_REV 4 # define GDAL_VERSION_BUILD 0 #endif @@ -23,8 +23,8 @@ #endif #ifndef GDAL_RELEASE_DATE -# define GDAL_RELEASE_DATE 20171120 +# define GDAL_RELEASE_DATE 20180319 #endif #ifndef GDAL_RELEASE_NAME -# define GDAL_RELEASE_NAME "2.2.3" +# define GDAL_RELEASE_NAME "2.2.4" #endif diff -Nru gdal-2.2.3+dfsg/GDALmake.opt.in gdal-2.2.4+dfsg/GDALmake.opt.in --- gdal-2.2.3+dfsg/GDALmake.opt.in 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/GDALmake.opt.in 2018-03-19 13:26:56.000000000 +0000 @@ -120,7 +120,7 @@ # libtool targets and help variables LIBGDAL := libgdal.la LIBGDAL_CURRENT := 23 -LIBGDAL_REVISION := 2 +LIBGDAL_REVISION := 3 LIBGDAL_AGE := 3 # native build targets and variables diff -Nru gdal-2.2.3+dfsg/gnm/gnm_frmts/file/gnmfilenetwork.cpp gdal-2.2.4+dfsg/gnm/gnm_frmts/file/gnmfilenetwork.cpp --- gdal-2.2.3+dfsg/gnm/gnm_frmts/file/gnmfilenetwork.cpp 2017-11-20 10:45:31.000000000 +0000 +++ gdal-2.2.4+dfsg/gnm/gnm_frmts/file/gnmfilenetwork.cpp 2018-03-19 13:26:52.000000000 +0000 @@ -31,7 +31,7 @@ #include "gnmfile.h" #include "gnm_priv.h" -CPL_CVSID("$Id: gnmfilenetwork.cpp 36741 2016-12-07 16:22:35Z rouault $"); +CPL_CVSID("$Id: gnmfilenetwork.cpp 41303 2018-01-20 18:19:40Z rouault $"); GNMFileNetwork::GNMFileNetwork() : GNMGenericNetwork() { @@ -101,10 +101,10 @@ } m_poLayerDriver = m_pMetadataDS->GetDriver(); - const char* pszExt = CPLGetExtension(soMetadatafile); + CPLString osExt = CPLGetExtension(soMetadatafile); CPLString soGraphfile = CPLFormFilename(m_soNetworkFullName, - GNM_SYSLAYER_GRAPH, pszExt); + GNM_SYSLAYER_GRAPH, osExt); m_pGraphDS = (GDALDataset*) GDALOpenEx( soGraphfile, GDAL_OF_VECTOR | GDAL_OF_UPDATE, NULL, NULL, NULL ); if( NULL == m_pGraphDS ) @@ -120,7 +120,7 @@ } CPLString soFeaturesfile = CPLFormFilename(m_soNetworkFullName, - GNM_SYSLAYER_FEATURES, pszExt); + GNM_SYSLAYER_FEATURES, osExt); m_pFeaturesDS = (GDALDataset*) GDALOpenEx( soFeaturesfile, GDAL_OF_VECTOR | GDAL_OF_UPDATE, NULL, NULL, NULL ); if( NULL == m_pFeaturesDS ) diff -Nru gdal-2.2.3+dfsg/man/man1/gdal2tiles.1 gdal-2.2.4+dfsg/man/man1/gdal2tiles.1 --- gdal-2.2.3+dfsg/man/man1/gdal2tiles.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal2tiles.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal2tiles" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal2tiles" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdaladdo.1 gdal-2.2.4+dfsg/man/man1/gdaladdo.1 --- gdal-2.2.3+dfsg/man/man1/gdaladdo.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdaladdo.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdaladdo" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdaladdo" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalbuildvrt.1 gdal-2.2.4+dfsg/man/man1/gdalbuildvrt.1 --- gdal-2.2.3+dfsg/man/man1/gdalbuildvrt.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalbuildvrt.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalbuildvrt" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalbuildvrt" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_calc.1 gdal-2.2.4+dfsg/man/man1/gdal_calc.1 --- gdal-2.2.3+dfsg/man/man1/gdal_calc.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_calc.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_calc" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_calc" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalcompare.1 gdal-2.2.4+dfsg/man/man1/gdalcompare.1 --- gdal-2.2.3+dfsg/man/man1/gdalcompare.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalcompare.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalcompare" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalcompare" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal-config.1 gdal-2.2.4+dfsg/man/man1/gdal-config.1 --- gdal-2.2.3+dfsg/man/man1/gdal-config.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal-config.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal-config" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal-config" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_contour.1 gdal-2.2.4+dfsg/man/man1/gdal_contour.1 --- gdal-2.2.3+dfsg/man/man1/gdal_contour.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_contour.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_contour" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_contour" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdaldem.1 gdal-2.2.4+dfsg/man/man1/gdaldem.1 --- gdal-2.2.3+dfsg/man/man1/gdaldem.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdaldem.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdaldem" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdaldem" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_edit.1 gdal-2.2.4+dfsg/man/man1/gdal_edit.1 --- gdal-2.2.3+dfsg/man/man1/gdal_edit.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_edit.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_edit" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_edit" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_fillnodata.1 gdal-2.2.4+dfsg/man/man1/gdal_fillnodata.1 --- gdal-2.2.3+dfsg/man/man1/gdal_fillnodata.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_fillnodata.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_fillnodata" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_fillnodata" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_grid.1 gdal-2.2.4+dfsg/man/man1/gdal_grid.1 --- gdal-2.2.3+dfsg/man/man1/gdal_grid.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_grid.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_grid" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_grid" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalinfo.1 gdal-2.2.4+dfsg/man/man1/gdalinfo.1 --- gdal-2.2.3+dfsg/man/man1/gdalinfo.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalinfo.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalinfo" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalinfo" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdallocationinfo.1 gdal-2.2.4+dfsg/man/man1/gdallocationinfo.1 --- gdal-2.2.3+dfsg/man/man1/gdallocationinfo.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdallocationinfo.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdallocationinfo" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdallocationinfo" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalmanage.1 gdal-2.2.4+dfsg/man/man1/gdalmanage.1 --- gdal-2.2.3+dfsg/man/man1/gdalmanage.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalmanage.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalmanage" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalmanage" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_merge.1 gdal-2.2.4+dfsg/man/man1/gdal_merge.1 --- gdal-2.2.3+dfsg/man/man1/gdal_merge.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_merge.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_merge" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_merge" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalmove.1 gdal-2.2.4+dfsg/man/man1/gdalmove.1 --- gdal-2.2.3+dfsg/man/man1/gdalmove.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalmove.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalmove" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalmove" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_pansharpen.1 gdal-2.2.4+dfsg/man/man1/gdal_pansharpen.1 --- gdal-2.2.3+dfsg/man/man1/gdal_pansharpen.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_pansharpen.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_pansharpen" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_pansharpen" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_polygonize.1 gdal-2.2.4+dfsg/man/man1/gdal_polygonize.1 --- gdal-2.2.3+dfsg/man/man1/gdal_polygonize.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_polygonize.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_polygonize" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_polygonize" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_proximity.1 gdal-2.2.4+dfsg/man/man1/gdal_proximity.1 --- gdal-2.2.3+dfsg/man/man1/gdal_proximity.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_proximity.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_proximity" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_proximity" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_rasterize.1 gdal-2.2.4+dfsg/man/man1/gdal_rasterize.1 --- gdal-2.2.3+dfsg/man/man1/gdal_rasterize.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_rasterize.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_rasterize" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_rasterize" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_retile.1 gdal-2.2.4+dfsg/man/man1/gdal_retile.1 --- gdal-2.2.3+dfsg/man/man1/gdal_retile.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_retile.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_retile" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_retile" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_sieve.1 gdal-2.2.4+dfsg/man/man1/gdal_sieve.1 --- gdal-2.2.3+dfsg/man/man1/gdal_sieve.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_sieve.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_sieve" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_sieve" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalsrsinfo.1 gdal-2.2.4+dfsg/man/man1/gdalsrsinfo.1 --- gdal-2.2.3+dfsg/man/man1/gdalsrsinfo.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalsrsinfo.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalsrsinfo" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalsrsinfo" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdaltindex.1 gdal-2.2.4+dfsg/man/man1/gdaltindex.1 --- gdal-2.2.3+dfsg/man/man1/gdaltindex.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdaltindex.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdaltindex" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdaltindex" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdaltransform.1 gdal-2.2.4+dfsg/man/man1/gdaltransform.1 --- gdal-2.2.3+dfsg/man/man1/gdaltransform.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdaltransform.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdaltransform" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdaltransform" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_translate.1 gdal-2.2.4+dfsg/man/man1/gdal_translate.1 --- gdal-2.2.3+dfsg/man/man1/gdal_translate.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_translate.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_translate" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_translate" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdal_utilities.1 gdal-2.2.4+dfsg/man/man1/gdal_utilities.1 --- gdal-2.2.3+dfsg/man/man1/gdal_utilities.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdal_utilities.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdal_utilities" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdal_utilities" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gdalwarp.1 gdal-2.2.4+dfsg/man/man1/gdalwarp.1 --- gdal-2.2.3+dfsg/man/man1/gdalwarp.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gdalwarp.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gdalwarp" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gdalwarp" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gnmanalyse.1 gdal-2.2.4+dfsg/man/man1/gnmanalyse.1 --- gdal-2.2.3+dfsg/man/man1/gnmanalyse.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gnmanalyse.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gnmanalyse" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gnmanalyse" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gnmmanage.1 gdal-2.2.4+dfsg/man/man1/gnmmanage.1 --- gdal-2.2.3+dfsg/man/man1/gnmmanage.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gnmmanage.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gnmmanage" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gnmmanage" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/gnm_utilities.1 gdal-2.2.4+dfsg/man/man1/gnm_utilities.1 --- gdal-2.2.3+dfsg/man/man1/gnm_utilities.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/gnm_utilities.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "gnm_utilities" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "gnm_utilities" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/nearblack.1 gdal-2.2.4+dfsg/man/man1/nearblack.1 --- gdal-2.2.3+dfsg/man/man1/nearblack.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/nearblack.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "nearblack" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "nearblack" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogr2ogr.1 gdal-2.2.4+dfsg/man/man1/ogr2ogr.1 --- gdal-2.2.3+dfsg/man/man1/ogr2ogr.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogr2ogr.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogr2ogr" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogr2ogr" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogrinfo.1 gdal-2.2.4+dfsg/man/man1/ogrinfo.1 --- gdal-2.2.3+dfsg/man/man1/ogrinfo.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogrinfo.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogrinfo" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogrinfo" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogrlineref.1 gdal-2.2.4+dfsg/man/man1/ogrlineref.1 --- gdal-2.2.3+dfsg/man/man1/ogrlineref.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogrlineref.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogrlineref" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogrlineref" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogrmerge.1 gdal-2.2.4+dfsg/man/man1/ogrmerge.1 --- gdal-2.2.3+dfsg/man/man1/ogrmerge.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogrmerge.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogrmerge" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogrmerge" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogrtindex.1 gdal-2.2.4+dfsg/man/man1/ogrtindex.1 --- gdal-2.2.3+dfsg/man/man1/ogrtindex.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogrtindex.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogrtindex" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogrtindex" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/ogr_utilities.1 gdal-2.2.4+dfsg/man/man1/ogr_utilities.1 --- gdal-2.2.3+dfsg/man/man1/ogr_utilities.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/ogr_utilities.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "ogr_utilities" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "ogr_utilities" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/pct2rgb.1 gdal-2.2.4+dfsg/man/man1/pct2rgb.1 --- gdal-2.2.3+dfsg/man/man1/pct2rgb.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/pct2rgb.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "pct2rgb" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "pct2rgb" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/man/man1/rgb2pct.1 gdal-2.2.4+dfsg/man/man1/rgb2pct.1 --- gdal-2.2.3+dfsg/man/man1/rgb2pct.1 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/man/man1/rgb2pct.1 2018-03-19 13:26:56.000000000 +0000 @@ -1,4 +1,4 @@ -.TH "rgb2pct" 1 "Mon Nov 20 2017" "GDAL" \" -*- nroff -*- +.TH "rgb2pct" 1 "Mon Mar 19 2018" "GDAL" \" -*- nroff -*- .ad l .nh .SH NAME diff -Nru gdal-2.2.3+dfsg/NEWS gdal-2.2.4+dfsg/NEWS --- gdal-2.2.3+dfsg/NEWS 2017-11-20 10:45:33.000000000 +0000 +++ gdal-2.2.4+dfsg/NEWS 2018-03-19 13:26:53.000000000 +0000 @@ -1,3 +1,114 @@ += GDAL/OGR 2.2.4 Release Notes = + +The 2.2.4 release is a bug fix release. + +== Build == + + * configure: add support for ECW SDK 5.4, by detecting if we must link against the newabi or oldabi link + +== Port == + + * CPLSetErrorHandler(): avoid later crashes when passing a null callback (https://github.com/OSGeo/gdal/pull/298) + +== GDAL utilities == + + * gdalinfo: make sure to display geodetic coordinates always in degree (and not potentially in another unit such as grad) (#4198) + * gdalinfo / VRT: fix crash with implicit overviews on per-dataset mask band (https://github.com/mapbox/rasterio/issues/1266#issuecomment-367233149) + * gdalwarp: fix when several input datasets with different SRS are specified, and no explicit target SRS is provided (#7170) + * gdal_rasterize: fix crash in some situations with ALL_TOUCHED option (#7176) + +== GDAL algorithms == + + * Warping: use panSrcBands[0] in the single band case (regression fix, https://github.com/OSGeo/gdal/pull/295) + +== GDAL drivers == + +AirSAR driver: + * fix computation of imaginary part in C23 case (#7222) + +EHdr driver: + * fix read heap buffer overflow with nbits < 8. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6724. Credit to OSS Fuzz + +GTiff driver: + * use consistently multiplication/division by 257 when converting between GDAL [0,255] range to TIFF [0,65535] range for color map values (#2213) + +netCDF driver: + * behave correctly when an extra dimension of a variable has a corresponding 1D variable of different names (#7165) + +NITF driver: + * fix swapped lines and samples in IMRFCA (https://github.com/OSGeo/gdal/pull/289) + +PCRaster driver: + * fix fseek/ftell for large files on Windows (#7255) + +RRASTER driver: + * fix wrong declaration of PIXELTYPE=SIGNEDBYTE for datatype=INT1S + * fix reading empty nodatavalue keyword + +Sentinel2 driver: + * make sure that the True Color Image subdatset really uses the R,G,B bands and not the R,R,R (#7251) + +VRT driver: + * VRTDerivedRasterBand: fix detection of Python runtime already loaded when more than 100 modules are linked. Fixes QGIS3 use case (#7213) + +== OGR core == + + * Fixed memory leak in OGRPolygon::PointOnSurface method (https://github.com/OSGeo/gdal/pull/269) + * OGRCT: make sure to free the proj4 context after freeing the projection objects, to avoid crashes + +== OGR utilities == + + * ogr2ogr: honour -select when using -addfiels; fix converting from Memory to Memory datasources (#7217) + +== OGR drivers == + +Carto driver: + * fix append mode by retrieving the sequence name for the primary key (#7203) + * fix insertion with ogr2ogr -preserve_fid (#7216) + * fix missing features when iterating over a SQL result layer with pagination (#6880) + +GeoJSON driver: + * fix writing of id with RFC7946=YES (#7194) + * Add support for json-c v0.13 (#7195) + +GPKG driver: + * fix incorrect rtree___update3 trigger statement, as found in https://github.com/opengeospatial/geopackage/issues/414 + +LIBKML driver: + * workaround Windows specific issue with libkml (at least the version used by OSGeo4W at time of writing), where tabulations as coordinate separators aren't properly handled (#7231) + * workaround Windows specific issue if the content of is non-empty and does not contain any digit (#7232) + +MITAB driver: + * fix crash on reading TAB views (#7171) + * add support for SWEREF99 datum (#7256) + +NAS driver: + * also accept unqualified attribute name in wfs:Update + * fix memory leak and potential assertion. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2661. Credit to OSS Fuzz + +NTF driver: + * fix regression introduced by fix for https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2166 causing some valid records to be skipped (#7204) + +Shapefile driver: + * fix write heap buffer overflow when provided with empty string filename. Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6992. Credit to OSS Fuzz + * fix potential read heap buffer overflow in single-point polygon in SHPRewindObject(). Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6993. Credit to OSS Fuzz + +ODBC driver: + * deal with table names that require double quoting (#7242) + +XLSX driver: + * fix updating multi layer document where existing layers where dropped (#7225) + * on writing, use %.16g formatting for floating point numbers (#7230) + +== GNM == + * avoid potential issue with CPL circular buffers (can happen if there are extra drivers that use CPLGet....() functions) + +== SWIG bindings == + + * Fix potential null pointer dereference in Python/Perl Dataset.WriteRaster() and Perl Dataset.ReadRaster() when buffer type is not specified and there is a single band + * Python bindings: add addFields and forceNullable options to gdal.VectorTranslate() (#7217) + * Python bindings: fix build when CC variable is made of serveral words + = GDAL/OGR 2.2.3 Release Notes = The 2.2.3 release is a bug fix release. @@ -113,8 +224,6 @@ GTM driver: * fix null pointer dereference in case of read error (https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4047) -KML / LIBKML drivers: - MDB driver: * fix multi-thread support (https://issues.qgis.org/issues/16039) diff -Nru gdal-2.2.3+dfsg/ogr/ogrct.cpp gdal-2.2.4+dfsg/ogr/ogrct.cpp --- gdal-2.2.3+dfsg/ogr/ogrct.cpp 2017-11-20 10:45:33.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrct.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -44,7 +44,7 @@ #include "proj_api.h" #endif -CPL_CVSID("$Id: ogrct.cpp 37166 2017-01-17 16:38:53Z rouault $"); +CPL_CVSID("$Id: ogrct.cpp 41301 2018-01-20 17:57:14Z rouault $"); /* ==================================================================== */ /* PROJ.4 interface stuff. */ @@ -545,13 +545,13 @@ if( pjctx != NULL ) { - pfn_pj_ctx_free(pjctx); - if( psPJSource != NULL ) pfn_pj_free( psPJSource ); if( psPJTarget != NULL ) pfn_pj_free( psPJTarget ); + + pfn_pj_ctx_free(pjctx); } else { diff -Nru gdal-2.2.3+dfsg/ogr/ogrgeometry.cpp gdal-2.2.4+dfsg/ogr/ogrgeometry.cpp --- gdal-2.2.3+dfsg/ogr/ogrgeometry.cpp 2017-11-20 10:45:33.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrgeometry.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -56,7 +56,7 @@ #define UNUSED_IF_NO_GEOS #endif -CPL_CVSID("$Id: ogrgeometry.cpp 38291 2017-05-14 00:40:31Z rouault $"); +CPL_CVSID("$Id: ogrgeometry.cpp 40911 2017-12-02 15:02:10Z rouault $"); //! @cond Doxygen_Suppress int OGRGeometry::bGenerate_DB2_V72_BYTE_ORDER = FALSE; @@ -5262,6 +5262,8 @@ poPoint->setY( poInsidePoint->getY() ); } + OGR_G_DestroyGeometry(hInsidePoint); + return OGRERR_NONE; } //! @endcond diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogr_carto.h gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogr_carto.h --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogr_carto.h 2017-11-20 10:45:37.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogr_carto.h 2018-03-19 13:26:53.000000000 +0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: ogr_carto.h 36687 2016-12-04 22:28:14Z rouault $ + * $Id: ogr_carto.h 41751 2018-03-12 15:25:43Z rouault $ * * Project: CARTO Translator * Purpose: Definition of classes for OGR Carto driver. @@ -74,7 +74,8 @@ bool bEOF; int nFetchedObjects; int iNextInFetchedObjects; - GIntBig iNext; + GIntBig m_nNextFID; + GIntBig m_nNextOffset; json_object *poCachedObj; virtual OGRFeature *GetNextRawFeature(); @@ -94,7 +95,7 @@ virtual OGRFeatureDefn * GetLayerDefn() override; virtual OGRFeatureDefn * GetLayerDefnInternal(json_object* poObjIn) = 0; - virtual json_object* FetchNewFeatures(GIntBig iNext); + virtual json_object* FetchNewFeatures(); virtual const char* GetFIDColumn() override { return osFIDColName.c_str(); } @@ -128,7 +129,7 @@ bool bInDeferredInsert; InsertState eDeferredInsertState; CPLString osDeferredInsertSQL; - GIntBig nNextFID; + GIntBig m_nNextFIDWrite; bool bDeferredCreation; bool bCartodbfy; @@ -144,7 +145,7 @@ virtual const char* GetName() override { return osName.c_str(); } virtual OGRFeatureDefn * GetLayerDefnInternal(json_object* poObjIn) override; - virtual json_object* FetchNewFeatures(GIntBig iNext) override; + virtual json_object* FetchNewFeatures() override; virtual GIntBig GetFeatureCount( int bForce = TRUE ) override; virtual OGRFeature *GetFeature( GIntBig nFeatureId ) override; diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogrcartolayer.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogrcartolayer.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogrcartolayer.cpp 2017-11-20 10:45:37.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogrcartolayer.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -30,7 +30,7 @@ #include "ogr_p.h" #include "ogrgeojsonreader.h" -CPL_CVSID("$Id: ogrcartolayer.cpp 37371 2017-02-13 11:41:59Z rouault $"); +CPL_CVSID("$Id: ogrcartolayer.cpp 41751 2018-03-12 15:25:43Z rouault $"); /************************************************************************/ /* OGRCARTOLayer() */ @@ -71,7 +71,8 @@ bEOF = false; nFetchedObjects = -1; iNextInFetchedObjects = 0; - iNext = 0; + m_nNextOffset = 0; + m_nNextFID = 0; } /************************************************************************/ @@ -107,7 +108,7 @@ } else { - poFeature->SetFID(iNext); + poFeature->SetFID(m_nNextFID); } for(int i=0;iGetFieldCount();i++) @@ -168,7 +169,7 @@ /* FetchNewFeatures() */ /************************************************************************/ -json_object* OGRCARTOLayer::FetchNewFeatures(GIntBig iNextIn) +json_object* OGRCARTOLayer::FetchNewFeatures() { CPLString osSQL = osBaseSQL; if( osSQL.ifind("SELECT") != std::string::npos && @@ -177,7 +178,7 @@ osSQL += " LIMIT "; osSQL += CPLSPrintf("%d", GetFeaturesToFetch()); osSQL += " OFFSET "; - osSQL += CPLSPrintf(CPL_FRMT_GIB, iNextIn); + osSQL += CPLSPrintf(CPL_FRMT_GIB, m_nNextOffset); } return poDS->RunSQL(osSQL); } @@ -204,7 +205,7 @@ GetLayerDefn(); } - json_object* poObj = FetchNewFeatures(iNext); + json_object* poObj = FetchNewFeatures(); if( poObj == NULL ) { bEOF = true; @@ -240,7 +241,8 @@ iNextInFetchedObjects ++; OGRFeature* poFeature = BuildFeature(poRowObj); - iNext = poFeature->GetFID() + 1; + m_nNextOffset ++; + m_nNextFID = poFeature->GetFID() + 1; return poFeature; } diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp 2017-11-20 10:45:37.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/carto/ogrcartotablelayer.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -31,7 +31,7 @@ #include "ogr_pgdump.h" #include "ogrgeojsonreader.h" -CPL_CVSID("$Id: ogrcartotablelayer.cpp 37371 2017-02-13 11:41:59Z rouault $"); +CPL_CVSID("$Id: ogrcartotablelayer.cpp 41751 2018-03-12 15:25:43Z rouault $"); /************************************************************************/ /* OGRCARTOEscapeIdentifier( ) */ @@ -88,7 +88,7 @@ bLaunderColumnNames = true; bInDeferredInsert = poDS->DoBatchInsert(); eDeferredInsertState = INSERT_UNINIT; - nNextFID = -1; + m_nNextFIDWrite = -1; bDeferredCreation = false; bCartodbfy = false; nMaxChunkSize = atoi(CPLGetConfigOption("CARTO_MAX_CHUNK_SIZE", @@ -311,7 +311,7 @@ /* FetchNewFeatures() */ /************************************************************************/ -json_object* OGRCARTOTableLayer::FetchNewFeatures(GIntBig iNextIn) +json_object* OGRCARTOTableLayer::FetchNewFeatures() { if( !osFIDColName.empty() ) { @@ -320,13 +320,13 @@ osSELECTWithoutWHERE.c_str(), ( osWHERE.size() ) ? CPLSPrintf("%s AND ", osWHERE.c_str()) : "", OGRCARTOEscapeIdentifier(osFIDColName).c_str(), - iNext, + m_nNextFID, OGRCARTOEscapeIdentifier(osFIDColName).c_str(), GetFeaturesToFetch()); return poDS->RunSQL(osSQL); } else - return OGRCARTOLayer::FetchNewFeatures(iNextIn); + return OGRCARTOLayer::FetchNewFeatures(); } /************************************************************************/ @@ -454,7 +454,7 @@ if( bReset ) { bInDeferredInsert = false; - nNextFID = -1; + m_nNextFIDWrite = -1; } return eErr; } @@ -591,32 +591,53 @@ CPLString osSQL; bool bHasJustGotNextFID = false; - if( !bHasUserFieldMatchingFID && bInDeferredInsert && nNextFID < 0 && !osFIDColName.empty() ) + if( !bHasUserFieldMatchingFID && bInDeferredInsert && m_nNextFIDWrite < 0 && !osFIDColName.empty() ) { - osSQL.Printf("SELECT nextval('%s') AS nextid", - OGRCARTOEscapeLiteral(CPLSPrintf("%s_%s_seq", osName.c_str(), osFIDColName.c_str())).c_str()); - + CPLString osSeqName; + osSQL.Printf("SELECT pg_catalog.pg_get_serial_sequence('%s', '%s') AS seq_name", + OGRCARTOEscapeLiteral(osName).c_str(), + OGRCARTOEscapeLiteral(osFIDColName).c_str()); json_object* poObj = poDS->RunSQL(osSQL); json_object* poRowObj = OGRCARTOGetSingleRow(poObj); if( poRowObj != NULL ) { - json_object* poID = CPL_json_object_object_get(poRowObj, "nextid"); - if( poID != NULL && json_object_get_type(poID) == json_type_int ) + json_object* poSeqName = CPL_json_object_object_get(poRowObj, "seq_name"); + if( poSeqName != NULL && json_object_get_type(poSeqName) == json_type_string ) { - nNextFID = json_object_get_int64(poID); - bHasJustGotNextFID = true; + osSeqName = json_object_get_string(poSeqName); } } if( poObj != NULL ) json_object_put(poObj); + + if( !osSeqName.empty() ) + { + osSQL.Printf("SELECT nextval('%s') AS nextid", + OGRCARTOEscapeLiteral(osSeqName).c_str()); + + poObj = poDS->RunSQL(osSQL); + poRowObj = OGRCARTOGetSingleRow(poObj); + if( poRowObj != NULL ) + { + json_object* poID = CPL_json_object_object_get(poRowObj, "nextid"); + if( poID != NULL && json_object_get_type(poID) == json_type_int ) + { + m_nNextFIDWrite = json_object_get_int64(poID); + bHasJustGotNextFID = true; + } + } + + if( poObj != NULL ) + json_object_put(poObj); + } } // Check if we can go on with multiple insertion mode if( eDeferredInsertState == INSERT_MULTIPLE_FEATURE ) { if( !bHasUserFieldMatchingFID && !osFIDColName.empty() && - (poFeature->GetFID() != OGRNullFID || (nNextFID >= 0 && bHasJustGotNextFID)) ) + (poFeature->GetFID() != OGRNullFID || (m_nNextFIDWrite >= 0 && bHasJustGotNextFID)) ) { if( FlushDeferredInsert(false) != OGRERR_NONE ) return OGRERR_FAILURE; @@ -632,7 +653,7 @@ eDeferredInsertState = INSERT_SINGLE_FEATURE; } else if( !bHasUserFieldMatchingFID && !osFIDColName.empty() && - (poFeature->GetFID() != OGRNullFID || (nNextFID >= 0 && bHasJustGotNextFID)) ) + (poFeature->GetFID() != OGRNullFID || (m_nNextFIDWrite >= 0 && bHasJustGotNextFID)) ) { eDeferredInsertState = INSERT_SINGLE_FEATURE; bResetToUninitInsertStateAfterwards = true; @@ -687,7 +708,7 @@ } if( !bHasUserFieldMatchingFID && - !osFIDColName.empty() && (poFeature->GetFID() != OGRNullFID || (nNextFID >= 0 && bHasJustGotNextFID)) ) + !osFIDColName.empty() && (poFeature->GetFID() != OGRNullFID || (m_nNextFIDWrite >= 0 && bHasJustGotNextFID)) ) { if( bMustComma ) osSQL += ", "; @@ -801,20 +822,9 @@ CPLFree(pszEWKB); } - if( !bHasUserFieldMatchingFID ) + if( bWriteInsertInto && !bHasUserFieldMatchingFID && !osFIDColName.empty() ) { - if( !osFIDColName.empty() && nNextFID >= 0 ) - { - if( bHasJustGotNextFID ) - { - if( bMustComma ) - osSQL += ", "; - // No need to set bMustComma to true in else case. - // Not in a loop. - osSQL += CPLSPrintf(CPL_FRMT_GIB, nNextFID); - } - } - else if( !osFIDColName.empty() && poFeature->GetFID() != OGRNullFID ) + if( poFeature->GetFID() != OGRNullFID ) { if( bMustComma ) osSQL += ", "; @@ -823,15 +833,24 @@ osSQL += CPLSPrintf(CPL_FRMT_GIB, poFeature->GetFID()); } + else if( m_nNextFIDWrite >= 0 && bHasJustGotNextFID ) + { + if( bMustComma ) + osSQL += ", "; + // No need to set bMustComma to true in else case. + // Not in a loop. + osSQL += CPLSPrintf(CPL_FRMT_GIB, m_nNextFIDWrite); + } } osSQL += ")"; } - if( !bHasUserFieldMatchingFID && !osFIDColName.empty() && nNextFID >= 0 ) + if( !bHasUserFieldMatchingFID && !osFIDColName.empty() && m_nNextFIDWrite >= 0 && + poFeature->GetFID() == OGRNullFID ) { - poFeature->SetFID(nNextFID); - nNextFID ++; + poFeature->SetFID(m_nNextFIDWrite); + m_nNextFIDWrite ++; } if( bInDeferredInsert ) @@ -1384,7 +1403,7 @@ bool bCartodbfyIn ) { bDeferredCreation = true; - nNextFID = 1; + m_nNextFIDWrite = 1; CPLAssert(poFeatureDefn == NULL); bCartodbfy = bCartodbfyIn; poFeatureDefn = new OGRFeatureDefn(osName); diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp 2017-11-20 10:45:35.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwritelayer.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -32,7 +32,7 @@ #include -CPL_CVSID("$Id: ogrgeojsonwritelayer.cpp 37472 2017-02-26 02:47:45Z goatbar $"); +CPL_CVSID("$Id: ogrgeojsonwritelayer.cpp 41192 2018-01-04 18:37:00Z rouault $"); // Remove annoying warnings Microsoft Visual C++. #if defined(_MSC_VER) @@ -151,6 +151,7 @@ { poFeatureToWrite = new OGRFeature(poFeatureDefn_); poFeatureToWrite->SetFrom( poFeature ); + poFeatureToWrite->SetFID( poFeature->GetFID() ); OGRGeometry* poGeometry = poFeatureToWrite->GetGeometryRef(); if( poGeometry ) { diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp 2017-11-20 10:45:35.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/geojson/ogrgeojsonwriter.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -27,17 +27,23 @@ * DEALINGS IN THE SOFTWARE. ****************************************************************************/ +#define JSON_C_VER_013 (13 << 8) + #include "ogrgeojsonwriter.h" #include "ogrgeojsonutils.h" #include "ogr_geojson.h" #include "ogrgeojsonreader.h" #include // JSON-C + +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) #include +#endif + #include #include #include -CPL_CVSID("$Id: ogrgeojsonwriter.cpp 39217 2017-06-20 20:43:30Z rouault $"); +CPL_CVSID("$Id: ogrgeojsonwriter.cpp 41200 2018-01-05 18:08:49Z rouault $"); /************************************************************************/ @@ -1381,13 +1387,17 @@ { // TODO(schwehr): Explain this casting. const int nPrecision = +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) static_cast(reinterpret_cast(jso->_userdata)); +#else + static_cast(reinterpret_cast(json_object_get_userdata(jso))); +#endif char szBuffer[75] = {}; - OGRFormatDouble( szBuffer, sizeof(szBuffer), jso->o.c_double, '.', + OGRFormatDouble( szBuffer, sizeof(szBuffer), json_object_get_double(jso), '.', (nPrecision < 0) ? 15 : nPrecision ); if( szBuffer[0] == 't' /*oobig */ ) { - CPLsnprintf(szBuffer, sizeof(szBuffer), "%.18g", jso->o.c_double); + CPLsnprintf(szBuffer, sizeof(szBuffer), "%.18g", json_object_get_double(jso)); } return printbuf_memappend(pb, szBuffer, static_cast(strlen(szBuffer))); } @@ -1417,11 +1427,11 @@ { char szBuffer[75] = {}; int nSize = 0; - if( CPLIsNan(jso->o.c_double)) + if( CPLIsNan(json_object_get_double(jso))) nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "NaN"); - else if( CPLIsInf(jso->o.c_double) ) + else if( CPLIsInf(json_object_get_double(jso)) ) { - if( jso->o.c_double > 0 ) + if( json_object_get_double(jso) > 0 ) nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "Infinity"); else nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), "-Infinity"); @@ -1429,13 +1439,17 @@ else { char szFormatting[32] = {}; +#if (!defined(JSON_C_VERSION_NUM)) || (JSON_C_VERSION_NUM < JSON_C_VER_013) const int nSignificantFigures = (int) (GUIntptr_t) jso->_userdata; +#else + const int nSignificantFigures = (int) (GUIntptr_t) json_object_get_userdata(jso); +#endif const int nInitialSignificantFigures = nSignificantFigures >= 0 ? nSignificantFigures : 17; CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); const char* pszDot = NULL; if( nSize+2 < static_cast(sizeof(szBuffer)) && (pszDot = strchr(szBuffer, '.')) == NULL ) @@ -1457,7 +1471,7 @@ CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures- i); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); pszDot = strchr(szBuffer, '.'); if( pszDot != NULL && strstr(pszDot, "999999") == NULL && @@ -1472,7 +1486,7 @@ CPLsnprintf(szFormatting, sizeof(szFormatting), "%%.%dg", nInitialSignificantFigures); nSize = CPLsnprintf(szBuffer, sizeof(szBuffer), - szFormatting, jso->o.c_double); + szFormatting, json_object_get_double(jso)); if( nSize+2 < static_cast(sizeof(szBuffer)) && strchr(szBuffer, '.') == NULL ) { diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp 2017-11-20 10:45:35.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -33,7 +33,7 @@ #include "cpl_time.h" #include "ogr_p.h" -CPL_CVSID("$Id: ogrgeopackagetablelayer.cpp 40670 2017-11-09 15:24:07Z rouault $"); +CPL_CVSID("$Id: ogrgeopackagetablelayer.cpp 41766 2018-03-13 09:21:58Z rouault $"); static const char UNSUPPORTED_OP_READ_ONLY[] = "%s : unsupported operation on a read-only datasource."; @@ -2598,7 +2598,7 @@ Actions : Remove record from rtree for old Insert record into rtree for new */ pszSQL = sqlite3_mprintf( - "CREATE TRIGGER \"%w_update3\" AFTER UPDATE OF \"%w\" ON \"%w\" " + "CREATE TRIGGER \"%w_update3\" AFTER UPDATE ON \"%w\" " "WHEN OLD.\"%w\" != NEW.\"%w\" AND " "(NEW.\"%w\" NOTNULL AND NOT ST_IsEmpty(NEW.\"%w\")) " "BEGIN " @@ -2609,7 +2609,7 @@ "ST_MinY(NEW.\"%w\"), ST_MaxY(NEW.\"%w\")" "); " "END", - m_osRTreeName.c_str(), pszC, pszT, + m_osRTreeName.c_str(), pszT, pszI, pszI, pszC, pszC, m_osRTreeName.c_str(), pszI, diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/libkml/ogrlibkmldatasource.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/libkml/ogrlibkmldatasource.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/libkml/ogrlibkmldatasource.cpp 2017-11-20 10:45:34.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/libkml/ogrlibkmldatasource.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -35,7 +35,7 @@ #include "ogr_p.h" #include "cpl_vsi_error.h" -CPL_CVSID("$Id: ogrlibkmldatasource.cpp 39692 2017-07-30 19:32:43Z rouault $"); +CPL_CVSID("$Id: ogrlibkmldatasource.cpp 41434 2018-02-07 13:47:57Z rouault $"); using kmlbase::Attributes; using kmldom::ContainerPtr; @@ -137,6 +137,46 @@ } oKml[nPos+2] = 'S'; } + + // Workaround Windows specific issue with libkml (at least the version + // used by OSGeo4W at time of writing), where tabulations as + // coordinate separators aren't properly handled + //(see https://trac.osgeo.org/gdal/ticket/7231) + // Another Windows specific issue is that if the content of + // is non-empty and does not contain any digit, + // libkml hangs (see https://trac.osgeo.org/gdal/ticket/7232) + nPos = 0; + while( true ) + { + nPos = oKml.find("", nPos); + if( nPos == std::string::npos ) + { + break; + } + size_t nPosEnd = oKml.find("", nPos); + if( nPosEnd == std::string::npos ) + { + break; + } + nPos += strlen(""); + size_t nPosAfterCoordinates = nPos; + bool bDigitFound = false; + for( ; nPos < nPosEnd; nPos++ ) + { + if( oKml[nPos] >= '0' && oKml[nPos] <= '9' ) + bDigitFound = true; + else if( oKml[nPos] == '\t' ) + oKml[nPos] = ' '; + } + if( !bDigitFound ) + { + oKml.replace(nPosAfterCoordinates, + nPosEnd + strlen("") - + nPosAfterCoordinates, + ""); + nPos = nPosAfterCoordinates + strlen(""); + } + } } /************************************************************************/ diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp 2017-11-20 10:45:34.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/mitab/mitab_spatialref.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -45,7 +45,7 @@ #include "ogr_spatialref.h" #include "ogr_srs_api.h" -CPL_CVSID("$Id: mitab_spatialref.cpp 38702 2017-05-30 21:46:38Z rouault $"); +CPL_CVSID("$Id: mitab_spatialref.cpp 41774 2018-03-13 14:25:48Z rouault $"); /* -------------------------------------------------------------------- */ /* This table was automatically generated by doing translations */ @@ -100,6 +100,7 @@ { 0, 32, "GRS_67", 21,0, 0, 0, 0, 0, 0, 0, 0}, { 0, 33, "GRS_80", 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6171, 33, "Reseau_Geodesique_Francais_1993",0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 6619, 33, "SWEREF99", 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6675, 34, "Guam_1963", 7, -100, -248, 259, 0, 0, 0, 0, 0}, { 0, 35, "Gux_1_Astro", 4, 252, -209, -751,0, 0, 0, 0, 0}, { 6254, 36, "Hito_XVIII_1963", 4, 16, 196, 93, 0, 0, 0, 0, 0}, diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp 2017-11-20 10:45:34.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/mitab/mitab_tabview.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -50,7 +50,7 @@ #include "ogr_geometry.h" #include "ogr_spatialref.h" -CPL_CVSID("$Id: mitab_tabview.cpp 37351 2017-02-12 05:22:20Z goatbar $"); +CPL_CVSID("$Id: mitab_tabview.cpp 40965 2017-12-06 13:41:33Z rouault $"); /*===================================================================== * class TABView @@ -1324,6 +1324,7 @@ /*----------------------------------------------------------------- * If selectedFields = "*" then select all fields from both tables *----------------------------------------------------------------*/ + papszSelectedFields = CSLDuplicate(papszSelectedFields); if (CSLCount(papszSelectedFields) == 1 && EQUAL(papszSelectedFields[0], "*") ) { diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/nas/nashandler.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/nas/nashandler.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/nas/nashandler.cpp 2017-11-20 10:45:36.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/nas/nashandler.cpp 2018-03-19 13:26:54.000000000 +0000 @@ -33,7 +33,7 @@ #include "cpl_string.h" #include "ogr_xerces.h" -CPL_CVSID("$Id: nashandler.cpp 39560 2017-07-12 08:53:28Z rouault $"); +CPL_CVSID("$Id: nashandler.cpp 41855 2018-03-17 16:03:50Z rouault $"); /* Update modes: @@ -517,26 +517,28 @@ { if( m_osElementName == "Name" && m_nDepth == m_nNameOrValueDepth ) { - CPLAssert( m_osLastPropertyName == "" ); - m_osLastPropertyName = m_pszCurField; + m_osLastPropertyName = m_pszCurField ? m_pszCurField : ""; + CPLFree(m_pszCurField); m_pszCurField = NULL; m_nNameOrValueDepth = 0; } else if( m_osElementName == "Value" && m_nDepth == m_nNameOrValueDepth ) { - CPLAssert( m_osLastPropertyValue == "" ); - m_osLastPropertyValue = m_pszCurField; + m_osLastPropertyValue = m_pszCurField ? m_pszCurField : ""; + CPLFree(m_pszCurField); m_pszCurField = NULL; m_nNameOrValueDepth = 0; } else if( m_nDepth == m_nUpdatePropertyDepth && m_osElementName == "Property" ) { - if( EQUAL( m_osLastPropertyName, "adv:lebenszeitintervall/adv:AA_Lebenszeitintervall/adv:endet" ) ) + if( EQUAL( m_osLastPropertyName, "adv:lebenszeitintervall/adv:AA_Lebenszeitintervall/adv:endet" ) || + EQUAL( m_osLastPropertyName, "lebenszeitintervall/AA_Lebenszeitintervall/endet" ) ) { CPLAssert( m_osLastPropertyValue != "" ); m_osLastEnded = m_osLastPropertyValue; } - else if( EQUAL( m_osLastPropertyName, "adv:anlass" ) ) + else if( EQUAL( m_osLastPropertyName, "adv:anlass" ) || + EQUAL( m_osLastPropertyName, "anlass" ) ) { CPLAssert( m_osLastPropertyValue != "" ); m_LastOccasions.push_back( m_osLastPropertyValue ); diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/ntf/ntffilereader.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/ntf/ntffilereader.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/ntf/ntffilereader.cpp 2017-11-20 10:45:36.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/ntf/ntffilereader.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -35,7 +35,7 @@ #include -CPL_CVSID("$Id: ntffilereader.cpp 39006 2017-06-09 07:55:52Z rouault $"); +CPL_CVSID("$Id: ntffilereader.cpp 41289 2018-01-18 11:46:21Z rouault $"); static int DefaultNTFRecordGrouper( NTFFileReader *, NTFRecord **, NTFRecord * ); @@ -951,7 +951,7 @@ iOffset = nEnd; if( iOffset >= poRecord->GetLength() ) { - bError = true; + bError = (iOffset > poRecord->GetLength()); break; } if( pszData[iOffset] == '\\' ) diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/odbc/ogrodbctablelayer.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/odbc/ogrodbctablelayer.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/odbc/ogrodbctablelayer.cpp 2017-11-20 10:45:37.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/odbc/ogrodbctablelayer.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -30,7 +30,7 @@ #include "cpl_conv.h" #include "ogr_odbc.h" -CPL_CVSID("$Id: ogrodbctablelayer.cpp 35911 2016-10-24 15:03:26Z goatbar $"); +CPL_CVSID("$Id: ogrodbctablelayer.cpp 41671 2018-03-09 14:03:10Z rouault $"); /************************************************************************/ /* OGRODBCTableLayer() */ /************************************************************************/ @@ -211,6 +211,32 @@ } /************************************************************************/ +/* EscapeAndQuoteIdentifier() */ +/************************************************************************/ + +static CPLString EscapeAndQuoteIdentifier(const CPLString& osStr) +{ + CPLString osRet; int num_dots = 0; + for( size_t i = 0; i < osStr.size(); i++ ) + { + if( osStr[i] == '"' ) + { + osRet += "\\\""; + } + else if (osStr[i] == '.' && num_dots == 0){ + /* It's schema qualified, so first segment we assume is the schema and should be quoted separately */ + osRet += "\".\""; + num_dots += 1; + } + else + { + osRet += osStr[i]; + } + } + return '"' + osRet + '"'; +} + +/************************************************************************/ /* ResetStatement() */ /************************************************************************/ @@ -223,7 +249,7 @@ poStmt = new CPLODBCStatement( poDS->GetSession() ); poStmt->Append( "SELECT * FROM " ); - poStmt->Append( poFeatureDefn->GetName() ); + poStmt->Append( EscapeAndQuoteIdentifier(poFeatureDefn->GetName()) ); /* Append attribute query if we have it */ if( pszQuery != NULL ) @@ -281,8 +307,10 @@ poStmt = new CPLODBCStatement( poDS->GetSession() ); poStmt->Append( "SELECT * FROM " ); - poStmt->Append( poFeatureDefn->GetName() ); - poStmt->Appendf( " WHERE %s = " CPL_FRMT_GIB, pszFIDColumn, nFeatureId ); + poStmt->Append( EscapeAndQuoteIdentifier(poFeatureDefn->GetName()) ); + poStmt->Appendf( " WHERE %s = " CPL_FRMT_GIB, + EscapeAndQuoteIdentifier(pszFIDColumn).c_str(), + nFeatureId ); if( !poStmt->ExecuteSQL() ) { @@ -348,7 +376,7 @@ CPLODBCStatement oStmt( poDS->GetSession() ); oStmt.Append( "SELECT COUNT(*) FROM " ); - oStmt.Append( poFeatureDefn->GetName() ); + oStmt.Append( EscapeAndQuoteIdentifier(poFeatureDefn->GetName()) ); if( pszQuery != NULL ) oStmt.Appendf( " WHERE %s", pszQuery ); diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/shape/dbfopen.c gdal-2.2.4+dfsg/ogr/ogrsf_frmts/shape/dbfopen.c --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/shape/dbfopen.c 2017-11-20 10:45:36.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/shape/dbfopen.c 2018-03-19 13:26:53.000000000 +0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: dbfopen.c 37046 2016-12-31 09:59:57Z rouault $ + * $Id: dbfopen.c 41846 2018-03-17 13:27:51Z rouault $ * * Project: Shapelib * Purpose: Implementation of .dbf access API documented in dbf_api.html. @@ -209,7 +209,7 @@ #define CPLsnprintf snprintf #endif -SHP_CVSID("$Id: dbfopen.c 37046 2016-12-31 09:59:57Z rouault $") +SHP_CVSID("$Id: dbfopen.c 41846 2018-03-17 13:27:51Z rouault $") #ifndef FALSE # define FALSE 0 @@ -504,12 +504,15 @@ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = (int)strlen(pszBasename)-1; - i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' - && pszBasename[i] != '\\'; - i-- ) {} - - if( pszBasename[i] == '.' ) - pszBasename[i] = '\0'; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; + i-- ) + { + if( pszBasename[i] == '.' ) + { + pszBasename[i] = '\0'; + break; + } + } nFullnameLen = strlen(pszBasename) + 5; pszFullname = (char *) malloc(nFullnameLen); @@ -778,12 +781,15 @@ pszBasename = (char *) malloc(strlen(pszFilename)+5); strcpy( pszBasename, pszFilename ); for( i = (int)strlen(pszBasename)-1; - i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' - && pszBasename[i] != '\\'; - i-- ) {} - - if( pszBasename[i] == '.' ) - pszBasename[i] = '\0'; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; + i-- ) + { + if( pszBasename[i] == '.' ) + { + pszBasename[i] = '\0'; + break; + } + } nFullnameLen = strlen(pszBasename) + 5; pszFullname = (char *) malloc(nFullnameLen); diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/shape/shpopen.c gdal-2.2.4+dfsg/ogr/ogrsf_frmts/shape/shpopen.c --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/shape/shpopen.c 2017-11-20 10:45:36.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/shape/shpopen.c 2018-03-19 13:26:53.000000000 +0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: shpopen.c 40020 2017-09-07 11:41:25Z rouault $ + * $Id: shpopen.c 41847 2018-03-17 13:36:44Z rouault $ * * Project: Shapelib * Purpose: Implementation of core Shapefile read/write functions. @@ -297,7 +297,7 @@ #include #include -SHP_CVSID("$Id: shpopen.c 40020 2017-09-07 11:41:25Z rouault $") +SHP_CVSID("$Id: shpopen.c 41847 2018-03-17 13:36:44Z rouault $") typedef unsigned char uchar; @@ -600,12 +600,15 @@ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = (int)strlen(pszBasename)-1; - i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' - && pszBasename[i] != '\\'; - i-- ) {} - - if( pszBasename[i] == '.' ) - pszBasename[i] = '\0'; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; + i-- ) + { + if( pszBasename[i] == '.' ) + { + pszBasename[i] = '\0'; + break; + } + } /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ @@ -970,12 +973,15 @@ pszBasename = (char *) malloc(strlen(pszLayer)+5); strcpy( pszBasename, pszLayer ); for( i = (int)strlen(pszBasename)-1; - i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' - && pszBasename[i] != '\\'; - i-- ) {} - - if( pszBasename[i] == '.' ) - pszBasename[i] = '\0'; + i > 0 && pszBasename[i] != '/' && pszBasename[i] != '\\'; + i-- ) + { + if( pszBasename[i] == '.' ) + { + pszBasename[i] = '\0'; + break; + } + } /* -------------------------------------------------------------------- */ /* Open the .shp file. Note that files pulled from */ @@ -2909,6 +2915,16 @@ int bInner, iVert, nVertCount, nVertStart, iCheckRing; double dfSum, dfTestX, dfTestY; + nVertStart = psObject->panPartStart[iOpRing]; + + if( iOpRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; + else + nVertCount = psObject->panPartStart[iOpRing+1] + - psObject->panPartStart[iOpRing]; + + if (nVertCount < 2) + continue; /* -------------------------------------------------------------------- */ /* Determine if this ring is an inner ring or an outer ring */ /* relative to all the other rings. For now we assume the */ @@ -2929,25 +2945,26 @@ bInner = FALSE; for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) { + int nVertStartCheck, nVertCountCheck; int iEdge; if( iCheckRing == iOpRing ) continue; - nVertStart = psObject->panPartStart[iCheckRing]; + nVertStartCheck = psObject->panPartStart[iCheckRing]; if( iCheckRing == psObject->nParts-1 ) - nVertCount = psObject->nVertices + nVertCountCheck = psObject->nVertices - psObject->panPartStart[iCheckRing]; else - nVertCount = psObject->panPartStart[iCheckRing+1] + nVertCountCheck = psObject->panPartStart[iCheckRing+1] - psObject->panPartStart[iCheckRing]; - for( iEdge = 0; iEdge < nVertCount; iEdge++ ) + for( iEdge = 0; iEdge < nVertCountCheck; iEdge++ ) { int iNext; - if( iEdge < nVertCount-1 ) + if( iEdge < nVertCountCheck-1 ) iNext = iEdge+1; else iNext = 0; @@ -2956,19 +2973,19 @@ * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) * The rule #1 also excludes edges colinear with the ray. */ - if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY - && dfTestY <= psObject->padfY[iNext+nVertStart] ) - || ( psObject->padfY[iNext+nVertStart] < dfTestY - && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) + if ( ( psObject->padfY[iEdge+nVertStartCheck] < dfTestY + && dfTestY <= psObject->padfY[iNext+nVertStartCheck] ) + || ( psObject->padfY[iNext+nVertStartCheck] < dfTestY + && dfTestY <= psObject->padfY[iEdge+nVertStartCheck] ) ) { /* Rule #2: * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) */ double const intersect = - ( psObject->padfX[iEdge+nVertStart] - + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) - / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) - * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); + ( psObject->padfX[iEdge+nVertStartCheck] + + ( dfTestY - psObject->padfY[iEdge+nVertStartCheck] ) + / ( psObject->padfY[iNext+nVertStartCheck] - psObject->padfY[iEdge+nVertStartCheck] ) + * ( psObject->padfX[iNext+nVertStartCheck] - psObject->padfX[iEdge+nVertStartCheck] ) ); if (intersect < dfTestX) { @@ -2982,16 +2999,6 @@ /* Determine the current order of this ring so we will know if */ /* it has to be reversed. */ /* -------------------------------------------------------------------- */ - nVertStart = psObject->panPartStart[iOpRing]; - - if( iOpRing == psObject->nParts-1 ) - nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; - else - nVertCount = psObject->panPartStart[iOpRing+1] - - psObject->panPartStart[iOpRing]; - - if (nVertCount < 2) - continue; dfSum = psObject->padfX[nVertStart] * (psObject->padfY[nVertStart+1] - psObject->padfY[nVertStart+nVertCount-1]); for( iVert = nVertStart + 1; iVert < nVertStart+nVertCount-1; iVert++ ) diff -Nru gdal-2.2.3+dfsg/ogr/ogrsf_frmts/xlsx/ogrxlsxdatasource.cpp gdal-2.2.4+dfsg/ogr/ogrsf_frmts/xlsx/ogrxlsxdatasource.cpp --- gdal-2.2.3+dfsg/ogr/ogrsf_frmts/xlsx/ogrxlsxdatasource.cpp 2017-11-20 10:45:35.000000000 +0000 +++ gdal-2.2.4+dfsg/ogr/ogrsf_frmts/xlsx/ogrxlsxdatasource.cpp 2018-03-19 13:26:53.000000000 +0000 @@ -32,7 +32,7 @@ #include "cpl_time.h" #include "cpl_vsi_error.h" -CPL_CVSID("$Id: ogrxlsxdatasource.cpp 40632 2017-11-04 11:29:43Z rouault $"); +CPL_CVSID("$Id: ogrxlsxdatasource.cpp 41415 2018-02-05 22:42:24Z rouault $"); namespace OGRXLSX { @@ -1880,7 +1880,7 @@ if (eType == OFTReal) { VSIFPrintfL(fp, "\n", szCol, iRow); - VSIFPrintfL(fp, "%.16f\n", poFeature->GetFieldAsDouble(j)); + VSIFPrintfL(fp, "%.16g\n", poFeature->GetFieldAsDouble(j)); VSIFPrintfL(fp, "\n"); } else if (eType == OFTInteger) @@ -1926,7 +1926,7 @@ if (eType == OFTDate) VSIFPrintfL(fp, "%d\n", (int)(dfNumberOfDaysSince1900 + 0.1)); else - VSIFPrintfL(fp, "%.16f\n", dfNumberOfDaysSince1900); + VSIFPrintfL(fp, "%.16g\n", dfNumberOfDaysSince1900); VSIFPrintfL(fp, "\n"); } else @@ -2091,6 +2091,12 @@ if( !bUpdated ) return; + /* Cause all layers to be loaded */ + for(int i = 0; iGetLayerDefn(); + } + VSIStatBufL sStat; if (VSIStatL(pszName, &sStat) == 0) { @@ -2102,12 +2108,6 @@ } } - /* Cause all layers to be initialized */ - for(int i = 0; iGetLayerDefn(); - } - /* Maintain new ZIP files opened */ CPLString osTmpFilename(CPLSPrintf("/vsizip/%s", pszName)); VSILFILE* fpZIP = VSIFOpenExL(osTmpFilename, "wb", true); diff -Nru gdal-2.2.3+dfsg/port/cpl_error.cpp gdal-2.2.4+dfsg/port/cpl_error.cpp --- gdal-2.2.3+dfsg/port/cpl_error.cpp 2017-11-20 10:45:32.000000000 +0000 +++ gdal-2.2.4+dfsg/port/cpl_error.cpp 2018-03-19 13:26:52.000000000 +0000 @@ -50,7 +50,7 @@ #define TIMESTAMP_DEBUG // #define MEMORY_DEBUG -CPL_CVSID("$Id: cpl_error.cpp 39443 2017-07-02 21:20:37Z rouault $"); +CPL_CVSID("$Id: cpl_error.cpp 41429 2018-02-07 10:13:35Z rouault $"); static CPLMutex *hErrorMutex = NULL; static void *pErrorHandlerUserData = NULL; @@ -594,10 +594,12 @@ /* -------------------------------------------------------------------- */ /* Invoke the current error handler. */ /* -------------------------------------------------------------------- */ + bool bDebugProcessed = false; if( psCtx->psHandlerStack != NULL ) { if( psCtx->psHandlerStack->bCatchDebug ) { + bDebugProcessed = true; psCtx->psHandlerStack->pfnHandler( CE_Debug, CPLE_None, pszMessage ); } @@ -608,30 +610,28 @@ { if( psNode->bCatchDebug ) { + bDebugProcessed = true; psNode->pfnHandler( CE_Debug, CPLE_None, pszMessage ); break; } psNode = psNode->psNext; } - if( psNode == NULL ) - { - CPLMutexHolderD( &hErrorMutex ); - if( gbCatchDebug ) - pfnErrorHandler( CE_Debug, CPLE_None, pszMessage ); - else - CPLDefaultErrorHandler( CE_Debug, CPLE_None, pszMessage ); - } } } - else + + if( !bDebugProcessed ) { CPLMutexHolderD( &hErrorMutex ); - if( pfnErrorHandler != NULL ) + if( gbCatchDebug ) { - if( gbCatchDebug ) + if( pfnErrorHandler != NULL ) + { pfnErrorHandler( CE_Debug, CPLE_None, pszMessage ); - else - CPLDefaultErrorHandler( CE_Debug, CPLE_None, pszMessage ); + } + } + else + { + CPLDefaultErrorHandler( CE_Debug, CPLE_None, pszMessage ); } } @@ -1009,10 +1009,7 @@ pfnOldHandler = pfnErrorHandler; - if( pfnErrorHandler == NULL ) - pfnErrorHandler = CPLDefaultErrorHandler; - else - pfnErrorHandler = pfnErrorHandlerNew; + pfnErrorHandler = pfnErrorHandlerNew; pErrorHandlerUserData = pUserData; } @@ -1173,7 +1170,7 @@ * debug messages. In some cases, this might not be desirable and the user * would prefer that the previous installed handler (or the default one if no * previous installed handler exists in the stack) deal with it. In which - * case, this function should be called with bCatchDebug. + * case, this function should be called with bCatchDebug = FALSE. * * @param bCatchDebug FALSE if the current error handler should not intercept * debug messages diff -Nru gdal-2.2.3+dfsg/swig/include/Dataset.i gdal-2.2.4+dfsg/swig/include/Dataset.i --- gdal-2.2.3+dfsg/swig/include/Dataset.i 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/include/Dataset.i 2018-03-19 13:26:56.000000000 +0000 @@ -1,5 +1,5 @@ /****************************************************************************** - * $Id: Dataset.i 37423 2017-02-19 13:25:24Z rouault $ + * $Id: Dataset.i 41075 2017-12-19 13:58:29Z rouault $ * * Name: Dataset.i * Project: GDAL Python Interface @@ -487,8 +487,8 @@ if ( buf_type != 0 ) { ntype = (GDALDataType) *buf_type; } else { - int lastband = GDALGetRasterCount( self ) - 1; - if (lastband < 0) + int lastband = GDALGetRasterCount( self ); + if (lastband <= 0) return CE_Failure; ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) ); } @@ -549,8 +549,8 @@ if ( buf_type != 0 ) { ntype = (GDALDataType) *buf_type; } else { - int lastband = GDALGetRasterCount( self ) - 1; - if (lastband < 0) + int lastband = GDALGetRasterCount( self ); + if (lastband <= 0) return CE_Failure; ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) ); } diff -Nru gdal-2.2.3+dfsg/swig/include/perl/gdal_perl.i gdal-2.2.4+dfsg/swig/include/perl/gdal_perl.i --- gdal-2.2.3+dfsg/swig/include/perl/gdal_perl.i 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/include/perl/gdal_perl.i 2018-03-19 13:26:56.000000000 +0000 @@ -143,8 +143,8 @@ # Note that the 1/100000 digits may be used to create more than one # CPAN release from one GDAL release. -our $VERSION = '2.0203'; -our $GDAL_VERSION = '2.2.3'; +our $VERSION = '2.0204'; +our $GDAL_VERSION = '2.2.4'; =pod diff -Nru gdal-2.2.3+dfsg/swig/include/perl/ogr_perl.i gdal-2.2.4+dfsg/swig/include/perl/ogr_perl.i --- gdal-2.2.3+dfsg/swig/include/perl/ogr_perl.i 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/include/perl/ogr_perl.i 2018-03-19 13:26:56.000000000 +0000 @@ -126,7 +126,7 @@ %perlcode %{ package Geo::OGR; -our $VERSION = '2.0203'; # this needs to be the same as that in gdal_perl.i +our $VERSION = '2.0204'; # this needs to be the same as that in gdal_perl.i Geo::GDAL->import(qw(:INTERNAL)); diff -Nru gdal-2.2.3+dfsg/swig/include/python/gdal_python.i gdal-2.2.4+dfsg/swig/include/python/gdal_python.i --- gdal-2.2.3+dfsg/swig/include/python/gdal_python.i 2017-11-20 10:45:42.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/include/python/gdal_python.i 2018-03-19 13:26:56.000000000 +0000 @@ -1,5 +1,5 @@ /* - * $Id: gdal_python.i 39126 2017-06-15 09:35:41Z rouault $ + * $Id: gdal_python.i 41373 2018-02-01 10:09:27Z rouault $ * * python specific code for gdal bindings. */ @@ -1179,6 +1179,8 @@ accessMode = None, srcSRS = None, dstSRS = None, reproject = True, SQLStatement = None, SQLDialect = None, where = None, selectFields = None, + addFields = False, + forceNullable = False, spatFilter = None, spatSRS = None, datasetCreationOptions = None, layerCreationOptions = None, @@ -1203,6 +1205,8 @@ SQLDialect --- SQL dialect ('OGRSQL', 'SQLITE', ...) where --- WHERE clause to apply to source layer(s) selectFields --- list of fields to select + addFields --- whether to add new fields found in source layers (to be used with accessMode == 'append') + forceNullable --- whether to drop NOT NULL constraints on newly created fields spatFilter --- spatial filter as (minX, minY, maxX, maxY) bounding box spatSRS --- SRS in which the spatFilter is expressed. If not specified, it is assumed to be the one of the layer(s) datasetCreationOptions --- list of dataset creation options @@ -1247,6 +1251,10 @@ new_options += ['-overwrite'] else: raise Exception('unhandled accessMode') + if addFields: + new_options += ['-addfields'] + if forceNullable: + new_options += ['-forceNullable'] if selectFields is not None: val = '' for item in selectFields: diff -Nru gdal-2.2.3+dfsg/swig/perl/gdal_wrap.cpp gdal-2.2.4+dfsg/swig/perl/gdal_wrap.cpp --- gdal-2.2.3+dfsg/swig/perl/gdal_wrap.cpp 2017-11-20 10:45:45.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/perl/gdal_wrap.cpp 2018-03-19 13:26:59.000000000 +0000 @@ -2718,8 +2718,8 @@ if ( buf_type != 0 ) { ntype = (GDALDataType) *buf_type; } else { - int lastband = GDALGetRasterCount( self ) - 1; - if (lastband < 0) + int lastband = GDALGetRasterCount( self ); + if (lastband <= 0) return CE_Failure; ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) ); } @@ -2757,8 +2757,8 @@ if ( buf_type != 0 ) { ntype = (GDALDataType) *buf_type; } else { - int lastband = GDALGetRasterCount( self ) - 1; - if (lastband < 0) + int lastband = GDALGetRasterCount( self ); + if (lastband <= 0) return CE_Failure; ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) ); } diff -Nru gdal-2.2.3+dfsg/swig/perl/lib/Geo/GDAL.pm gdal-2.2.4+dfsg/swig/perl/lib/Geo/GDAL.pm --- gdal-2.2.3+dfsg/swig/perl/lib/Geo/GDAL.pm 2017-11-20 10:45:45.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/perl/lib/Geo/GDAL.pm 2018-03-19 13:26:59.000000000 +0000 @@ -1056,8 +1056,8 @@ # Note that the 1/100000 digits may be used to create more than one # CPAN release from one GDAL release. -our $VERSION = '2.0203'; -our $GDAL_VERSION = '2.2.3'; +our $VERSION = '2.0204'; +our $GDAL_VERSION = '2.2.4'; =pod diff -Nru gdal-2.2.3+dfsg/swig/perl/lib/Geo/OGR.pm gdal-2.2.4+dfsg/swig/perl/lib/Geo/OGR.pm --- gdal-2.2.3+dfsg/swig/perl/lib/Geo/OGR.pm 2017-11-20 10:45:46.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/perl/lib/Geo/OGR.pm 2018-03-19 13:27:00.000000000 +0000 @@ -960,7 +960,7 @@ package Geo::OGR; -our $VERSION = '2.0203'; # this needs to be the same as that in gdal_perl.i +our $VERSION = '2.0204'; # this needs to be the same as that in gdal_perl.i Geo::GDAL->import(qw(:INTERNAL)); diff -Nru gdal-2.2.3+dfsg/swig/python/extensions/gdal_wrap.cpp gdal-2.2.4+dfsg/swig/python/extensions/gdal_wrap.cpp --- gdal-2.2.3+dfsg/swig/python/extensions/gdal_wrap.cpp 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/python/extensions/gdal_wrap.cpp 2018-03-19 13:26:55.000000000 +0000 @@ -4513,8 +4513,8 @@ if ( buf_type != 0 ) { ntype = (GDALDataType) *buf_type; } else { - int lastband = GDALGetRasterCount( self ) - 1; - if (lastband < 0) + int lastband = GDALGetRasterCount( self ); + if (lastband <= 0) return CE_Failure; ntype = GDALGetRasterDataType( GDALGetRasterBand( self, lastband ) ); } diff -Nru gdal-2.2.3+dfsg/swig/python/osgeo/gdal.py gdal-2.2.4+dfsg/swig/python/osgeo/gdal.py --- gdal-2.2.3+dfsg/swig/python/osgeo/gdal.py 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/python/osgeo/gdal.py 2018-03-19 13:26:55.000000000 +0000 @@ -581,6 +581,8 @@ accessMode = None, srcSRS = None, dstSRS = None, reproject = True, SQLStatement = None, SQLDialect = None, where = None, selectFields = None, + addFields = False, + forceNullable = False, spatFilter = None, spatSRS = None, datasetCreationOptions = None, layerCreationOptions = None, @@ -605,6 +607,8 @@ SQLDialect --- SQL dialect ('OGRSQL', 'SQLITE', ...) where --- WHERE clause to apply to source layer(s) selectFields --- list of fields to select + addFields --- whether to add new fields found in source layers (to be used with accessMode == 'append') + forceNullable --- whether to drop NOT NULL constraints on newly created fields spatFilter --- spatial filter as (minX, minY, maxX, maxY) bounding box spatSRS --- SRS in which the spatFilter is expressed. If not specified, it is assumed to be the one of the layer(s) datasetCreationOptions --- list of dataset creation options @@ -649,6 +653,10 @@ new_options += ['-overwrite'] else: raise Exception('unhandled accessMode') + if addFields: + new_options += ['-addfields'] + if forceNullable: + new_options += ['-forceNullable'] if selectFields is not None: val = '' for item in selectFields: diff -Nru gdal-2.2.3+dfsg/swig/python/README.txt gdal-2.2.4+dfsg/swig/python/README.txt --- gdal-2.2.3+dfsg/swig/python/README.txt 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/python/README.txt 2018-03-19 13:26:55.000000000 +0000 @@ -16,7 +16,7 @@ Dependencies ------------ - * libgdal (2.2.3 or greater) and header files (gdal-devel) + * libgdal (2.2.4 or greater) and header files (gdal-devel) * numpy (1.0.0 or greater) and header files (numpy-devel) (not explicitly required, but many examples and utilities will not work without it) diff -Nru gdal-2.2.3+dfsg/swig/python/setup.py gdal-2.2.4+dfsg/swig/python/setup.py --- gdal-2.2.3+dfsg/swig/python/setup.py 2017-11-20 10:45:41.000000000 +0000 +++ gdal-2.2.4+dfsg/swig/python/setup.py 2018-03-19 13:26:55.000000000 +0000 @@ -7,7 +7,7 @@ # Howard Butler hobu.inc@gmail.com -gdal_version = '2.2.2' +gdal_version = '2.2.4' import sys import os @@ -26,6 +26,9 @@ if 'CXX' in os.environ and os.environ['CXX'].strip().find(' ') >= 0: print('WARNING: "CXX=%s" was defined in the environment and contains more than one word. Unsetting it since that is incompatible of distutils' % os.environ['CXX']) del os.environ['CXX'] +if 'CC' in os.environ and os.environ['CC'].strip().find(' ') >= 0: + print('WARNING: "CC=%s" was defined in the environment and contains more than one word. Unsetting it since that is incompatible of distutils' % os.environ['CC']) + del os.environ['CC'] # --------------------------------------------------------------------------- # Switches diff -Nru gdal-2.2.3+dfsg/VERSION gdal-2.2.4+dfsg/VERSION --- gdal-2.2.3+dfsg/VERSION 2017-11-20 10:45:47.000000000 +0000 +++ gdal-2.2.4+dfsg/VERSION 2018-03-19 13:27:00.000000000 +0000 @@ -1 +1 @@ -2.2.3 +2.2.4