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

📄 ogrshapedatasource.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -------------------------------------------------------------------- *//*      Add layer to data source layer list.                            *//* -------------------------------------------------------------------- */    papoLayers = (OGRShapeLayer **)        CPLRealloc( papoLayers,  sizeof(OGRShapeLayer *) * (nLayers+1) );    papoLayers[nLayers++] = poLayer;        return TRUE;}/************************************************************************//*                            CreateLayer()                             *//************************************************************************/OGRLayer *OGRShapeDataSource::CreateLayer( const char * pszLayerName,                                 OGRSpatialReference *poSRS,                                 OGRwkbGeometryType eType,                                 char ** papszOptions ){    SHPHandle   hSHP;    DBFHandle   hDBF;    int         nShapeType;/* -------------------------------------------------------------------- *//*      Verify we are in update mode.                                   *//* -------------------------------------------------------------------- */    if( !bDSUpdate )    {        CPLError( CE_Failure, CPLE_NoWriteAccess,                  "Data source %s opened read-only.\n"                  "New layer %s cannot be created.\n",                  pszName, pszLayerName );        return NULL;    }/* -------------------------------------------------------------------- *//*      Figure out what type of layer we need.                          *//* -------------------------------------------------------------------- */    if( eType == wkbUnknown || eType == wkbLineString )        nShapeType = SHPT_ARC;    else if( eType == wkbPoint )        nShapeType = SHPT_POINT;    else if( eType == wkbPolygon )        nShapeType = SHPT_POLYGON;    else if( eType == wkbMultiPoint )        nShapeType = SHPT_MULTIPOINT;    else if( eType == wkbPoint25D )        nShapeType = SHPT_POINTZ;    else if( eType == wkbLineString25D )        nShapeType = SHPT_ARCZ;    else if( eType == wkbMultiLineString )        nShapeType = SHPT_ARC;    else if( eType == wkbMultiLineString25D )        nShapeType = SHPT_ARCZ;    else if( eType == wkbPolygon25D )        nShapeType = SHPT_POLYGONZ;    else if( eType == wkbMultiPolygon )        nShapeType = SHPT_POLYGON;    else if( eType == wkbMultiPolygon25D )        nShapeType = SHPT_POLYGONZ;    else if( eType == wkbMultiPoint25D )        nShapeType = SHPT_MULTIPOINTZ;    else if( eType == wkbNone )        nShapeType = SHPT_NULL;    else        nShapeType = -1;/* -------------------------------------------------------------------- *//*      Has the application overridden this with a special creation     *//*      option?                                                         *//* -------------------------------------------------------------------- */    const char *pszOverride = CSLFetchNameValue( papszOptions, "SHPT" );    if( pszOverride == NULL )        /* ignore */;    else if( EQUAL(pszOverride,"POINT") )    {        nShapeType = SHPT_POINT;        eType = wkbPoint;    }    else if( EQUAL(pszOverride,"ARC") )    {        nShapeType = SHPT_ARC;        eType = wkbLineString;    }    else if( EQUAL(pszOverride,"POLYGON") )    {        nShapeType = SHPT_POLYGON;        eType = wkbPolygon;    }    else if( EQUAL(pszOverride,"MULTIPOINT") )    {        nShapeType = SHPT_MULTIPOINT;        eType = wkbMultiPoint;    }    else if( EQUAL(pszOverride,"POINTZ") )    {        nShapeType = SHPT_POINTZ;        eType = wkbPoint25D;    }    else if( EQUAL(pszOverride,"ARCZ") )    {        nShapeType = SHPT_ARCZ;        eType = wkbLineString25D;    }    else if( EQUAL(pszOverride,"POLYGONZ") )    {        nShapeType = SHPT_POLYGONZ;        eType = wkbPolygon25D;    }    else if( EQUAL(pszOverride,"MULTIPOINTZ") )    {        nShapeType = SHPT_MULTIPOINTZ;        eType = wkbMultiPoint25D;    }    else if( EQUAL(pszOverride,"NONE") )    {        nShapeType = SHPT_NULL;    }    else    {        CPLError( CE_Failure, CPLE_NotSupported,                  "Unknown SHPT value of `%s' passed to Shapefile layer\n"                  "creation.  Creation aborted.\n",                  pszOverride );        return NULL;    }    if( nShapeType == -1 )    {        CPLError( CE_Failure, CPLE_NotSupported,                  "Geometry type of `%s' not supported in shapefiles.\n"                  "Type can be overridden with a layer creation option\n"                  "of SHPT=POINT/ARC/POLYGON/MULTIPOINT.\n",                  OGRGeometryTypeToName(eType) );        return NULL;    }    /* -------------------------------------------------------------------- *//*      What filename do we use, excluding the extension?               *//* -------------------------------------------------------------------- */    char *pszBasename;    if( bSingleNewFile && nLayers == 0 )    {        char *pszPath = CPLStrdup(CPLGetPath(pszName));        char *pszFBasename = CPLStrdup(CPLGetBasename(pszName));        pszBasename = CPLStrdup(CPLFormFilename(pszPath, pszFBasename, NULL));        CPLFree( pszFBasename );        CPLFree( pszPath );    }    else if( bSingleNewFile )    {        char *pszPath = CPLStrdup(CPLGetPath(pszName));        pszBasename = CPLStrdup(CPLFormFilename(pszPath,pszLayerName,NULL));        CPLFree( pszPath );    }    else        pszBasename = CPLStrdup(CPLFormFilename(pszName,pszLayerName,NULL));/* -------------------------------------------------------------------- *//*      Create the shapefile.                                           *//* -------------------------------------------------------------------- */    char        *pszFilename;    if( nShapeType != SHPT_NULL )    {        pszFilename = CPLStrdup(CPLFormFilename( NULL, pszBasename, "shp" ));        hSHP = SHPCreate( pszFilename, nShapeType );                if( hSHP == NULL )        {            CPLError( CE_Failure, CPLE_OpenFailed,                      "Failed to open Shapefile `%s'.\n",                      pszFilename );            CPLFree( pszFilename );            CPLFree( pszBasename );            return NULL;        }        CPLFree( pszFilename );    }    else        hSHP = NULL;/* -------------------------------------------------------------------- *//*      Create a DBF file.                                              *//* -------------------------------------------------------------------- */    pszFilename = CPLStrdup(CPLFormFilename( NULL, pszBasename, "dbf" ));        hDBF = DBFCreate( pszFilename );    if( hDBF == NULL )    {        CPLError( CE_Failure, CPLE_OpenFailed,                  "Failed to open Shape DBF file `%s'.\n",                  pszFilename );        CPLFree( pszFilename );        CPLFree( pszBasename );        return NULL;    }    CPLFree( pszFilename );/* -------------------------------------------------------------------- *//*      Create the .prj file, if required.                              *//* -------------------------------------------------------------------- */    if( poSRS != NULL )    {        char    *pszWKT = NULL;        CPLString osPrjFile = CPLFormFilename( NULL, pszBasename, "prj");        FILE    *fp;        /* the shape layer needs it's own copy */        poSRS = poSRS->Clone();        poSRS->morphToESRI();        if( poSRS->exportToWkt( &pszWKT ) == OGRERR_NONE             && (fp = VSIFOpen( osPrjFile, "wt" )) != NULL )        {            VSIFWrite( pszWKT, strlen(pszWKT), 1, fp );            VSIFClose( fp );        }        CPLFree( pszWKT );    }/* -------------------------------------------------------------------- *//*      Create the layer object.                                        *//* -------------------------------------------------------------------- */    OGRShapeLayer       *poLayer;    poLayer = new OGRShapeLayer( pszBasename, hSHP, hDBF, poSRS, TRUE,                                 eType );        poLayer->InitializeIndexSupport( pszBasename );    CPLFree( pszBasename );/* -------------------------------------------------------------------- *//*      Add layer to data source layer list.                            *//* -------------------------------------------------------------------- */    papoLayers = (OGRShapeLayer **)        CPLRealloc( papoLayers,  sizeof(OGRShapeLayer *) * (nLayers+1) );        papoLayers[nLayers++] = poLayer;    return poLayer;}/************************************************************************//*                           TestCapability()                           *//************************************************************************/int OGRShapeDataSource::TestCapability( const char * pszCap ){    if( EQUAL(pszCap,ODsCCreateLayer) )        return TRUE;    else        return FALSE;}/************************************************************************//*                              GetLayer()                              *//************************************************************************/OGRLayer *OGRShapeDataSource::GetLayer( int iLayer ){    if( iLayer < 0 || iLayer >= nLayers )        return NULL;    else        return papoLayers[iLayer];}/************************************************************************//*                             ExecuteSQL()                             *//*                                                                      *//*      We override this to provide special handling of CREATE          *//*      SPATIAL INDEX commands.  Support forms are:                     *//*                                                                      *//*        CREATE SPATIAL INDEX ON layer_name [DEPTH n]                  *//*        DROP SPATIAL INDEX ON layer_name                              *//*        REPACK layer_name                                             *//************************************************************************/OGRLayer * OGRShapeDataSource::ExecuteSQL( const char *pszStatement,                                           OGRGeometry *poSpatialFilter,                                           const char *pszDialect ){/* ==================================================================== *//*      Handle command to drop a spatial index.                         *//* ==================================================================== */    if( EQUALN(pszStatement, "REPACK ", 7) )    {        OGRShapeLayer *poLayer = (OGRShapeLayer *)             GetLayerByName( pszStatement + 7 );        if( poLayer != NULL )            poLayer->Repack();        else        {            CPLError( CE_Failure, CPLE_AppDefined,                       "No such layer as '%s' in REPACK.",                       pszStatement + 7 );        }        return NULL;    }    /* ==================================================================== *//*      Handle command to drop a spatial index.                         *//* ==================================================================== */    if( EQUALN(pszStatement, "DROP SPATIAL INDEX ON ", 22) )    {        OGRShapeLayer *poLayer = (OGRShapeLayer *)             GetLayerByName( pszStatement + 22 );        if( poLayer != NULL )            poLayer->DropSpatialIndex();        else        {            CPLError( CE_Failure, CPLE_AppDefined,                       "No such layer as '%s' in DROP SPATIAL INDEX.",                       pszStatement + 19 );        }        return NULL;    }    /* ==================================================================== *//*      Handle all comands except spatial index creation generically.   *//* ==================================================================== */    if( !EQUALN(pszStatement,"CREATE SPATIAL INDEX ON ",24) )        return OGRDataSource::ExecuteSQL( pszStatement, poSpatialFilter,                                           pszDialect );/* -------------------------------------------------------------------- *//*      Parse into keywords.                                            *//* -------------------------------------------------------------------- */    char **papszTokens = CSLTokenizeString( pszStatement );        if( CSLCount(papszTokens) < 5        || !EQUAL(papszTokens[0],"CREATE")        || !EQUAL(papszTokens[1],"SPATIAL")        || !EQUAL(papszTokens[2],"INDEX")         || !EQUAL(papszTokens[3],"ON")         || CSLCount(papszTokens) > 7         || (CSLCount(papszTokens) == 7 && !EQUAL(papszTokens[5],"DEPTH")) )    {        CSLDestroy( papszTokens );        CPLError( CE_Failure, CPLE_AppDefined,                   "Syntax error in CREATE SPATIAL INDEX command.\n"                  "Was '%s'\n"                  "Should be of form 'CREATE SPATIAL INDEX ON <table> [DEPTH <n>]'",                  pszStatement );        return NULL;    }/* -------------------------------------------------------------------- *//*      Get depth if provided.                                          *//* -------------------------------------------------------------------- */    int nDepth = 0;    if( CSLCount(papszTokens) == 7 )        nDepth = atoi(papszTokens[6]);/* -------------------------------------------------------------------- *//*      What layer are we operating on.                                 *//* -------------------------------------------------------------------- */    OGRShapeLayer *poLayer = (OGRShapeLayer *) GetLayerByName(papszTokens[4]);    CSLDestroy( papszTokens );    if( poLayer == NULL )    {        CPLError( CE_Failure, CPLE_AppDefined,                   "Layer %s not recognised.",                   papszTokens[4] );        return NULL;    }    poLayer->CreateSpatialIndex( nDepth );    return NULL;}

⌨️ 快捷键说明

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