OGRPolygon* OGRGMELayer::WindPolygonCCW( OGRPolygon *poPolygon ) { CPLAssert( NULL != poPolygon ); OGRLinearRing* poRing = poPolygon->getExteriorRing(); if (poRing == NULL) { return poPolygon; } // If the linear ring is CW re-wind it CCW if (poRing->isClockwise() ) { poRing->reverseWindingOrder(); } /* Interior rings. */ const int nCount = poPolygon->getNumInteriorRings(); for( int i = 0; i < nCount; ++i ) { poRing = poPolygon->getInteriorRing( i ); if (poRing == NULL) continue; // If the linear ring is CW re-wind it CCW if (poRing->isClockwise() ) { poRing->reverseWindingOrder(); } } return poPolygon; }
json_object* OGRGMEPolygonToGeoJSON( OGRPolygon* poPolygon ) { CPLAssert( NULL != poPolygon ); /* Generate "coordinates" array object. */ json_object* pjoCoordinates = NULL; pjoCoordinates = json_object_new_array(); /* Exterior ring. */ OGRLinearRing* poRing = poPolygon->getExteriorRing(); if (poRing == NULL) { json_object_put(pjoCoordinates); return NULL; } json_object* pjoRing = NULL; // If the linear ring is CW re-wind it CCW if (poRing->isClockwise() ) { poRing->reverseWindingOrder(); } pjoRing = OGRGMELineCoordsToGeoJSON( poRing ); json_object_array_add( pjoCoordinates, pjoRing ); /* Interior rings. */ const int nCount = poPolygon->getNumInteriorRings(); for( int i = 0; i < nCount; ++i ) { poRing = poPolygon->getInteriorRing( i ); if (poRing == NULL) continue; // If the linear ring is CW re-wind it CCW if (poRing->isClockwise() ) { poRing->reverseWindingOrder(); } pjoRing = OGRGMELineCoordsToGeoJSON( poRing ); json_object_array_add( pjoCoordinates, pjoRing ); } return pjoCoordinates; }