MCPcopy Create free account
hub / github.com/OSGeo/gdal / CutGeometryOnDateLineAndAddToMulti

Function CutGeometryOnDateLineAndAddToMulti

ogr/ogrgeometryfactory.cpp:3367–3536  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3365/************************************************************************/
3366
3367static 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 {

Callers 1

transformWithOptionsMethod · 0.85

Calls 15

WrapPointDateLineFunction · 0.85
CPLErrorFunction · 0.85
fabsFunction · 0.85
getExteriorRingMethod · 0.80
getGeometryTypeMethod · 0.45
cloneMethod · 0.45
addGeometryDirectlyMethod · 0.45
getEnvelopeMethod · 0.45
getNumPointsMethod · 0.45
getXMethod · 0.45

Tested by

no test coverage detected