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

Function SplitLineStringAtDateline

ogr/ogrgeometryfactory.cpp:3087–3198  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3085/************************************************************************/
3086
3087static void SplitLineStringAtDateline(OGRGeometryCollection *poMulti,
3088 const OGRLineString *poLS,
3089 double dfDateLineOffset, double dfXOffset)
3090{
3091 const double dfLeftBorderX = 180 - dfDateLineOffset;
3092 const double dfRightBorderX = -180 + dfDateLineOffset;
3093 const double dfDiffSpace = 360 - dfDateLineOffset;
3094
3095 const bool bIs3D = poLS->getCoordinateDimension() == 3;
3096 OGRLineString *poNewLS = new OGRLineString();
3097 poMulti->addGeometryDirectly(poNewLS);
3098 for (int i = 0; i < poLS->getNumPoints(); i++)
3099 {
3100 const double dfX = poLS->getX(i) + dfXOffset;
3101 if (i > 0 && fabs(dfX - (poLS->getX(i - 1) + dfXOffset)) > dfDiffSpace)
3102 {
3103 double dfX1 = poLS->getX(i - 1) + dfXOffset;
3104 double dfY1 = poLS->getY(i - 1);
3105 double dfZ1 = poLS->getY(i - 1);
3106 double dfX2 = poLS->getX(i) + dfXOffset;
3107 double dfY2 = poLS->getY(i);
3108 double dfZ2 = poLS->getY(i);
3109
3110 if (dfX1 > -180 && dfX1 < dfRightBorderX && dfX2 == 180 &&
3111 i + 1 < poLS->getNumPoints() &&
3112 poLS->getX(i + 1) + dfXOffset > -180 &&
3113 poLS->getX(i + 1) + dfXOffset < dfRightBorderX)
3114 {
3115 if (bIs3D)
3116 poNewLS->addPoint(-180, poLS->getY(i), poLS->getZ(i));
3117 else
3118 poNewLS->addPoint(-180, poLS->getY(i));
3119
3120 i++;
3121
3122 if (bIs3D)
3123 poNewLS->addPoint(poLS->getX(i) + dfXOffset, poLS->getY(i),
3124 poLS->getZ(i));
3125 else
3126 poNewLS->addPoint(poLS->getX(i) + dfXOffset, poLS->getY(i));
3127 continue;
3128 }
3129 else if (dfX1 > dfLeftBorderX && dfX1 < 180 && dfX2 == -180 &&
3130 i + 1 < poLS->getNumPoints() &&
3131 poLS->getX(i + 1) + dfXOffset > dfLeftBorderX &&
3132 poLS->getX(i + 1) + dfXOffset < 180)
3133 {
3134 if (bIs3D)
3135 poNewLS->addPoint(180, poLS->getY(i), poLS->getZ(i));
3136 else
3137 poNewLS->addPoint(180, poLS->getY(i));
3138
3139 i++;
3140
3141 if (bIs3D)
3142 poNewLS->addPoint(poLS->getX(i) + dfXOffset, poLS->getY(i),
3143 poLS->getZ(i));
3144 else

Callers 1

Calls 9

fabsFunction · 0.85
swapFunction · 0.50
addGeometryDirectlyMethod · 0.45
getNumPointsMethod · 0.45
getXMethod · 0.45
getYMethod · 0.45
addPointMethod · 0.45
getZMethod · 0.45

Tested by

no test coverage detected