Skip to content

Commit 64377d4

Browse files
authored
Merge pull request #9289 from rouault/fix_9288
PMTiles: fix 'Non increasing tile_id' error when opening some files (fixes #9288)
2 parents ca55a91 + fecb13a commit 64377d4

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed
Binary file not shown.

autotest/ogr/ogr_pmtiles.py

+12
Original file line numberDiff line numberDiff line change
@@ -617,3 +617,15 @@ def test_ogr_pmtiles_read_corrupted_min_zoom_larger_than_30():
617617
ds = ogr.Open(tmpfilename)
618618
assert gdal.GetLastErrorMsg() == "Clamping max_zoom from 255 to 30"
619619
assert ds.GetMetadataItem("ZOOM_LEVEL") == "30"
620+
621+
622+
###############################################################################
623+
624+
625+
def test_ogr_pmtiles_read_with_many_directories():
626+
627+
ds = gdal.OpenEx(
628+
"data/pmtiles/subset7_truncated.pmtiles", open_options=["ZOOM_LEVEL=0"]
629+
)
630+
lyr = ds.GetLayer(0)
631+
assert lyr.GetFeatureCount() != 0

ogr/ogrsf_frmts/pmtiles/ogr_pmtiles.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ class OGRPMTilesTileIterator
202202
int m_nCurY = -1;
203203

204204
// for sanity checks. Must be increasing when walking through entries
205-
uint64_t m_nLastTileId = 0;
205+
static constexpr uint64_t INVALID_LAST_TILE_ID =
206+
std::numeric_limits<uint64_t>::max();
207+
uint64_t m_nLastTileId = INVALID_LAST_TILE_ID;
206208

207209
// Computed values from zoom leven and min/max x/y
208210
uint64_t m_nMinTileId = std::numeric_limits<uint64_t>::max();

ogr/ogrsf_frmts/pmtiles/ogrpmtilestileiterator.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ pmtiles::entry_zxy OGRPMTilesTileIterator::GetNextTile(uint32_t *pnRunLength)
250250
static_cast<uint8_t>(m_nZoomLevel), m_nCurX,
251251
m_nCurY);
252252
m_nMaxTileId = m_nMinTileId;
253-
m_nLastTileId = 0;
253+
m_nLastTileId = INVALID_LAST_TILE_ID;
254254
while (m_aoStack.size() > 1)
255255
m_aoStack.pop();
256256
const int nMinEntryIdx = find_tile_idx_lesser_or_equal(
@@ -323,7 +323,8 @@ pmtiles::entry_zxy OGRPMTilesTileIterator::GetNextTile(uint32_t *pnRunLength)
323323
break;
324324
}
325325

326-
if (sContext.sEntries[0].tile_id <= m_nLastTileId)
326+
if (m_nLastTileId != INVALID_LAST_TILE_ID &&
327+
sContext.sEntries[0].tile_id <= m_nLastTileId)
327328
{
328329
CPLError(CE_Failure, CPLE_AppDefined,
329330
"Non increasing tile_id");

0 commit comments

Comments
 (0)