| 3365 | /************************************************************************/ |
| 3366 | |
| 3367 | static void CutGeometryOnDateLineAndAddToMulti(OGRGeometryCollection *poMulti, |
| 3368 | const OGRGeometry *poGeom, |
| 3369 | double dfDateLineOffset) |
| 3370 | { |
| 3371 | const OGRwkbGeometryType eGeomType = wkbFlatten(poGeom->getGeometryType()); |
| 3372 | switch (eGeomType) |
| 3373 | { |
| 3374 | case wkbPoint: |
| 3375 | { |
| 3376 | auto poPoint = poGeom->toPoint()->clone(); |
| 3377 | WrapPointDateLine(poPoint); |
| 3378 | poMulti->addGeometryDirectly(poPoint); |
| 3379 | break; |
| 3380 | } |
| 3381 | |
| 3382 | case wkbPolygon: |
| 3383 | case wkbLineString: |
| 3384 | { |
| 3385 | bool bSplitLineStringAtDateline = false; |
| 3386 | OGREnvelope oEnvelope; |
| 3387 | |
| 3388 | poGeom->getEnvelope(&oEnvelope); |
| 3389 | const bool bAroundMinus180 = (oEnvelope.MinX < -180.0); |
| 3390 | |
| 3391 | // Naive heuristics... Place to improve. |
| 3392 | #ifdef HAVE_GEOS |
| 3393 | std::unique_ptr<OGRGeometry> poDupGeom; |
| 3394 | bool bWrapDateline = false; |
| 3395 | #endif |
| 3396 | |
| 3397 | const double dfLeftBorderX = 180 - dfDateLineOffset; |
| 3398 | const double dfRightBorderX = -180 + dfDateLineOffset; |
| 3399 | const double dfDiffSpace = 360 - dfDateLineOffset; |
| 3400 | |
| 3401 | const double dfXOffset = (bAroundMinus180) ? 360.0 : 0.0; |
| 3402 | if (oEnvelope.MinX < -180 || oEnvelope.MaxX > 180 || |
| 3403 | (oEnvelope.MinX + dfXOffset > dfLeftBorderX && |
| 3404 | oEnvelope.MaxX + dfXOffset > 180)) |
| 3405 | { |
| 3406 | #ifndef HAVE_GEOS |
| 3407 | CPLError(CE_Failure, CPLE_NotSupported, |
| 3408 | "GEOS support not enabled."); |
| 3409 | #else |
| 3410 | bWrapDateline = true; |
| 3411 | #endif |
| 3412 | } |
| 3413 | else |
| 3414 | { |
| 3415 | auto poLS = eGeomType == wkbPolygon |
| 3416 | ? poGeom->toPolygon()->getExteriorRing() |
| 3417 | : poGeom->toLineString(); |
| 3418 | if (poLS) |
| 3419 | { |
| 3420 | double dfMaxSmallDiffLong = 0; |
| 3421 | bool bHasBigDiff = false; |
| 3422 | // Detect big gaps in longitude. |
| 3423 | for (int i = 1; i < poLS->getNumPoints(); i++) |
| 3424 | { |
no test coverage detected