⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrlayer.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/************************************************************************//*                          SetSpatialFilter()                          *//************************************************************************/void OGRLayer::SetSpatialFilter( OGRGeometry * poGeomIn ){    if( InstallFilter( poGeomIn ) )        ResetReading();}/************************************************************************//*                       OGR_L_SetSpatialFilter()                       *//************************************************************************/void OGR_L_SetSpatialFilter( OGRLayerH hLayer, OGRGeometryH hGeom ){    ((OGRLayer *) hLayer)->SetSpatialFilter( (OGRGeometry *) hGeom );}/************************************************************************//*                        SetSpatialFilterRect()                        *//************************************************************************/void OGRLayer::SetSpatialFilterRect( double dfMinX, double dfMinY,                                      double dfMaxX, double dfMaxY ){    OGRLinearRing  oRing;    OGRPolygon oPoly;    oRing.addPoint( dfMinX, dfMinY );    oRing.addPoint( dfMinX, dfMaxY );    oRing.addPoint( dfMaxX, dfMaxY );    oRing.addPoint( dfMaxX, dfMinY );    oRing.addPoint( dfMinX, dfMinY );    oPoly.addRing( &oRing );    SetSpatialFilter( &oPoly );}/************************************************************************//*                     OGR_L_SetSpatialFilterRect()                     *//************************************************************************/void OGR_L_SetSpatialFilterRect( OGRLayerH hLayer,                                  double dfMinX, double dfMinY,                                  double dfMaxX, double dfMaxY ){    ((OGRLayer *) hLayer)->SetSpatialFilterRect( dfMinX, dfMinY,                                                  dfMaxX, dfMaxY );}/************************************************************************//*                           InstallFilter()                            *//*                                                                      *//*      This method is only intended to be used from within             *//*      drivers, normally from the SetSpatialFilter() method.           *//*      It installs a filter, and also tests it to see if it is         *//*      rectangular.  If so, it this is kept track of alongside the     *//*      filter geometry itself so we can do cheaper comparisons in      *//*      the FilterGeometry() call.                                      *//*                                                                      *//*      Returns TRUE if the newly installed filter differs in some      *//*      way from the current one.                                       *//************************************************************************/int OGRLayer::InstallFilter( OGRGeometry * poFilter ){    if( m_poFilterGeom == NULL && poFilter == NULL )        return FALSE;/* -------------------------------------------------------------------- *//*      Replace the existing filter.                                    *//* -------------------------------------------------------------------- */    if( m_poFilterGeom != NULL )    {        delete m_poFilterGeom;        m_poFilterGeom = NULL;    }    if( poFilter != NULL )        m_poFilterGeom = poFilter->clone();    m_bFilterIsEnvelope = FALSE;    if( m_poFilterGeom == NULL )        return TRUE;    if( m_poFilterGeom != NULL )        m_poFilterGeom->getEnvelope( &m_sFilterEnvelope );/* -------------------------------------------------------------------- *//*      Now try to determine if the filter is really a rectangle.       *//* -------------------------------------------------------------------- */    if( wkbFlatten(m_poFilterGeom->getGeometryType()) != wkbPolygon )        return TRUE;    OGRPolygon *poPoly = (OGRPolygon *) m_poFilterGeom;    if( poPoly->getNumInteriorRings() != 0 )        return TRUE;    OGRLinearRing *poRing = poPoly->getExteriorRing();    if( poRing->getNumPoints() > 5 || poRing->getNumPoints() < 4 )        return TRUE;    // If the ring has 5 points, the last should be the first.     if( poRing->getNumPoints() == 5         && ( poRing->getX(0) != poRing->getX(4)             || poRing->getY(0) != poRing->getY(4) ) )        return TRUE;    // Polygon with first segment in "y" direction.     if( poRing->getX(0) == poRing->getX(1)        && poRing->getY(1) == poRing->getY(2)        && poRing->getX(2) == poRing->getX(3)        && poRing->getY(3) == poRing->getY(0) )        m_bFilterIsEnvelope = TRUE;    // Polygon with first segment in "x" direction.     if( poRing->getY(0) == poRing->getY(1)        && poRing->getX(1) == poRing->getX(2)        && poRing->getY(2) == poRing->getY(3)        && poRing->getX(3) == poRing->getX(0) )        m_bFilterIsEnvelope = TRUE;    return TRUE;}/************************************************************************//*                           FilterGeometry()                           *//*                                                                      *//*      Compare the passed in geometry to the currently installed       *//*      filter.  Optimize for case where filter is just an              *//*      envelope.                                                       *//************************************************************************/int OGRLayer::FilterGeometry( OGRGeometry *poGeometry ){/* -------------------------------------------------------------------- *//*      In trivial cases of new filter or target geometry, we accept    *//*      an intersection.  No geometry is taken to mean "the whole       *//*      world".                                                         *//* -------------------------------------------------------------------- */    if( m_poFilterGeom == NULL )        return TRUE;    if( poGeometry == NULL )        return TRUE;/* -------------------------------------------------------------------- *//*      Compute the target geometry envelope, and if there is no        *//*      intersection between the envelopes we are sure not to have      *//*      any intersection.                                               *//* -------------------------------------------------------------------- */    OGREnvelope sGeomEnv;    poGeometry->getEnvelope( &sGeomEnv );    if( sGeomEnv.MaxX < m_sFilterEnvelope.MinX        || sGeomEnv.MaxY < m_sFilterEnvelope.MinY        || m_sFilterEnvelope.MaxX < sGeomEnv.MinX        || m_sFilterEnvelope.MaxY < sGeomEnv.MinY )        return FALSE;/* -------------------------------------------------------------------- *//*      Fallback to full intersect test (using GEOS) if we still        *//*      don't know for sure.                                            *//* -------------------------------------------------------------------- */    if( m_bFilterIsEnvelope )        return TRUE;    else    {        if( OGRGeometryFactory::haveGEOS() )            return m_poFilterGeom->Intersects( poGeometry );        else            return TRUE;    }}/************************************************************************//*                         OGR_L_ResetReading()                         *//************************************************************************/void OGR_L_ResetReading( OGRLayerH hLayer ){    ((OGRLayer *) hLayer)->ResetReading();}/************************************************************************//*                       InitializeIndexSupport()                       *//*                                                                      *//*      This is only intended to be called by driver layer              *//*      implementations but we don't make it protected so that the      *//*      datasources can do it too if that is more appropriate.          *//************************************************************************/OGRErr OGRLayer::InitializeIndexSupport( const char *pszFilename ){    OGRErr eErr;    m_poAttrIndex = OGRCreateDefaultLayerIndex();    eErr = m_poAttrIndex->Initialize( pszFilename, this );    if( eErr != OGRERR_NONE )    {        delete m_poAttrIndex;        m_poAttrIndex = NULL;    }    return eErr;}/************************************************************************//*                             SyncToDisk()                             *//************************************************************************/OGRErr OGRLayer::SyncToDisk(){    return OGRERR_NONE;}/************************************************************************//*                          OGR_L_SyncToDisk()                          *//************************************************************************/OGRErr OGR_L_SyncToDisk( OGRLayerH hDS ){    return ((OGRLayer *) hDS)->SyncToDisk();}/************************************************************************//*                           DeleteFeature()                            *//************************************************************************/OGRErr OGRLayer::DeleteFeature( long nFID ){    return OGRERR_UNSUPPORTED_OPERATION;}/************************************************************************//*                        OGR_L_DeleteFeature()                         *//************************************************************************/OGRErr OGR_L_DeleteFeature( OGRLayerH hDS, long nFID ){    return ((OGRLayer *) hDS)->DeleteFeature( nFID );}/************************************************************************//*                          GetFeaturesRead()                           *//************************************************************************/GIntBig OGRLayer::GetFeaturesRead(){    return m_nFeaturesRead;}/************************************************************************//*                       OGR_L_GetFeaturesRead()                        *//************************************************************************/GIntBig OGR_L_GetFeaturesRead( OGRLayerH hLayer ){    return ((OGRLayer *) hLayer)->GetFeaturesRead();}/************************************************************************//*                             GetFIDColumn                             *//************************************************************************/const char *OGRLayer::GetFIDColumn(){    return "";}/************************************************************************//*                         OGR_L_GetFIDColumn()                         *//************************************************************************/const char *OGR_L_GetFIDColumn( OGRLayerH hLayer ){    return ((OGRLayer *) hLayer)->GetFIDColumn();}/************************************************************************//*                         GetGeometryColumn()                          *//************************************************************************/const char *OGRLayer::GetGeometryColumn(){    return "";}/************************************************************************//*                      OGR_L_GetGeometryColumn()                       *//************************************************************************/const char *OGR_L_GetGeometryColumn( OGRLayerH hLayer ){    return ((OGRLayer *) hLayer)->GetGeometryColumn();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -