| 3085 | /************************************************************************/ |
| 3086 | |
| 3087 | static 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 |
no test coverage detected