Hi Roman, We ended up getting other reports of this problem, which appears to be associated with recent releases of the MSVC compiler. It has been fixed in GEOS main via https://github.com/libgeos/geos/pull/1453. That fix should show up in 3.14.2.
Thanks, Dan On Tue, Jun 9, 2026 at 6:11 AM Daniel Baston <[email protected]> wrote: > Hello Roman, > > Unfortunately, I haven't been able to reproduce the problem either locally > or on the GDAL CI builders. As the stack trace indicates a failure in the > GEOS library, I would suggest updating to the latest version of that > library and posting your issue to the bug tracker of that project [1] if > the problem persists. > > Dan > > [1] https://github.com/libgeos/geos/issues > > > > On Mon, Jun 8, 2026 at 8:21 AM Daniel Baston <[email protected]> wrote: > >> Hello Roman, >> >> Could you please share your input file, either in a GitHub issue or to me >> by email? I don't recall a recent bug like this, so you may have found a >> new issue. >> >> Thanks, >> Dan >> >> On Mon, Jun 8, 2026 at 7:17 AM Roman Plöhn via gdal-dev < >> [email protected]> wrote: >> >>> Hello, >>> >>> in our company we since many years use GDAL (for building C++ software >>> for Windows only) from VCPKG. >>> >>> The GDAL version used in the most recent VCPKG is 3.12.4#2, in which I >>> encounter a reproducable crash in RELEASE builds when opening a file >>> downloaded from a Map-Tiles server, as soon as I iterate through its layers. >>> >>> My main question about this problem is if this problem is already fixed >>> in a more recent GDAL version ... if so I could send the VCPKG-maintainers >>> a feature request to ask them to update the GDAL package in there to a >>> version, where it doesn't crash anymore. >>> >>> Below is a description of the problem. If needed I can send the file in >>> question. >>> >>> For us this is a serioes issue, because it hinders us from using a >>> recent version of VCPKG at all (we even use the dependend lib mapnik, which >>> needs GDAL). >>> >>> I really hope someone can help me ... >>> >>> Best regards, >>> >>> have a nice day, >>> >>> Roman >>> >>> >>> >>> >>> The function I use to reproduce the crash is quite simpel: >>> >>> auto GetLayerFeaureFIDs( OGRLayer& layer ) -> std::vector< GIntBig > >>> { >>> std::cout << "Processing layer '" << layer.GetName() << "'...\n"; >>> >>> std::vector< GIntBig > fids; >>> >>> OGRFeature* feature = layer.GetNextFeature(); >>> >>> for ( ; feature != nullptr; feature = layer.GetNextFeature() ) >>> { >>> if ( nullptr == feature ) >>> { >>> std::cout << "Got a null feature from layer '" << layer.GetName() << "'. >>> Skipping it.\n"; >>> continue; >>> } >>> >>> fids.push_back( feature->GetFID() ); >>> } >>> >>> return fids; >>> } >>> >>> It doesn't happen for each layer, i.e. in my DEBUG build, where no crash >>> happens, an error is reported about a thrown TopologyException: >>> >>> Debug: GDAL: GDALOpen(C:\Projects\TestGdal\x64\Debug\43.pbf, >>> this=000001D7A8789410) succeeds as MVT. (code: 0) >>> Processing layer 'boundary'... >>> Processing layer 'landcover'... >>> Failure: TopologyException: side location conflict at 3934.7142857142858 >>> 3859.8571428571427. This can occur if the input geometry is invalid. (code: >>> 1) >>> Processing layer 'landuse'... >>> Failure: TopologyException: side location conflict at 494.19230769230768 >>> 2796.5769230769229. This can occur if the input geometry is invalid. (code: >>> 1) >>> ... >>> >>> The crash is a Access Violation, the top of the call-stack looks like >>> this: >>> >>> [Inline Frame] geos.dll!geos::geom::CoordinateXY::equals2D(const >>> geos::geom::CoordinateXY &) Line 106 C++ >>> [Inline Frame] >>> geos.dll!geos::index::kdtree::KdTree::queryNodePoint(geos::index::kdtree::KdNode >>> * currentNode, const geos::geom::Coordinate & odd, bool) Line 235 C++ >>> geos.dll!geos::index::kdtree::KdTree::query(const >>> geos::geom::Coordinate & queryPt) Line 289 C++ >>> [Inline Frame] >>> geos.dll!geos::noding::snapround::HotPixelIndex::find(const >>> geos::geom::Coordinate &) Line 146 C++ >>> geos.dll!geos::noding::snapround::HotPixelIndex::addRounded(const >>> geos::geom::CoordinateXYZM & pRound) Line 48 C++ >>> [Inline Frame] >>> geos.dll!geos::noding::snapround::HotPixelIndex::add(const >>> geos::geom::CoordinateXYZM &) Line 90 C++ >>> [Inline Frame] >>> geos.dll!geos::noding::snapround::HotPixelIndex::addNodes::__l2::<lambda_8c47a75e4bac7a256ab75080e3e5d5f0>::operator()(const >>> geos::geom::CoordinateXYZM &) Line 127 C++ >>> >>> geos.dll!geos::geom::CoordinateSequence::forEach<<lambda_8c47a75e4bac7a256ab75080e3e5d5f0>>(geos::noding::snapround::HotPixelIndex::addNodes::__l2::<lambda_8c47a75e4bac7a256ab75080e3e5d5f0> >>> && fun) Line 701 C++ >>> geos.dll!geos::noding::snapround::HotPixelIndex::addNodes(const >>> geos::geom::CoordinateSequence * pts) Line 130 C++ >>> >>> geos.dll!geos::noding::snapround::SnapRoundingNoder::addIntersectionPixels(std::vector<geos::noding::SegmentString >>> *,std::allocator<geos::noding::SegmentString *>> & segStrings) Line 85 C++ >>> >>> geos.dll!geos::noding::snapround::SnapRoundingNoder::snapRound(std::vector<geos::noding::SegmentString >>> *,std::allocator<geos::noding::SegmentString *>> & inputSegStrings, >>> std::vector<geos::noding::SegmentString >>> *,std::allocator<geos::noding::SegmentString *>> & resultNodedSegments) >>> Line 70 C++ >>> >>> geos.dll!geos::operation::overlayng::EdgeNodingBuilder::node(std::vector<geos::noding::SegmentString >>> *,std::allocator<geos::noding::SegmentString *>> * segStrings) Line 122 C++ >>> geos.dll!geos::operation::overlayng::EdgeNodingBuilder::build(const >>> geos::geom::Geometry * geom0, const geos::geom::Geometry * geom1) Line 104 >>> C++ >>> geos.dll!geos::operation::overlayng::OverlayNG::computeEdgeOverlay() >>> Line 227 C++ >>> geos.dll!geos::operation::overlayng::OverlayNG::getResult() Line 195 >>> C++ >>> geos.dll!geos::operation::overlayng::OverlayNG::overlay(const >>> geos::geom::Geometry * geom0, const geos::geom::Geometry * geom1, int >>> opCode, const geos::geom::PrecisionModel * pm) Line 100 C++ >>> geos.dll!geos::operation::overlayng::OverlayNGRobust::overlaySR(const >>> geos::geom::Geometry * geom0, const geos::geom::Geometry * geom1, int >>> opCode) Line 295 C++ >>> geos.dll!geos::operation::overlayng::OverlayNGRobust::Overlay(const >>> geos::geom::Geometry * geom0, const geos::geom::Geometry * geom1, int >>> opCode) Line 147 C++ >>> geos.dll!geos::geom::HeuristicOverlay(const geos::geom::Geometry * g0, >>> const geos::geom::Geometry * g1, int opCode) Line 194 C++ >>> geos.dll!geos::geom::Geometry::intersection(const geos::geom::Geometry >>> * other) Line 616 C++ >>> [Inline Frame] >>> geos_c.dll!GEOSIntersection_r::__l2::<lambda_3988e1633fcf92bee6886158a6950fe9>::operator()() >>> Line 1322 C++ >>> geos_c.dll!execute<`anonymous >>> namespace'::InterruptManager,<lambda_3988e1633fcf92bee6886158a6950fe9>,0>(GEOSContextHandle_HS >>> * extHandle, >>> GEOSIntersection_r::__l2::<lambda_3988e1633fcf92bee6886158a6950fe9> && f) >>> Line 521 C++ >>> geos_c.dll!GEOSIntersection_r(GEOSContextHandle_HS * extHandle, const >>> geos::geom::Geometry * g1, const geos::geom::Geometry * g2) Line 1326 C++ >>> gdal.dll!BuildGeometryFromTwoGeoms(const OGRGeometry * poSelf, const >>> OGRGeometry * poOtherGeom, GEOSGeom_t *(*)(GEOSContextHandle_HS *, const >>> GEOSGeom_t *, const GEOSGeom_t *) pfnGEOSFunction_r) Line 3814 C++ >>> gdal.dll!OGRMVTLayer::GetNextRawFeature() Line 1381 C++ >>> [Inline Frame] >>> gdal.dll!OGRGetNextFeatureThroughRaw<OGRMVTLayerBase>::GetNextFeature() >>> Line 513 C++ >>> gdal.dll!OGRMVTLayerBase::GetNextFeature() Line 144 C++ >>> _______________________________________________ >>> gdal-dev mailing list >>> [email protected] >>> https://lists.osgeo.org/mailman/listinfo/gdal-dev >>> >>
_______________________________________________ gdal-dev mailing list [email protected] https://lists.osgeo.org/mailman/listinfo/gdal-dev
