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

📄 ogrdgnlayer.cpp

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    char                szFullStyle[256];    int                 nFillColor;    if( DGNGetShapeFillInfo( hDGN, psElement, &nFillColor )         && DGNLookupColor( hDGN, nFillColor,                            &gv_red, &gv_green, &gv_blue ) )    {        sprintf( szFullStyle,                  "BRUSH(fc:#%02x%02x%02x,id:\"ogr-brush-0\")",                 gv_red, gv_green, gv_blue );                      if( nFillColor != psElement->color )        {            strcat( szFullStyle, ";" );            strcat( szFullStyle, pszPen );        }        poFeature->SetStyleString( szFullStyle );    }    else        poFeature->SetStyleString( pszPen );}/************************************************************************//*                          ElementToFeature()                          *//************************************************************************/OGRFeature *OGRDGNLayer::ElementToFeature( DGNElemCore *psElement ){    OGRFeature  *poFeature = new OGRFeature( poFeatureDefn );    poFeature->SetFID( psElement->element_id );    poFeature->SetField( "Type", psElement->type );    poFeature->SetField( "Level", psElement->level );    poFeature->SetField( "GraphicGroup", psElement->graphic_group );    poFeature->SetField( "ColorIndex", psElement->color );    poFeature->SetField( "Weight", psElement->weight );    poFeature->SetField( "Style", psElement->style );        m_nFeaturesRead++;/* -------------------------------------------------------------------- *//*      Collect linkage information                                     *//* -------------------------------------------------------------------- */#define MAX_LINK 100        int anEntityNum[MAX_LINK], anMSLink[MAX_LINK];    unsigned char *pabyData;    int iLink=0, nLinkCount=0;    anEntityNum[0] = 0;    anMSLink[0] = 0;    pabyData = DGNGetLinkage( hDGN, psElement, iLink, NULL,                               anEntityNum+iLink, anMSLink+iLink, NULL );    while( pabyData && nLinkCount < MAX_LINK )    {        iLink++;        if( anEntityNum[nLinkCount] != 0 || anMSLink[nLinkCount] != 0 )            nLinkCount++;        anEntityNum[nLinkCount] = 0;        anMSLink[nLinkCount] = 0;        pabyData = DGNGetLinkage( hDGN, psElement, iLink, NULL,                                   anEntityNum+nLinkCount, anMSLink+nLinkCount,                                   NULL );    }/* -------------------------------------------------------------------- *//*      Apply attribute linkage to feature.                             *//* -------------------------------------------------------------------- */    if( nLinkCount > 0 )    {        if( EQUAL(pszLinkFormat,"FIRST") )        {            poFeature->SetField( "EntityNum", anEntityNum[0] );            poFeature->SetField( "MSLink", anMSLink[0] );        }        else if( EQUAL(pszLinkFormat,"LIST") )        {            poFeature->SetField( "EntityNum", nLinkCount, anEntityNum );            poFeature->SetField( "MSLink", nLinkCount, anMSLink );        }        else if( EQUAL(pszLinkFormat,"STRING") )        {            char szEntityList[MAX_LINK*9], szMSLinkList[MAX_LINK*9];            int nEntityLen = 0, nMSLinkLen = 0;            for( iLink = 0; iLink < nLinkCount; iLink++ )            {                if( iLink != 0 )                {                    szEntityList[nEntityLen++] = ',';                    szMSLinkList[nMSLinkLen++] = ',';                }                sprintf( szEntityList + nEntityLen, "%d", anEntityNum[iLink]);                sprintf( szMSLinkList + nMSLinkLen, "%d", anMSLink[iLink] );                                nEntityLen += strlen(szEntityList + nEntityLen );                nMSLinkLen += strlen(szMSLinkList + nMSLinkLen );            }            poFeature->SetField( "EntityNum", szEntityList );            poFeature->SetField( "MSLink", szMSLinkList );        }    }/* -------------------------------------------------------------------- *//*      Lookup color.                                                   *//* -------------------------------------------------------------------- */    char        gv_color[128];    int         gv_red, gv_green, gv_blue;    char        szFSColor[128], szPen[256];    szFSColor[0] = '\0';    if( DGNLookupColor( hDGN, psElement->color,                         &gv_red, &gv_green, &gv_blue ) )    {        sprintf( gv_color, "%f %f %f 1.0",                  gv_red / 255.0, gv_green / 255.0, gv_blue / 255.0 );        sprintf( szFSColor, "c:#%02x%02x%02x",                  gv_red, gv_green, gv_blue );    }/* -------------------------------------------------------------------- *//*      Generate corresponding PEN style.                               *//* -------------------------------------------------------------------- */    if( psElement->style == DGNS_SOLID )        sprintf( szPen, "PEN(id:\"ogr-pen-0\"" );    else if( psElement->style == DGNS_DOTTED )        sprintf( szPen, "PEN(id:\"ogr-pen-5\"" );    else if( psElement->style == DGNS_MEDIUM_DASH )        sprintf( szPen, "PEN(id:\"ogr-pen-2\"" );    else if( psElement->style == DGNS_LONG_DASH )        sprintf( szPen, "PEN(id:\"ogr-pen-4\"" );    else if( psElement->style == DGNS_DOT_DASH )        sprintf( szPen, "PEN(id:\"ogr-pen-6\"" );    else if( psElement->style == DGNS_SHORT_DASH )        sprintf( szPen, "PEN(id:\"ogr-pen-3\"" );    else if( psElement->style == DGNS_DASH_DOUBLE_DOT )        sprintf( szPen, "PEN(id:\"ogr-pen-7\"" );    else if( psElement->style == DGNS_LONG_DASH_SHORT_DASH )        sprintf( szPen, "PEN(p:\"10px 5px 4px 5px\"" );    else        sprintf( szPen, "PEN(id:\"ogr-pen-0\"" );    if( strlen(szFSColor) > 0 )        sprintf( szPen+strlen(szPen), ",%s", szFSColor );    if( psElement->weight > 1 )        sprintf( szPen+strlen(szPen), ",w:%dpx", psElement->weight );            strcat( szPen, ")" );    switch( psElement->stype )    {      case DGNST_MULTIPOINT:        if( psElement->type == DGNT_SHAPE )        {            OGRLinearRing       *poLine = new OGRLinearRing();            OGRPolygon          *poPolygon = new OGRPolygon();            DGNElemMultiPoint *psEMP = (DGNElemMultiPoint *) psElement;                        poLine->setNumPoints( psEMP->num_vertices );            for( int i = 0; i < psEMP->num_vertices; i++ )            {                poLine->setPoint( i,                                   psEMP->vertices[i].x,                                  psEMP->vertices[i].y,                                  psEMP->vertices[i].z );            }            poPolygon->addRingDirectly( poLine );            poFeature->SetGeometryDirectly( poPolygon );            ConsiderBrush( psElement, szPen, poFeature );        }        else if( psElement->type == DGNT_CURVE )        {            DGNElemMultiPoint *psEMP = (DGNElemMultiPoint *) psElement;            OGRLineString       *poLine = new OGRLineString();            DGNPoint            *pasPoints;            int                 nPoints;            nPoints = 5 * psEMP->num_vertices;            pasPoints = (DGNPoint *) CPLMalloc(sizeof(DGNPoint) * nPoints);                        DGNStrokeCurve( hDGN, psEMP, nPoints, pasPoints );            poLine->setNumPoints( nPoints );            for( int i = 0; i < nPoints; i++ )            {                poLine->setPoint( i,                                   pasPoints[i].x,                                  pasPoints[i].y,                                  pasPoints[i].z );            }            poFeature->SetGeometryDirectly( poLine );            CPLFree( pasPoints );            poFeature->SetStyleString( szPen );        }        else        {            OGRLineString       *poLine = new OGRLineString();            DGNElemMultiPoint *psEMP = (DGNElemMultiPoint *) psElement;                        if( psEMP->num_vertices > 0 )            {                poLine->setNumPoints( psEMP->num_vertices );                for( int i = 0; i < psEMP->num_vertices; i++ )                {                    poLine->setPoint( i,                                       psEMP->vertices[i].x,                                      psEMP->vertices[i].y,                                      psEMP->vertices[i].z );                }                                poFeature->SetGeometryDirectly( poLine );            }            poFeature->SetStyleString( szPen );        }        break;      case DGNST_ARC:      {          OGRLineString *poLine = new OGRLineString();          DGNElemArc    *psArc = (DGNElemArc *) psElement;          DGNPoint      asPoints[90];          int           nPoints;          nPoints = (int) (MAX(1,ABS(psArc->sweepang) / 5) + 1);          DGNStrokeArc( hDGN, psArc, nPoints, asPoints );          poLine->setNumPoints( nPoints );          for( int i = 0; i < nPoints; i++ )          {              poLine->setPoint( i,                                 asPoints[i].x,                                asPoints[i].y,                                asPoints[i].z );          }          poFeature->SetGeometryDirectly( poLine );          poFeature->SetStyleString( szPen );      }      break;      case DGNST_TEXT:      {          OGRPoint      *poPoint = new OGRPoint();          DGNElemText   *psText = (DGNElemText *) psElement;          char          *pszOgrFS;          poPoint->setX( psText->origin.x );          poPoint->setY( psText->origin.y );          poPoint->setZ( psText->origin.z );          poFeature->SetGeometryDirectly( poPoint );          pszOgrFS = (char *) CPLMalloc(strlen(psText->string) + 150);          // setup the basic label.          sprintf( pszOgrFS, "LABEL(t:\"%s\"",  psText->string );          // set the color if we have it.           if( strlen(szFSColor) > 0 )              sprintf( pszOgrFS+strlen(pszOgrFS), ",%s", szFSColor );          // Add the size info in ground units.          if( ABS(psText->height_mult) >= 6.0 )              sprintf( pszOgrFS+strlen(pszOgrFS), ",s:%dg",                        (int) psText->height_mult );          else if( ABS(psText->height_mult) > 0.1 )              sprintf( pszOgrFS+strlen(pszOgrFS), ",s:%.3fg",                        psText->height_mult );          else              sprintf( pszOgrFS+strlen(pszOgrFS), ",s:%.12fg",                        psText->height_mult );          // Add the angle, if not horizontal          if( psText->rotation != 0.0 )              sprintf( pszOgrFS+strlen(pszOgrFS), ",a:%d",                        (int) (psText->rotation+0.5) );          strcat( pszOgrFS, ")" );          poFeature->SetStyleString( pszOgrFS );          CPLFree( pszOgrFS );          poFeature->SetField( "Text", psText->string );      }      break;      case DGNST_COMPLEX_HEADER:      {          DGNElemComplexHeader *psHdr = (DGNElemComplexHeader *) psElement;          int           iChild;          OGRMultiLineString  oChildren;          /* collect subsequent child geometries. */          // we should disable the spatial filter ... add later.          for( iChild = 0; iChild < psHdr->numelems; iChild++ )          {              OGRFeature *poChildFeature = NULL;              DGNElemCore *psChildElement;              psChildElement = DGNReadElement( hDGN );              // should verify complex bit set, not another header.              if( psChildElement != NULL )              {                  poChildFeature = ElementToFeature( psChildElement );                  DGNFreeElement( hDGN, psChildElement );              }              if( poChildFeature != NULL                  && poChildFeature->GetGeometryRef() != NULL )              {                  OGRGeometry *poGeom;                  poGeom = poChildFeature->GetGeometryRef();                  if( wkbFlatten(poGeom->getGeometryType()) == wkbLineString )                      oChildren.addGeometry( poGeom );              }              if( poChildFeature != NULL )                  delete poChildFeature;          }          // Try to assemble into polygon geometry.          OGRGeometry *poGeom;          if( psElement->type == DGNT_COMPLEX_SHAPE_HEADER )              poGeom = (OGRPolygon *)                   OGRBuildPolygonFromEdges( (OGRGeometryH) &oChildren,                                             TRUE, TRUE, 100000, NULL );          else              poGeom = oChildren.clone();          if( poGeom != NULL )              poFeature->SetGeometryDirectly( poGeom );          ConsiderBrush( psElement, szPen, poFeature );      }      break;      default:        break;    }    return poFeature;}/************************************************************************//*                           GetNextFeature()                           *//************************************************************************/OGRFeature *OGRDGNLayer::GetNextFeature(){    DGNElemCore *psElement;    DGNGetElementIndex( hDGN, NULL );    while( (psElement = DGNReadElement( hDGN )) != NULL )    {        OGRFeature      *poFeature;        if( psElement->deleted )        {

⌨️ 快捷键说明

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