OGRLayer * OGRMemDataSource::ICreateLayer( const char *pszLayerName, OGRSpatialReference *poSRSIn, OGRwkbGeometryType eType, char **papszOptions ) { // Create the layer object. OGRSpatialReference* poSRS = poSRSIn; if( poSRS ) { poSRS = poSRS->Clone(); poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); } OGRMemLayer *poLayer = new OGRMemLayer(pszLayerName, poSRS, eType); if( poSRS ) { poSRS->Release(); } if( CPLFetchBool(papszOptions, "ADVERTIZE_UTF8", false) ) poLayer->SetAdvertizeUTF8(true); // Add layer to data source layer list. papoLayers = static_cast<OGRMemLayer **>( CPLRealloc(papoLayers, sizeof(OGRMemLayer *) * (nLayers + 1))); papoLayers[nLayers++] = poLayer; return poLayer; }
OGRLayer *OGRAmigoCloudDataSource::ICreateLayer( const char *pszNameIn, OGRSpatialReference *poSpatialRef, OGRwkbGeometryType eGType, char ** papszOptions ) { if( !bReadWrite ) { CPLError(CE_Failure, CPLE_AppDefined, "Operation not available in read-only mode"); return nullptr; } CPLString osName(pszNameIn); OGRAmigoCloudTableLayer* poLayer = new OGRAmigoCloudTableLayer(this, osName); const bool bGeomNullable = CPLFetchBool(papszOptions, "GEOMETRY_NULLABLE", true); OGRSpatialReference* poSRSClone = poSpatialRef; if( poSRSClone ) { poSRSClone = poSRSClone->Clone(); poSRSClone->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); } poLayer->SetDeferredCreation(eGType, poSRSClone, bGeomNullable); if( poSRSClone ) poSRSClone->Release(); papoLayers = (OGRAmigoCloudTableLayer**) CPLRealloc( papoLayers, (nLayers + 1) * sizeof(OGRAmigoCloudTableLayer*)); papoLayers[nLayers ++] = poLayer; return poLayer; }
OGRSpatialReference *OGRMySQLDataSource::FetchSRS( int nId ) { if( nId < 0 ) return nullptr; /* -------------------------------------------------------------------- */ /* First, we look through our SRID cache, is it there? */ /* -------------------------------------------------------------------- */ for( int i = 0; i < nKnownSRID; i++ ) { if( panSRID[i] == nId ) return papoSRS[i]; } OGRSpatialReference *poSRS = nullptr; // make sure to attempt to free any old results MYSQL_RES *hResult = mysql_store_result( GetConn() ); if( hResult != nullptr ) mysql_free_result( hResult ); hResult = nullptr; char szCommand[128] = {}; if( GetMajorVersion() < 8 || IsMariaDB() ) { snprintf( szCommand, sizeof(szCommand), "SELECT srtext FROM spatial_ref_sys WHERE srid = %d", nId ); } else { snprintf( szCommand, sizeof(szCommand), "SELECT DEFINITION FROM INFORMATION_SCHEMA.ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_ID = %d", nId ); } if( !mysql_query( GetConn(), szCommand ) ) hResult = mysql_store_result( GetConn() ); char *pszWKT = nullptr; char **papszRow = nullptr; if( hResult != nullptr ) papszRow = mysql_fetch_row( hResult ); if( papszRow != nullptr && papszRow[0] != nullptr ) { pszWKT = CPLStrdup(papszRow[0]); } if( hResult != nullptr ) mysql_free_result( hResult ); hResult = nullptr; poSRS = new OGRSpatialReference(); poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); if( pszWKT == nullptr || poSRS->importFromWkt( pszWKT ) != OGRERR_NONE ) { delete poSRS; poSRS = nullptr; } CPLFree(pszWKT); if( poSRS ) { // The WKT found in MySQL 8 ST_SPATIAL_REFERENCE_SYSTEMS is not // compatible of what GDAL understands. const char* pszAuthorityName = poSRS->GetAuthorityName(nullptr); const char* pszAuthorityCode = poSRS->GetAuthorityCode(nullptr); if (pszAuthorityName != nullptr && EQUAL(pszAuthorityName, "EPSG") && pszAuthorityCode != nullptr && strlen(pszAuthorityCode) > 0 ) { /* Import 'clean' SRS */ poSRS->importFromEPSG( atoi(pszAuthorityCode) ); } } /* -------------------------------------------------------------------- */ /* Add to the cache. */ /* -------------------------------------------------------------------- */ panSRID = (int *) CPLRealloc(panSRID,sizeof(int) * (nKnownSRID+1) ); papoSRS = (OGRSpatialReference **) CPLRealloc(papoSRS, sizeof(void*) * (nKnownSRID + 1) ); panSRID[nKnownSRID] = nId; papoSRS[nKnownSRID] = poSRS; nKnownSRID ++; return poSRS; }
OGRLayer *OGRVRTDataSource::InstantiateWarpedLayer( CPLXMLNode *psLTree, const char *pszVRTDirectory, int bUpdate, int nRecLevel) { if( !EQUAL(psLTree->pszValue,"OGRVRTWarpedLayer") ) return nullptr; OGRLayer *poSrcLayer = nullptr; for( CPLXMLNode *psSubNode = psLTree->psChild; psSubNode != nullptr; psSubNode = psSubNode->psNext ) { if( psSubNode->eType != CXT_Element ) continue; poSrcLayer = InstantiateLayer(psSubNode, pszVRTDirectory, bUpdate, nRecLevel + 1); if( poSrcLayer != nullptr ) break; } if( poSrcLayer == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Cannot instantiate source layer"); return nullptr; } const char *pszTargetSRS = CPLGetXMLValue(psLTree, "TargetSRS", nullptr); if( pszTargetSRS == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Missing TargetSRS element within OGRVRTWarpedLayer"); delete poSrcLayer; return nullptr; } const char *pszGeomFieldName = CPLGetXMLValue(psLTree, "WarpedGeomFieldName", nullptr); int iGeomField = 0; if( pszGeomFieldName != nullptr ) { iGeomField = poSrcLayer->GetLayerDefn()->GetGeomFieldIndex(pszGeomFieldName); if( iGeomField < 0 ) { CPLError(CE_Failure, CPLE_AppDefined, "Cannot find source geometry field '%s'", pszGeomFieldName); delete poSrcLayer; return nullptr; } } OGRSpatialReference *poSrcSRS = nullptr; const char *pszSourceSRS = CPLGetXMLValue(psLTree, "SrcSRS", nullptr); if( pszSourceSRS == nullptr ) { if( iGeomField < poSrcLayer->GetLayerDefn()->GetGeomFieldCount() ) { poSrcSRS = poSrcLayer->GetLayerDefn() ->GetGeomFieldDefn(iGeomField) ->GetSpatialRef(); if( poSrcSRS != nullptr ) poSrcSRS = poSrcSRS->Clone(); } } else { poSrcSRS = new OGRSpatialReference(); poSrcSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); if( poSrcSRS->SetFromUserInput(pszSourceSRS) != OGRERR_NONE ) { delete poSrcSRS; poSrcSRS = nullptr; } } if( poSrcSRS == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Failed to import source SRS"); delete poSrcLayer; return nullptr; } OGRSpatialReference *poTargetSRS = new OGRSpatialReference(); poTargetSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); if( poTargetSRS->SetFromUserInput(pszTargetSRS) != OGRERR_NONE ) { delete poTargetSRS; poTargetSRS = nullptr; } if( poTargetSRS == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Failed to import target SRS"); delete poSrcSRS; delete poSrcLayer; return nullptr; } if( pszSourceSRS == nullptr && poSrcSRS->IsSame(poTargetSRS) ) { delete poSrcSRS; delete poTargetSRS; return poSrcLayer; } OGRCoordinateTransformation *poCT = OGRCreateCoordinateTransformation(poSrcSRS, poTargetSRS); OGRCoordinateTransformation *poReversedCT = poCT != nullptr ? OGRCreateCoordinateTransformation(poTargetSRS, poSrcSRS) : nullptr; delete poSrcSRS; delete poTargetSRS; if( poCT == nullptr ) { delete poSrcLayer; return nullptr; } // Build the OGRWarpedLayer. OGRWarpedLayer *poLayer = new OGRWarpedLayer(poSrcLayer, iGeomField, TRUE, poCT, poReversedCT); // Set Extent if provided. const char *pszExtentXMin = CPLGetXMLValue(psLTree, "ExtentXMin", nullptr); const char *pszExtentYMin = CPLGetXMLValue(psLTree, "ExtentYMin", nullptr); const char *pszExtentXMax = CPLGetXMLValue(psLTree, "ExtentXMax", nullptr); const char *pszExtentYMax = CPLGetXMLValue(psLTree, "ExtentYMax", nullptr); if( pszExtentXMin != nullptr && pszExtentYMin != nullptr && pszExtentXMax != nullptr && pszExtentYMax != nullptr ) { poLayer->SetExtent(CPLAtof(pszExtentXMin), CPLAtof(pszExtentYMin), CPLAtof(pszExtentXMax), CPLAtof(pszExtentYMax)); } return poLayer; }
/** This function parses the beginning of the file to detect the fields */ void OGRJMLLayer::LoadSchema() { if (bHasReadSchema) return; bHasReadSchema = true; oParser = OGRCreateExpatXMLParser(); XML_SetElementHandler(oParser, ::startElementLoadSchemaCbk, ::endElementLoadSchemaCbk); XML_SetCharacterDataHandler(oParser, ::dataHandlerCbk); XML_SetUserData(oParser, this); VSIFSeekL( fp, 0, SEEK_SET ); char aBuf[BUFSIZ]; int nDone = 0; do { nDataHandlerCounter = 0; const unsigned int nLen = static_cast<unsigned int>( VSIFReadL( aBuf, 1, sizeof(aBuf), fp ) ); nDone = VSIFEofL(fp); if (XML_Parse(oParser, aBuf, nLen, nDone) == XML_STATUS_ERROR) { CPLError( CE_Failure, CPLE_AppDefined, "XML parsing of JML file failed : %s at line %d, " "column %d", XML_ErrorString(XML_GetErrorCode(oParser)), static_cast<int>(XML_GetCurrentLineNumber(oParser)), static_cast<int>(XML_GetCurrentColumnNumber(oParser)) ); bStopParsing = true; } nWithoutEventCounter ++; } while ( !nDone && !bStopParsing && !bSchemaFinished && nWithoutEventCounter < 10 ); XML_ParserFree(oParser); oParser = nullptr; if (nWithoutEventCounter == 10) { CPLError(CE_Failure, CPLE_AppDefined, "Too much data inside one element. File probably corrupted"); bStopParsing = true; } if( osCollectionElement.empty() || osFeatureElement.empty() || osGeometryElement.empty() ) { CPLError( CE_Failure, CPLE_AppDefined, "Missing CollectionElement, FeatureElement or " "GeometryElement" ); bStopParsing = true; } if( !osSRSName.empty() ) { if( osSRSName.find("http://www.opengis.net/gml/srs/epsg.xml#") == 0 ) { OGRSpatialReference* poSRS = new OGRSpatialReference(); poSRS->importFromEPSG(atoi(osSRSName.substr( strlen("http://www.opengis.net/gml/srs/epsg.xml#")).c_str())); poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(poSRS); poSRS->Release(); } } nJCSGMLInputTemplateDepth = 0; nCollectionElementDepth = 0; nFeatureCollectionDepth = 0; nFeatureElementDepth = 0; nGeometryElementDepth = 0; nColumnDepth = 0; nNameDepth = 0; nTypeDepth = 0; nAttributeElementDepth = 0; ResetReading(); }