| 970 | |
| 971 | private: |
| 972 | static std::unique_ptr<GDALDataset> |
| 973 | GetVRT(GDALDataset &src, const GDALDataset &dst, bool &resampled) |
| 974 | { |
| 975 | resampled = false; |
| 976 | |
| 977 | GDALGeoTransform srcGT, dstGT; |
| 978 | if (src.GetGeoTransform(srcGT) != CE_None) |
| 979 | { |
| 980 | return nullptr; |
| 981 | } |
| 982 | if (dst.GetGeoTransform(dstGT) != CE_None) |
| 983 | { |
| 984 | return nullptr; |
| 985 | } |
| 986 | |
| 987 | CPLStringList aosOptions; |
| 988 | aosOptions.AddString("-of"); |
| 989 | aosOptions.AddString("VRT"); |
| 990 | |
| 991 | aosOptions.AddString("-ot"); |
| 992 | aosOptions.AddString("Float64"); |
| 993 | |
| 994 | // Prevent warning message about Computed -srcwin outside source raster extent. |
| 995 | // We've already tested for this an issued a more understandable message. |
| 996 | aosOptions.AddString("--no-warn-about-outside-window"); |
| 997 | |
| 998 | if (srcGT != dstGT || src.GetRasterXSize() != dst.GetRasterXSize() || |
| 999 | src.GetRasterYSize() != dst.GetRasterYSize()) |
| 1000 | { |
| 1001 | const double dfColOffset = |
| 1002 | std::fmod(std::abs(srcGT.xorig - dstGT.xorig), dstGT.xscale); |
| 1003 | const double dfRowOffset = |
| 1004 | std::fmod(std::abs(srcGT.yorig - dstGT.yorig), dstGT.yscale); |
| 1005 | |
| 1006 | OGREnvelope oDstEnv; |
| 1007 | dst.GetExtent(&oDstEnv); |
| 1008 | |
| 1009 | aosOptions.AddString("-projwin"); |
| 1010 | aosOptions.AddString(CPLSPrintf("%.17g", oDstEnv.MinX)); |
| 1011 | aosOptions.AddString(CPLSPrintf("%.17g", oDstEnv.MaxY)); |
| 1012 | aosOptions.AddString(CPLSPrintf("%.17g", oDstEnv.MaxX)); |
| 1013 | aosOptions.AddString(CPLSPrintf("%.17g", oDstEnv.MinY)); |
| 1014 | |
| 1015 | if (srcGT.xscale != dstGT.xscale || srcGT.yscale != dstGT.yscale || |
| 1016 | std::abs(dfColOffset) > 1e-4 || std::abs(dfRowOffset) > 1e-4) |
| 1017 | { |
| 1018 | resampled = true; |
| 1019 | aosOptions.AddString("-r"); |
| 1020 | aosOptions.AddString("average"); |
| 1021 | } |
| 1022 | |
| 1023 | aosOptions.AddString("-tr"); |
| 1024 | aosOptions.AddString(CPLSPrintf("%.17g", dstGT.xscale)); |
| 1025 | aosOptions.AddString(CPLSPrintf("%.17g", std::abs(dstGT.yscale))); |
| 1026 | } |
| 1027 | |
| 1028 | std::unique_ptr<GDALDataset> ret; |
| 1029 |
no test coverage detected