ogrsdelayer.cpp
来自「支持各种栅格图像和矢量图像读取的库」· C++ 代码 · 共 1,305 行 · 第 1/4 页
CPP
1,305 行
/* expensive, so we avoid it if we can. *//* -------------------------------------------------------------------- */ if ( nTypeCount == 0 ) { CPLDebug( "OGR_SDE", "There is no layer type indicated for the current layer." ); return wkbUnknown; } else if ( nTypeCount > 1 ) { CPLDebug( "OGR_SDE", "More than one layer type is indicated for this layer, gathering layer statistics are being gathered." ); SE_LAYER_STATS layerstats = {0}; char szTableName[SE_QUALIFIED_TABLE_NAME]; char szShapeColumn[SE_MAX_COLUMN_LEN]; szTableName[0] = '\0'; szShapeColumn[0] = '\0'; nSDEErr = SE_layerinfo_get_spatial_column( hLayerInfo, szTableName, szShapeColumn ); if ( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_layerinfo_get_spatial_column" ); return wkbUnknown; } nSDEErr = SE_layer_get_statistics( poDS->GetConnection(), szTableName, szShapeColumn, &layerstats); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_layer_get_statistics" ); return wkbUnknown; } if ( nShapeTypeMask & SE_POINT_TYPE_MASK && ( layerstats.POINTs + layerstats.MultiPOINTs ) == 0 ) nShapeTypeMask &= ~SE_POINT_TYPE_MASK; if ( nShapeTypeMask & SE_LINE_TYPE_MASK && ( layerstats.LINEs + layerstats.MultiLINEs ) == 0 ) nShapeTypeMask &= ~SE_LINE_TYPE_MASK; if ( nShapeTypeMask & SE_SIMPLE_LINE_TYPE_MASK && ( layerstats.SIMPLE_LINEs + layerstats.MultiSIMPLE_LINEs ) == 0 ) nShapeTypeMask &= ~SE_SIMPLE_LINE_TYPE_MASK; if ( nShapeTypeMask & SE_AREA_TYPE_MASK && ( layerstats.AREAs + layerstats.MultiAREAs ) == 0 ) nShapeTypeMask &= ~SE_AREA_TYPE_MASK; }/* -------------------------------------------------------------------- *//* Select a geometry type based on the remaining flags. If *//* there is a mix we will fall through to the default (wkbUknown). *//* -------------------------------------------------------------------- */ OGRwkbGeometryType eGeoType; char *pszTypeName; switch (nShapeTypeMask) { case SE_POINT_TYPE_MASK: if (bIsMultipart) eGeoType = wkbMultiPoint; else eGeoType = wkbPoint; pszTypeName = "point"; break; case (SE_SIMPLE_LINE_TYPE_MASK | SE_LINE_TYPE_MASK): case SE_SIMPLE_LINE_TYPE_MASK: case SE_LINE_TYPE_MASK: if (bIsMultipart) eGeoType = wkbMultiLineString; else eGeoType = wkbLineString; pszTypeName = "line"; break; case SE_AREA_TYPE_MASK: if (bIsMultipart) eGeoType = wkbMultiPolygon; else eGeoType = wkbPolygon; pszTypeName = "polygon"; break; default: eGeoType = wkbUnknown; pszTypeName = "unknown"; break; } CPLDebug( "OGR_SDE", "DiscoverLayerType is returning type=%d (%s), multipart=%d.", eGeoType, pszTypeName, bIsMultipart ); return eGeoType;}/************************************************************************//* ResetReading() *//************************************************************************/void OGRSDELayer::ResetReading(){ bQueryInstalled = FALSE; nNextFID = 0;}/************************************************************************//* InstallQuery() *//* *//* Setup the stream with current query characteristics. *//************************************************************************/int OGRSDELayer::InstallQuery( int bCountingOnly ){ int nSDEErr;/* -------------------------------------------------------------------- *//* Create stream, or reset it. *//* -------------------------------------------------------------------- */ if( hStream == NULL ) { nSDEErr = SE_stream_create( poDS->GetConnection(), &hStream ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_stream_create" ); return FALSE; } } else { nSDEErr = SE_stream_close( hStream, TRUE ); }/* -------------------------------------------------------------------- *//* Create query info. *//* -------------------------------------------------------------------- */ SE_QUERYINFO hQueryInfo; const char *pszTableName = poFeatureDefn->GetName(); nSDEErr = SE_queryinfo_create (&hQueryInfo); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_create" ); return FALSE; } /* -------------------------------------------------------------------- *//* Select table. *//* -------------------------------------------------------------------- */ nSDEErr = SE_queryinfo_set_tables( hQueryInfo, 1, &pszTableName, NULL ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_tables" ); return FALSE; } /* -------------------------------------------------------------------- *//* Set where clause. *//* -------------------------------------------------------------------- */ nSDEErr = SE_queryinfo_set_where_clause( hQueryInfo, osAttributeFilter.c_str() ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_where_clause" ); return FALSE; } /* -------------------------------------------------------------------- *//* We want to join the spatial and attribute tables. *//* -------------------------------------------------------------------- */ nSDEErr = SE_queryinfo_set_query_type(hQueryInfo,SE_QUERYTYPE_JSF); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_query_type" ); return FALSE; } /* -------------------------------------------------------------------- *//* Establish the columns to query. If only counting features, *//* we will just use the FID column, otherwise we use all *//* columns. *//* -------------------------------------------------------------------- */ if( bCountingOnly && iFIDColumn != -1 ) { const char *pszFIDColName = poFeatureDefn->GetFieldDefn( iFIDColumn )->GetNameRef(); nSDEErr = SE_queryinfo_set_columns( hQueryInfo, 1, (const char **) &pszFIDColName ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_columns" ); return FALSE; } } else { nSDEErr = SE_queryinfo_set_columns( hQueryInfo, CSLCount(papszAllColumns), (const char **) papszAllColumns ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_queryinfo_set_columns" ); return FALSE; } }/* -------------------------------------------------------------------- *//* Apply the query to the stream. *//* -------------------------------------------------------------------- */ nSDEErr = SE_stream_query_with_info( hStream, hQueryInfo ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_stream_query_with_info" ); return FALSE; } /* -------------------------------------------------------------------- *//* Free query resources. *//* -------------------------------------------------------------------- */ SE_queryinfo_free( hQueryInfo );/* -------------------------------------------------------------------- *//* Setup spatial filter on stream if one is installed. *//* -------------------------------------------------------------------- */ if( m_poFilterGeom != NULL ) { SE_FILTER sConstraint; SE_ENVELOPE sEnvelope; SE_SHAPE hRectShape; SHORT nSearchOrder = SE_SPATIAL_FIRST; if( osAttributeFilter.size() > 0 ) { const char *pszOrder = CPLGetConfigOption( "OGR_SDE_SEARCHORDER", "ATTRIBUTE_FIRST" ); if( EQUAL(pszOrder, "ATTRIBUTE_FIRST") ) nSearchOrder = SE_ATTRIBUTE_FIRST; else { if( !EQUAL(pszOrder, "SPATIAL_FIRST") ) CPLError( CE_Warning, CPLE_AppDefined, "Unrecognised OGR_SDE_SEARCHORDER value of %s.", pszOrder ); nSearchOrder = SE_SPATIAL_FIRST; } } NeedLayerInfo(); // need hCoordRef SE_shape_create( hCoordRef, &hRectShape ); sEnvelope.minx = m_sFilterEnvelope.MinX; sEnvelope.miny = m_sFilterEnvelope.MinY; sEnvelope.maxx = m_sFilterEnvelope.MaxX; sEnvelope.maxy = m_sFilterEnvelope.MaxY; SE_shape_generate_rectangle( &sEnvelope, hRectShape ); sConstraint.filter.shape = hRectShape; strcpy( sConstraint.table, poFeatureDefn->GetName() ); strcpy( sConstraint.column, osShapeColumnName.c_str() ); sConstraint.method = SM_ENVP; sConstraint.filter_type = SE_SHAPE_FILTER; sConstraint.truth = TRUE; nSDEErr = SE_stream_set_spatial_constraints( hStream, SE_SPATIAL_FIRST, FALSE, 1, &sConstraint ); if( nSDEErr != SE_SUCCESS) { poDS->IssueSDEError( nSDEErr, "SE_stream_set_spatial_constraints"); return FALSE; } SE_shape_free( hRectShape ); }/* -------------------------------------------------------------------- *//* Execute the query. *//* -------------------------------------------------------------------- */ nSDEErr = SE_stream_execute( hStream ); if( nSDEErr != SE_SUCCESS ) { poDS->IssueSDEError( nSDEErr, "SE_stream_execute" ); return FALSE; } bQueryInstalled = TRUE; return TRUE;}/************************************************************************//* SetAttributeFilter() *//************************************************************************/OGRErr OGRSDELayer::SetAttributeFilter( const char *pszQuery ){ if( pszQuery == NULL ) osAttributeFilter = ""; else osAttributeFilter = pszQuery; ResetReading(); return OGRERR_NONE;}/************************************************************************//* TranslateSDEGeometry() *//************************************************************************/OGRGeometry *OGRSDELayer::TranslateSDEGeometry( SE_SHAPE hShape ){ LONG nSDEGeomType; OGRGeometry *poGeom = NULL;/* -------------------------------------------------------------------- *//* Fetch geometry type. *//* -------------------------------------------------------------------- */ SE_shape_get_type( hShape, &nSDEGeomType ); if( nSDEGeomType == SG_NIL_SHAPE ) return NULL; /* -------------------------------------------------------------------- *//* Fetch points and parts. *//* -------------------------------------------------------------------- */ LONG nPointCount, nPartCount, nSubPartCount, nSDEErr; SE_POINT *pasPoints;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?