void OGRGeoJSONDataSource::LoadLayers() { if( NULL == pszGeoData_ ) { CPLError( CE_Failure, CPLE_ObjectNull, "GeoJSON data buffer empty" ); return; } const char* const apszPrefix[] = { "loadGeoJSON(", "jsonp(" }; for(size_t iP = 0; iP < sizeof(apszPrefix) / sizeof(apszPrefix[0]); iP++ ) { if( strncmp(pszGeoData_, apszPrefix[iP], strlen(apszPrefix[iP])) == 0 ) { size_t nDataLen = strlen(pszGeoData_); memmove( pszGeoData_, pszGeoData_ + strlen(apszPrefix[iP]), nDataLen - strlen(apszPrefix[iP]) ); size_t i = nDataLen - strlen(apszPrefix[iP]); pszGeoData_[i] = '\0'; while( i > 0 && pszGeoData_[i] != ')' ) { i --; } pszGeoData_[i] = '\0'; } } if ( !GeoJSONIsObject( pszGeoData_) ) { CPLDebug( "GeoJSON", "No valid GeoJSON data found in source '%s'", pszName_ ); return; } OGRErr err = OGRERR_NONE; /* -------------------------------------------------------------------- */ /* Is it ESRI Feature Service data ? */ /* -------------------------------------------------------------------- */ if ( strstr(pszGeoData_, "esriGeometry") || strstr(pszGeoData_, "esriFieldType") ) { OGRESRIJSONReader reader; err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { reader.ReadLayers( this ); } return; } /* -------------------------------------------------------------------- */ /* Is it TopoJSON data ? */ /* -------------------------------------------------------------------- */ if ( strstr(pszGeoData_, "\"type\"") && strstr(pszGeoData_, "\"Topology\"") ) { OGRTopoJSONReader reader; err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { reader.ReadLayers( this ); } return; } /* -------------------------------------------------------------------- */ /* Configure GeoJSON format translator. */ /* -------------------------------------------------------------------- */ OGRGeoJSONReader reader; if( eGeometryAsCollection == flTransGeom_ ) { reader.SetPreserveGeometryType( false ); CPLDebug( "GeoJSON", "Geometry as OGRGeometryCollection type." ); } if( eAtributesSkip == flTransAttrs_ ) { reader.SetSkipAttributes( true ); CPLDebug( "GeoJSON", "Skip all attributes." ); } /* -------------------------------------------------------------------- */ /* Parse GeoJSON and build valid OGRLayer instance. */ /* -------------------------------------------------------------------- */ err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { reader.ReadLayers( this ); } return; }
void OGRGeoJSONDataSource::LoadLayers(char** papszOpenOptions) { if( NULL == pszGeoData_ ) { CPLError( CE_Failure, CPLE_ObjectNull, "GeoJSON data buffer empty" ); return; } const char* const apszPrefix[] = { "loadGeoJSON(", "jsonp(" }; for(size_t iP = 0; iP < sizeof(apszPrefix) / sizeof(apszPrefix[0]); iP++ ) { if( strncmp(pszGeoData_, apszPrefix[iP], strlen(apszPrefix[iP])) == 0 ) { size_t nDataLen = strlen(pszGeoData_); memmove( pszGeoData_, pszGeoData_ + strlen(apszPrefix[iP]), nDataLen - strlen(apszPrefix[iP]) ); size_t i = nDataLen - strlen(apszPrefix[iP]); pszGeoData_[i] = '\0'; while( i > 0 && pszGeoData_[i] != ')' ) { i --; } pszGeoData_[i] = '\0'; } } if ( !GeoJSONIsObject( pszGeoData_) ) { CPLDebug( "GeoJSON", "No valid GeoJSON data found in source '%s'", pszName_ ); return; } OGRErr err = OGRERR_NONE; /* -------------------------------------------------------------------- */ /* Is it ESRI Feature Service data ? */ /* -------------------------------------------------------------------- */ if ( strstr(pszGeoData_, "esriGeometry") || strstr(pszGeoData_, "esriFieldType") ) { OGRESRIJSONReader reader; err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { json_object* poObj = reader.GetJSonObject(); if( poObj && json_object_get_type(poObj) == json_type_object ) { json_object* poExceededTransferLimit = json_object_object_get(poObj, "exceededTransferLimit"); if( poExceededTransferLimit && json_object_get_type(poExceededTransferLimit) == json_type_boolean ) bOtherPages_ = json_object_get_boolean(poExceededTransferLimit); } reader.ReadLayers( this ); } return; } /* -------------------------------------------------------------------- */ /* Is it TopoJSON data ? */ /* -------------------------------------------------------------------- */ if ( strstr(pszGeoData_, "\"type\"") && strstr(pszGeoData_, "\"Topology\"") ) { OGRTopoJSONReader reader; err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { reader.ReadLayers( this ); } return; } /* -------------------------------------------------------------------- */ /* Configure GeoJSON format translator. */ /* -------------------------------------------------------------------- */ OGRGeoJSONReader reader; if( eGeometryAsCollection == flTransGeom_ ) { reader.SetPreserveGeometryType( false ); CPLDebug( "GeoJSON", "Geometry as OGRGeometryCollection type." ); } if( eAtributesSkip == flTransAttrs_ ) { reader.SetSkipAttributes( true ); CPLDebug( "GeoJSON", "Skip all attributes." ); } reader.SetFlattenNestedAttributes( (bool)CSLFetchBoolean(papszOpenOptions, "FLATTEN_NESTED_ATTRIBUTES", FALSE), CSLFetchNameValueDef(papszOpenOptions, "NESTED_ATTRIBUTE_SEPARATOR", "_")[0]); /* -------------------------------------------------------------------- */ /* Parse GeoJSON and build valid OGRLayer instance. */ /* -------------------------------------------------------------------- */ err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { json_object* poObj = reader.GetJSonObject(); if( poObj && json_object_get_type(poObj) == json_type_object ) { json_object* poProperties = json_object_object_get(poObj, "properties"); if( poProperties && json_object_get_type(poProperties) == json_type_object ) { json_object* poExceededTransferLimit = json_object_object_get(poProperties, "exceededTransferLimit"); if( poExceededTransferLimit && json_object_get_type(poExceededTransferLimit) == json_type_boolean ) bOtherPages_ = json_object_get_boolean(poExceededTransferLimit); } } reader.ReadLayers( this ); } return; }
OGRGeoJSONLayer* OGRGeoJSONDataSource::LoadLayer() { if( NULL == pszGeoData_ ) { CPLError( CE_Failure, CPLE_ObjectNull, "GeoJSON data buffer empty" ); return NULL; } if ( !GeoJSONIsObject( pszGeoData_) ) { CPLDebug( "GeoJSON", "No valid GeoJSON data found in source '%s'", pszName_ ); return NULL; } OGRErr err = OGRERR_NONE; OGRGeoJSONLayer* poLayer = NULL; /* -------------------------------------------------------------------- */ /* Is it ESRI Feature Service data ? */ /* -------------------------------------------------------------------- */ if ( strstr(pszGeoData_, "esriGeometry") || strstr(pszGeoData_, "esriFieldTypeOID") ) { OGRESRIJSONReader reader; err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { // TODO: Think about better name selection poLayer = reader.ReadLayer( OGRGeoJSONLayer::DefaultName, this ); } return poLayer; } /* -------------------------------------------------------------------- */ /* Configure GeoJSON format translator. */ /* -------------------------------------------------------------------- */ OGRGeoJSONReader reader; if( eGeometryAsCollection == flTransGeom_ ) { reader.SetPreserveGeometryType( false ); CPLDebug( "GeoJSON", "Geometry as OGRGeometryCollection type." ); } if( eAtributesSkip == flTransAttrs_ ) { reader.SetSkipAttributes( true ); CPLDebug( "GeoJSON", "Skip all attributes." ); } /* -------------------------------------------------------------------- */ /* Parse GeoJSON and build valid OGRLayer instance. */ /* -------------------------------------------------------------------- */ err = reader.Parse( pszGeoData_ ); if( OGRERR_NONE == err ) { // TODO: Think about better name selection poLayer = reader.ReadLayer( OGRGeoJSONLayer::DefaultName, this ); } return poLayer; }