bool GDBGeometryToOGRGeometry(bool forceMulti, FileGDBAPI::ShapeBuffer* pGdbGeometry, OGRSpatialReference* pOGRSR, OGRGeometry** ppOutGeometry) { OGRGeometry* pOGRGeometry = nullptr; OGRErr eErr = OGRCreateFromShapeBin( pGdbGeometry->shapeBuffer, &pOGRGeometry, static_cast<int>(pGdbGeometry->inUseLength)); //OGRErr eErr = OGRGeometryFactory::createFromWkb(pGdbGeometry->shapeBuffer, pOGRSR, &pOGRGeometry, pGdbGeometry->inUseLength ); if (eErr != OGRERR_NONE) { CPLError( CE_Failure, CPLE_AppDefined, "Failed attempting to import GDB WKB Geometry. OGRGeometryFactory err:%d", eErr); return false; } if( pOGRGeometry != nullptr ) { // force geometries to multi if requested // If it is a polygon, force to MultiPolygon since we always produce multipolygons OGRwkbGeometryType eFlattenType = wkbFlatten(pOGRGeometry->getGeometryType()); if (eFlattenType == wkbPolygon) { pOGRGeometry = OGRGeometryFactory::forceToMultiPolygon(pOGRGeometry); } else if (eFlattenType == wkbCurvePolygon) { OGRMultiSurface* poMS = new OGRMultiSurface(); poMS->addGeometryDirectly( pOGRGeometry ); pOGRGeometry = poMS; } else if (forceMulti) { if (eFlattenType == wkbLineString) { pOGRGeometry = OGRGeometryFactory::forceToMultiLineString(pOGRGeometry); } else if (eFlattenType == wkbCompoundCurve) { OGRMultiCurve* poMC = new OGRMultiCurve(); poMC->addGeometryDirectly( pOGRGeometry ); pOGRGeometry = poMC; } else if (eFlattenType == wkbPoint) { pOGRGeometry = OGRGeometryFactory::forceToMultiPoint(pOGRGeometry); } } if (pOGRGeometry) pOGRGeometry->assignSpatialReference( pOGRSR ); } *ppOutGeometry = pOGRGeometry; return true; }
OGRMultiSurface* make() { OGRMultiSurface* poCollection = new OGRMultiSurface(); poCollection->addGeometryDirectly(make<OGRPolygon>()); poCollection->addGeometryDirectly(make<OGRCurvePolygon>()); return poCollection; }
// [[Rcpp::export]] Rcpp::List CPL_multisurface_to_multipolygon(Rcpp::List sfc) { // need to pass more parameters? std::vector<OGRGeometry *> g = ogr_from_sfc(sfc, NULL); std::vector<OGRGeometry *> out(g.size()); for (size_t i = 0; i < g.size(); i++) { OGRMultiSurface *cs = (OGRMultiSurface *) g[i]; if (cs->hasCurveGeometry(true)) { out[i] = cs->getLinearGeometry(); OGRGeometryFactory::destroyGeometry(g[i]); } else out[i] = cs->CastToMultiPolygon(cs); // consumes cs #nocov if (out[i] == NULL) Rcpp::stop("CPL_multisurface_to_multipolygon: NULL returned - non-polygonal surface?"); // #nocov } return sfc_from_ogr(out, true); // destroys out; }