patch_for_1446.diff

patch that enables adding of attributes in shapefiles via OGR - Jürgen Fischer, 2008-12-07 05:07 PM

Download (2.88 KB)

View differences:

src/providers/ogr/qgsogrprovider.cpp (working copy)
189 189
        case OFTReal: varType = QVariant::Double; break;
190 190
          // unsupported in OGR 1.3
191 191
          //case OFTDateTime: varType = QVariant::DateTime; break;
192
#if GDAL_VERSION_NUM >= 1400
192
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 1400
193 193
        case OFTString: varType = QVariant::String; break;
194 194
#endif
195 195
        default: varType = QVariant::String; // other unsupported, leave it as a string
......
578 578

  
579 579
  for ( QgsNewAttributesMap::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter )
580 580
  {
581
    OGRFieldDefnH fielddefn =
582
      OGR_Fld_Create( mEncoding->fromUnicode( iter.key() ).data(), OFTInteger );
581
    OGRFieldDefnH fielddefn = OGR_Fld_Create( mEncoding->fromUnicode( iter.key() ).data(), OFTInteger );
583 582

  
584
    if ( *iter == "OFTInteger" )
583
    if ( *iter == "Integer" )
585 584
    {
586 585
      OGR_Fld_SetType( fielddefn, OFTInteger );
586
      OGR_Fld_SetWidth( fielddefn, 10 );
587 587
    }
588
    else if ( *iter == "OFTReal" )
588
    else if ( *iter == "Real" )
589 589
    {
590 590
      OGR_Fld_SetType( fielddefn, OFTReal );
591 591
    }
592
    else if ( *iter == "OFTString" )
592
    else if ( *iter == "String" )
593 593
    {
594 594
      OGR_Fld_SetType( fielddefn, OFTString );
595 595
    }
596 596
    else
597 597
    {
598
      QgsLogger::warning( "QgsOgrProvider::addAttributes, type not found" );
598
      QgsLogger::warning( QString("QgsOgrProvider::addAttributes, type %1 not found").arg(*iter) );
599 599
      returnvalue = false;
600 600
      continue;
601 601
    }
602 602

  
603 603
    if ( OGR_L_CreateField( ogrLayer, fielddefn, TRUE ) != OGRERR_NONE )
604 604
    {
605
      QgsLogger::warning( "QgsOgrProvider.cpp: writing of OFTInteger field failed" );
605
      QgsLogger::warning( "QgsOgrProvider.cpp: writing of field failed" );
606 606
      returnvalue = false;
607 607
    }
608 608
    OGR_Fld_Destroy( fielddefn );
......
857 857
    {
858 858
      // Ideally this should test for Shapefile type and GDAL >= 1.2.6
859 859
      // In reality, createSpatialIndex() looks after itself.
860
      ability |= QgsVectorDataProvider::CreateSpatialIndex;
860
      ability |= CreateSpatialIndex;
861 861
    }
862 862

  
863
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 1600
864
    // adding attributes was added in GDAL 1.6
865
    if ( ogrDriverName.startsWith( "ESRI" ) )
866
    {
867
      ability |= AddAttributes;
868
    }
869
#endif
870

  
863 871
    // OGR doesn't handle shapefiles without attributes, ie. missing DBFs well, fixes #803
864 872
    if ( ogrDriverName.startsWith( "ESRI" ) && mAttributeFields.size() == 0 )
865 873
    {
......
1221 1229
  OGR_DS_Destroy( dataSource );
1222 1230

  
1223 1231
  QgsDebugMsg( QString( "GDAL Version number %1" ).arg( GDAL_VERSION_NUM ) );
1224
#if GDAL_VERSION_NUM >= 1310
1232
#if defined(GDAL_VERSION_NUM) && GDAL_VERSION_NUM >= 1310
1225 1233
  if ( reference )
1226 1234
  {
1227 1235
    OSRRelease( reference );