LCOV - code coverage report
Current view: directory - ogr/ogrsf_frmts/segy - ogrsegylayer.cpp (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 323 271 83.9 %
Date: 2012-04-28 Functions: 17 10 58.8 %

       1                 : /******************************************************************************
       2                 :  * $Id: ogrsegylayer.cpp 23292 2011-10-30 09:16:40Z rouault $
       3                 :  *
       4                 :  * Project:  SEG-Y Translator
       5                 :  * Purpose:  Implements OGRSEGYLayer class.
       6                 :  * Author:   Even Rouault, <even dot rouault at mines dash paris dot org>
       7                 :  *
       8                 :  ******************************************************************************
       9                 :  * Copyright (c) 2011, Even Rouault <even dot rouault at mines dash paris dot org>
      10                 :  *
      11                 :  * Permission is hereby granted, free of charge, to any person obtaining a
      12                 :  * copy of this software and associated documentation files (the "Software"),
      13                 :  * to deal in the Software without restriction, including without limitation
      14                 :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      15                 :  * and/or sell copies of the Software, and to permit persons to whom the
      16                 :  * Software is furnished to do so, subject to the following conditions:
      17                 :  *
      18                 :  * The above copyright notice and this permission notice shall be included
      19                 :  * in all copies or substantial portions of the Software.
      20                 :  *
      21                 :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
      22                 :  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      23                 :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
      24                 :  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMSEGYS OR OTHER
      25                 :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
      26                 :  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
      27                 :  * DEALINGS IN THE SOFTWARE.
      28                 :  ****************************************************************************/
      29                 : 
      30                 : #include "ogr_segy.h"
      31                 : #include "cpl_conv.h"
      32                 : #include "cpl_string.h"
      33                 : #include "ogr_p.h"
      34                 : #include "ogr_srs_api.h"
      35                 : 
      36                 : CPL_CVSID("$Id: ogrsegylayer.cpp 23292 2011-10-30 09:16:40Z rouault $");
      37                 : 
      38                 : #define DT_IBM_4BYTES_FP         1
      39                 : #define DT_4BYTES_INT            2
      40                 : #define DT_2BYTES_INT            3
      41                 : #define DT_4BYTES_FP_WITH_GAIN   4
      42                 : #define DT_IEEE_4BYTES_FP        5
      43                 : #define DT_1BYTE_INT             8
      44                 : 
      45                 : typedef struct
      46                 : {
      47                 :     const char*     pszName;
      48                 :     OGRFieldType    eType;
      49                 : } FieldDesc;
      50                 : 
      51                 : static const FieldDesc SEGYFields[] =
      52                 : {
      53                 :     { "TRACE_NUMBER_WITHIN_LINE", OFTInteger },
      54                 :     { "TRACE_NUMBER_WITHIN_FILE", OFTInteger },
      55                 :     { "ORIGINAL_FIELD_RECORD_NUMBER", OFTInteger },
      56                 :     { "TRACE_NUMBER_WITHIN_ORIGINAL_FIELD_RECORD", OFTInteger },
      57                 :     { "TRACE_IDENTIFICATION_CODE", OFTInteger },
      58                 :     { "ENSEMBLE_NUMBER", OFTInteger },
      59                 :     { "TRACE_NUMBER_WITHIN_ENSEMBLE", OFTInteger },
      60                 :     { "NUMBER_VERTICAL_SUMMED_TRACES", OFTInteger },
      61                 :     { "NUMBER_HORIZONTAL_STACKED_TRACES", OFTInteger },
      62                 :     { "DATA_USE", OFTInteger },
      63                 :     { "DISTANCE_SOURCE_GROUP", OFTInteger },
      64                 :     { "RECEIVER_GROUP_ELEVATION", OFTInteger },
      65                 :     { "SURFACE_ELEVATION_AT_SOURCE", OFTInteger },
      66                 :     { "SOURCE_DEPTH_BELOW_SURFACE", OFTInteger },
      67                 :     { "DATUM_ELEVATION_AT_RECEIVER_GROUP", OFTInteger },
      68                 :     { "DATUM_ELEVATION_AT_SOURCE", OFTInteger },
      69                 :     { "WATER_DEPTH_AT_SOURCE", OFTInteger },
      70                 :     { "WATER_DEPTH_AT_GROUP", OFTInteger },
      71                 :     { "VERTICAL_SCALAR", OFTInteger },
      72                 :     { "HORIZONTAL_SCALAR", OFTInteger },
      73                 :     { "SOURCE_X", OFTInteger },
      74                 :     { "SOURCE_Y", OFTInteger },
      75                 :     { "GROUP_X", OFTInteger },
      76                 :     { "GROUP_Y", OFTInteger },
      77                 :     { "COORDINATE_UNITS", OFTInteger },
      78                 :     { "WEATHERING_VELOCITY", OFTInteger },
      79                 :     { "SUB_WEATHERING_VELOCITY", OFTInteger },
      80                 :     { "UPHOLE_TIME_AT_SOURCE", OFTInteger },
      81                 :     { "UPHOLE_TIME_AT_GROUP", OFTInteger },
      82                 :     { "SOURCE_STATIC_CORRECTION", OFTInteger },
      83                 :     { "GROUP_STATIC_CORRECTION", OFTInteger },
      84                 :     { "TOTAL_STATIC_CORRECTION", OFTInteger },
      85                 :     { "LAG_TIME_A", OFTInteger },
      86                 :     { "LAG_TIME_B", OFTInteger },
      87                 :     { "DELAY_RECORDING_TIME", OFTInteger },
      88                 :     { "MUTE_TIME_START", OFTInteger },
      89                 :     { "MUTE_TIME_END", OFTInteger },
      90                 :     { "SAMPLES", OFTInteger },
      91                 :     { "SAMPLE_INTERVAL", OFTInteger },
      92                 :     { "GAIN_TYPE", OFTInteger },
      93                 :     { "INSTRUMENT_GAIN_CONSTANT", OFTInteger },
      94                 :     { "INSTRUMENT_INITIAL_GAIN", OFTInteger },
      95                 :     { "CORRELATED", OFTInteger },
      96                 :     { "SWEEP_FREQUENCY_AT_START", OFTInteger },
      97                 :     { "SWEEP_FREQUENCY_AT_END", OFTInteger },
      98                 :     { "SWEEP_LENGTH", OFTInteger },
      99                 :     { "SWEEP_TYPE", OFTInteger },
     100                 :     { "SWEEP_TRACE_TAPER_LENGTH_AT_START", OFTInteger },
     101                 :     { "SWEEP_TRACE_TAPER_LENGTH_AT_END", OFTInteger },
     102                 :     { "TAPER_TYPE", OFTInteger },
     103                 :     { "ALIAS_FILTER_FREQUENCY", OFTInteger },
     104                 :     { "ALIAS_FILTER_SLOPE", OFTInteger },
     105                 :     { "NOTCH_FILTER_FREQUENCY", OFTInteger },
     106                 :     { "NOTCH_FILTER_SLOPE", OFTInteger },
     107                 :     { "LOW_CUT_FREQUENCY", OFTInteger },
     108                 :     { "HIGH_CUT_FREQUENCY", OFTInteger },
     109                 :     { "LOW_CUT_SLOPE", OFTInteger },
     110                 :     { "HIGH_CUT_SLOPE", OFTInteger },
     111                 :     { "YEAR", OFTInteger },
     112                 :     { "DAY_OF_YEAR", OFTInteger },
     113                 :     { "HOUR", OFTInteger },
     114                 :     { "MINUTE", OFTInteger },
     115                 :     { "SECOND", OFTInteger },
     116                 :     { "TIME_BASIC_CODE", OFTInteger },
     117                 :     { "TRACE_WEIGHTING_FACTOR", OFTInteger },
     118                 :     { "GEOPHONE_GROUP_NUMBER_OF_ROLL_SWITH", OFTInteger },
     119                 :     { "GEOPHONE_GROUP_NUMBER_OF_TRACE_NUMBER_ONE", OFTInteger },
     120                 :     { "GEOPHONE_GROUP_NUMBER_OF_LAST_TRACE", OFTInteger },
     121                 :     { "GAP_SIZE", OFTInteger },
     122                 :     { "OVER_TRAVEL", OFTInteger },
     123                 : };
     124                 : 
     125                 : /* SEGY >= 1.0 */
     126                 : static const FieldDesc SEGYFields10[] =
     127                 : {
     128                 :     { "INLINE_NUMBER", OFTInteger },
     129                 :     { "CROSSLINE_NUMBER", OFTInteger },
     130                 :     { "SHOTPOINT_NUMBER", OFTInteger },
     131                 :     { "SHOTPOINT_SCALAR", OFTInteger },
     132                 : };
     133                 : 
     134                 : #define TRACE_NUMBER_WITHIN_LINE 0
     135                 : #define TRACE_NUMBER_WITHIN_FILE 1
     136                 : #define ORIGINAL_FIELD_RECORD_NUMBER 2
     137                 : #define TRACE_NUMBER_WITHIN_ORIGINAL_FIELD_RECORD 3
     138                 : #define TRACE_IDENTIFICATION_CODE 4
     139                 : #define ENSEMBLE_NUMBER 5
     140                 : #define TRACE_NUMBER_WITHIN_ENSEMBLE 6
     141                 : #define NUMBER_VERTICAL_SUMMED_TRACES 7
     142                 : #define NUMBER_HORIZONTAL_STACKED_TRACES 8
     143                 : #define DATA_USE 9
     144                 : #define DISTANCE_SOURCE_GROUP 10
     145                 : #define RECEIVER_GROUP_ELEVATION 11
     146                 : #define SURFACE_ELEVATION_AT_SOURCE 12
     147                 : #define SOURCE_DEPTH_BELOW_SURFACE 13
     148                 : #define DATUM_ELEVATION_AT_RECEIVER_GROUP 14
     149                 : #define DATUM_ELEVATION_AT_SOURCE 15
     150                 : #define WATER_DEPTH_AT_SOURCE 16
     151                 : #define WATER_DEPTH_AT_GROUP 17
     152                 : #define VERTICAL_SCALAR 18
     153                 : #define HORIZONTAL_SCALAR 19
     154                 : #define SOURCE_X 20
     155                 : #define SOURCE_Y 21
     156                 : #define GROUP_X 22
     157                 : #define GROUP_Y 23
     158                 : #define COORDINATE_UNITS 24
     159                 : #define WEATHERING_VELOCITY 25
     160                 : #define SUB_WEATHERING_VELOCITY 26
     161                 : #define UPHOLE_TIME_AT_SOURCE 27
     162                 : #define UPHOLE_TIME_AT_GROUP 28
     163                 : #define SOURCE_STATIC_CORRECTION 29
     164                 : #define GROUP_STATIC_CORRECTION 30
     165                 : #define TOTAL_STATIC_CORRECTION 31
     166                 : #define LAG_TIME_A 32
     167                 : #define LAG_TIME_B 33
     168                 : #define DELAY_RECORDING_TIME 34
     169                 : #define MUTE_TIME_START 35
     170                 : #define MUTE_TIME_END 36
     171                 : #define SAMPLES 37
     172                 : #define SAMPLE_INTERVAL 38
     173                 : #define GAIN_TYPE 39
     174                 : #define INSTRUMENT_GAIN_CONSTANT 40
     175                 : #define INSTRUMENT_INITIAL_GAIN 41
     176                 : #define CORRELATED 42
     177                 : #define SWEEP_FREQUENCY_AT_START 43
     178                 : #define SWEEP_FREQUENCY_AT_END 44
     179                 : #define SWEEP_LENGTH 45
     180                 : #define SWEEP_TYPE 46
     181                 : #define SWEEP_TRACE_TAPER_LENGTH_AT_START 47
     182                 : #define SWEEP_TRACE_TAPER_LENGTH_AT_END 48
     183                 : #define TAPER_TYPE 49
     184                 : #define ALIAS_FILTER_FREQUENCY 50
     185                 : #define ALIAS_FILTER_SLOPE 51
     186                 : #define NOTCH_FILTER_FREQUENCY 52
     187                 : #define NOTCH_FILTER_SLOPE 53
     188                 : #define LOW_CUT_FREQUENCY 54
     189                 : #define HIGH_CUT_FREQUENCY 55
     190                 : #define LOW_CUT_SLOPE 56
     191                 : #define HIGH_CUT_SLOPE 57
     192                 : #define YEAR 58
     193                 : #define DAY_OF_YEAR 59
     194                 : #define HOUR 60
     195                 : #define MINUTE 61
     196                 : #define SECOND 62
     197                 : #define TIME_BASIC_CODE 63
     198                 : #define TRACE_WEIGHTING_FACTOR 64
     199                 : #define GEOPHONE_GROUP_NUMBER_OF_ROLL_SWITH 65
     200                 : #define GEOPHONE_GROUP_NUMBER_OF_TRACE_NUMBER_ONE 66
     201                 : #define GEOPHONE_GROUP_NUMBER_OF_LAST_TRACE 67
     202                 : #define GAP_SIZE 68
     203                 : #define OVER_TRAVEL 69
     204                 : #define INLINE_NUMBER 70
     205                 : #define CROSSLINE_NUMBER 71
     206                 : #define SHOTPOINT_NUMBER 72
     207                 : #define SHOTPOINT_SCALAR 73
     208                 : 
     209                 : #if 0
     210                 : /************************************************************************/
     211                 : /*                       SEGYReadMSBFloat32()                           */
     212                 : /************************************************************************/
     213                 : 
     214                 : static float SEGYReadMSBFloat32(const GByte* pabyVal)
     215                 : {
     216                 :     float fVal;
     217                 :     memcpy(&fVal, pabyVal, 4);
     218                 :     CPL_MSBPTR32(&fVal);
     219                 :     return fVal;
     220                 : }
     221                 : #endif
     222                 : 
     223                 : /************************************************************************/
     224                 : /*                           OGRSEGYLayer()                            */
     225                 : /************************************************************************/
     226                 : 
     227                 : 
     228               2 : OGRSEGYLayer::OGRSEGYLayer( const char* pszFilename,
     229                 :                             VSILFILE* fp,
     230               2 :                             SEGYBinaryFileHeader* psBFH )
     231                 : 
     232                 : {
     233               2 :     this->fp = fp;
     234               2 :     nNextFID = 0;
     235               2 :     bEOF = FALSE;
     236               2 :     poSRS = NULL;
     237               2 :     memcpy(&sBFH, psBFH, sizeof(sBFH));
     238                 : 
     239               2 :     nDataSize = 0;
     240               2 :     switch (sBFH.nDataSampleType)
     241                 :     {
     242               0 :         case DT_IBM_4BYTES_FP: nDataSize = 4; break;
     243               0 :         case DT_4BYTES_INT: nDataSize = 4; break;
     244               0 :         case DT_2BYTES_INT: nDataSize = 2; break;
     245               0 :         case DT_4BYTES_FP_WITH_GAIN: nDataSize = 4; break;
     246               0 :         case DT_IEEE_4BYTES_FP: nDataSize = 4; break;
     247               0 :         case DT_1BYTE_INT: nDataSize = 1; break;
     248                 :         default: break;
     249                 :     }
     250                 : 
     251               2 :     poFeatureDefn = new OGRFeatureDefn( CPLGetBasename(pszFilename) );
     252               2 :     poFeatureDefn->Reference();
     253               2 :     poFeatureDefn->SetGeomType( wkbPoint );
     254                 : 
     255                 :     int i;
     256             142 :     for(i=0;i<(int)(sizeof(SEGYFields)/sizeof(SEGYFields[0]));i++)
     257                 :     {
     258                 :         OGRFieldDefn    oField( SEGYFields[i].pszName,
     259             140 :                                 SEGYFields[i].eType );
     260             140 :         poFeatureDefn->AddFieldDefn( &oField );
     261                 :     }
     262                 : 
     263               2 :     if (sBFH.dfSEGYRevisionNumber >= 1.0)
     264                 :     {
     265               0 :         for(i=0;i<(int)(sizeof(SEGYFields10)/sizeof(SEGYFields10[0]));i++)
     266                 :         {
     267                 :             OGRFieldDefn    oField( SEGYFields10[i].pszName,
     268               0 :                                     SEGYFields10[i].eType );
     269               0 :             poFeatureDefn->AddFieldDefn( &oField );
     270                 :         }
     271                 :     }
     272                 : 
     273               2 :     OGRFieldDefn oField( "SAMPLE_ARRAY", OFTRealList );
     274               2 :     poFeatureDefn->AddFieldDefn(&oField);
     275                 : 
     276               2 :     ResetReading();
     277               2 : }
     278                 : 
     279                 : /************************************************************************/
     280                 : /*                            ~OGRSEGYLayer()                          */
     281                 : /************************************************************************/
     282                 : 
     283               2 : OGRSEGYLayer::~OGRSEGYLayer()
     284                 : 
     285                 : {
     286               2 :     poFeatureDefn->Release();
     287                 : 
     288               2 :     VSIFCloseL( fp );
     289                 : 
     290               2 :     if (poSRS)
     291               0 :         poSRS->Release();
     292               2 : }
     293                 : 
     294                 : /************************************************************************/
     295                 : /*                            ResetReading()                            */
     296                 : /************************************************************************/
     297                 : 
     298               2 : void OGRSEGYLayer::ResetReading()
     299                 : 
     300                 : {
     301               2 :     nNextFID = 0;
     302               2 :     bEOF = FALSE;
     303                 : 
     304                 :     VSIFSeekL( fp, 3200 + 400 + 3200 * sBFH.nNumberOfExtendedTextualFileHeader,
     305               2 :                SEEK_SET );
     306               2 : }
     307                 : 
     308                 : /************************************************************************/
     309                 : /*                           GetNextFeature()                           */
     310                 : /************************************************************************/
     311                 : 
     312               4 : OGRFeature *OGRSEGYLayer::GetNextFeature()
     313                 : {
     314                 :     OGRFeature  *poFeature;
     315                 : 
     316               0 :     while(TRUE)
     317                 :     {
     318               4 :         poFeature = GetNextRawFeature();
     319               4 :         if (poFeature == NULL)
     320               2 :             return NULL;
     321                 : 
     322               2 :         if((m_poFilterGeom == NULL
     323                 :             || FilterGeometry( poFeature->GetGeometryRef() ) )
     324                 :         && (m_poAttrQuery == NULL
     325                 :             || m_poAttrQuery->Evaluate( poFeature )) )
     326                 :         {
     327               2 :             return poFeature;
     328                 :         }
     329                 :         else
     330               0 :             delete poFeature;
     331                 :     }
     332                 : }
     333                 : 
     334                 : /************************************************************************/
     335                 : /*                             GetIBMFloat()                            */
     336                 : /************************************************************************/
     337                 : 
     338               0 : static float GetIBMFloat(const GByte* pabyData)
     339                 : {
     340                 :     int nVal;
     341               0 :     memcpy(&nVal, pabyData, 4);
     342               0 :     CPL_MSBPTR32(&nVal);
     343               0 :     int nSign = 1 - 2 * ((nVal >> 31) & 0x01);
     344               0 :     int nExp = (nVal >> 24) & 0x7f;
     345               0 :     int nMant = nVal & 0xffffff;
     346                 : 
     347               0 :     if (nExp == 0x7f)
     348                 :     {
     349               0 :         nVal = (nVal & 0x80000000) | (0xff << 23) | (nMant >> 1);
     350                 :         float fVal;
     351               0 :         memcpy(&fVal, &nVal, 4);
     352               0 :         return fVal;
     353                 :     }
     354                 : 
     355               0 :     return (float)((double)nSign * nMant * pow(2.0, 4 * (nExp - 64) - 24));
     356                 : }
     357                 : /************************************************************************/
     358                 : /*                         GetNextRawFeature()                          */
     359                 : /************************************************************************/
     360                 : 
     361               4 : OGRFeature *OGRSEGYLayer::GetNextRawFeature()
     362                 : {
     363               4 :     if (bEOF)
     364               0 :         return NULL;
     365                 : 
     366                 :     GByte abyTraceHeader[240];
     367                 : 
     368               4 :     if ((int)VSIFReadL(abyTraceHeader, 1, 240, fp) != 240)
     369                 :     {
     370               2 :         bEOF = TRUE;
     371               2 :         return NULL;
     372                 :     }
     373                 : 
     374               2 :     int nTraceNumberWithinLine = SEGYReadMSBInt32(abyTraceHeader + 0);
     375               2 :     int nTraceNumberWithinFile = SEGYReadMSBInt32(abyTraceHeader + 4);
     376               2 :     int nOriginalFieldRecordNumber = SEGYReadMSBInt32(abyTraceHeader + 8);
     377               2 :     int nTraceNumberWithinOriginalFieldRecord = SEGYReadMSBInt32(abyTraceHeader + 12);
     378               2 :     int nEnsembleNumber = SEGYReadMSBInt32(abyTraceHeader + 20);
     379               2 :     int nTraceNumberWithinEnsemble = SEGYReadMSBInt32(abyTraceHeader + 24);
     380               2 :     int nTraceIdentificationCode = SEGYReadMSBInt16(abyTraceHeader + 28);
     381               2 :     int nNumberVerticalSummedTraces = SEGYReadMSBInt16(abyTraceHeader + 30);
     382               2 :     int nNumberHorizontalStackedTraces = SEGYReadMSBInt16(abyTraceHeader + 32);
     383               2 :     int nDataUse = SEGYReadMSBInt16(abyTraceHeader + 34);
     384               2 :     int nDistanceSourceGroup = SEGYReadMSBInt32(abyTraceHeader + 36);
     385               2 :     int nReceiverGroupElevation = SEGYReadMSBInt32(abyTraceHeader + 40);
     386               2 :     int nSurfaceElevationAtSource = SEGYReadMSBInt32(abyTraceHeader + 44);
     387               2 :     int nSourceDepthBelowSurface = SEGYReadMSBInt32(abyTraceHeader + 48);
     388               2 :     int nDatumElevationAtReceiverGroup = SEGYReadMSBInt32(abyTraceHeader + 52);
     389               2 :     int nDatumElevationAtSource = SEGYReadMSBInt32(abyTraceHeader + 56);
     390               2 :     int nWaterDepthAtSource = SEGYReadMSBInt32(abyTraceHeader + 60);
     391               2 :     int nWaterDepthAtGroup = SEGYReadMSBInt32(abyTraceHeader + 64);
     392               2 :     int nVerticalScalar = SEGYReadMSBInt16(abyTraceHeader + 68);
     393               2 :     int nHorizontalScalar = SEGYReadMSBInt16(abyTraceHeader + 70);
     394               2 :     int nSourceX = SEGYReadMSBInt32(abyTraceHeader + 72);
     395               2 :     int nSourceY = SEGYReadMSBInt32(abyTraceHeader + 76);
     396               2 :     int nGroupX = SEGYReadMSBInt32(abyTraceHeader + 80);
     397               2 :     int nGroupY = SEGYReadMSBInt32(abyTraceHeader + 84);
     398               2 :     int nCoordinateUnits = SEGYReadMSBInt16(abyTraceHeader + 88);
     399               2 :     int nWeatheringVelocity = SEGYReadMSBInt16(abyTraceHeader + 90);
     400               2 :     int nSubWeatheringVelocity = SEGYReadMSBInt16(abyTraceHeader + 92);
     401                 : 
     402               2 :     int nUpholeTimeAtSource = SEGYReadMSBInt16(abyTraceHeader + 94);
     403               2 :     int nUpholeTimeAtGroup = SEGYReadMSBInt16(abyTraceHeader + 96);
     404               2 :     int nSourceStaticCorrection = SEGYReadMSBInt16(abyTraceHeader + 98);
     405               2 :     int nGroupStaticCorrection = SEGYReadMSBInt16(abyTraceHeader + 100);
     406               2 :     int nTotalStaticCorrection = SEGYReadMSBInt16(abyTraceHeader + 102);
     407               2 :     int nLagTimeA = SEGYReadMSBInt16(abyTraceHeader + 104);
     408               2 :     int nLagTimeB = SEGYReadMSBInt16(abyTraceHeader + 106);
     409               2 :     int nDelayRecordingTime = SEGYReadMSBInt16(abyTraceHeader + 108);
     410               2 :     int nMuteTimeStart = SEGYReadMSBInt16(abyTraceHeader + 110);
     411               2 :     int nMuteTimeEnd = SEGYReadMSBInt16(abyTraceHeader + 112);
     412                 : 
     413               2 :     int nSamples = SEGYReadMSBInt16(abyTraceHeader + 114);
     414               2 :     if (nSamples == 0) /* Happens with ftp://software.seg.org/pub/datasets/2D/Hess_VTI/timodel_c11.segy.gz */
     415               2 :         nSamples = sBFH.nSamplesPerDataTrace;
     416                 : 
     417               2 :     if (nSamples < 0)
     418                 :     {
     419               0 :         bEOF = TRUE;
     420               0 :         return NULL;
     421                 :     }
     422               2 :     int nSampleInterval = SEGYReadMSBInt16(abyTraceHeader + 116);
     423                 : 
     424               2 :     int nGainType = SEGYReadMSBInt16(abyTraceHeader + 118);
     425               2 :     int nInstrumentGainConstant = SEGYReadMSBInt16(abyTraceHeader + 120);
     426               2 :     int nInstrumentInitialGain = SEGYReadMSBInt16(abyTraceHeader + 122);
     427               2 :     int nCorrelated = SEGYReadMSBInt16(abyTraceHeader + 124);
     428               2 :     int nSweepFrequencyAtStart = SEGYReadMSBInt16(abyTraceHeader + 126);
     429               2 :     int nSweepFrequencyAtEnd = SEGYReadMSBInt16(abyTraceHeader + 128);
     430               2 :     int nSweepLength = SEGYReadMSBInt16(abyTraceHeader + 130);
     431               2 :     int nSweepType = SEGYReadMSBInt16(abyTraceHeader + 132);
     432               2 :     int nSweepTraceTaperLengthAtStart = SEGYReadMSBInt16(abyTraceHeader + 134);
     433               2 :     int nSweepTraceTaperLengthAtEnd = SEGYReadMSBInt16(abyTraceHeader + 136);
     434               2 :     int nTaperType = SEGYReadMSBInt16(abyTraceHeader + 138);
     435               2 :     int nAliasFilterFrequency = SEGYReadMSBInt16(abyTraceHeader + 140);
     436               2 :     int nAliasFilterSlope = SEGYReadMSBInt16(abyTraceHeader + 142);
     437               2 :     int nNotchFilterFrequency = SEGYReadMSBInt16(abyTraceHeader + 144);
     438               2 :     int nNotchFilterSlope = SEGYReadMSBInt16(abyTraceHeader + 146);
     439               2 :     int nLowCutFrequency = SEGYReadMSBInt16(abyTraceHeader + 148);
     440               2 :     int nHighCutFrequency = SEGYReadMSBInt16(abyTraceHeader + 150);
     441               2 :     int nLowCutSlope = SEGYReadMSBInt16(abyTraceHeader + 152);
     442               2 :     int nHighCutSlope = SEGYReadMSBInt16(abyTraceHeader + 154);
     443                 : 
     444               2 :     int nYear = SEGYReadMSBInt16(abyTraceHeader + 156);
     445               2 :     int nDayOfYear = SEGYReadMSBInt16(abyTraceHeader + 158);
     446               2 :     int nHour = SEGYReadMSBInt16(abyTraceHeader + 160);
     447               2 :     int nMinute = SEGYReadMSBInt16(abyTraceHeader + 162);
     448               2 :     int nSecond = SEGYReadMSBInt16(abyTraceHeader + 164);
     449               2 :     int nTimeBasicCode = SEGYReadMSBInt16(abyTraceHeader + 166);
     450                 : 
     451               2 :     int nTraceWeightingFactor = SEGYReadMSBInt16(abyTraceHeader + 168);
     452               2 :     int nGeophoneGroupNumberOfRollSwith = SEGYReadMSBInt16(abyTraceHeader + 170);
     453               2 :     int nGeophoneGroupNumberOfTraceNumberOne = SEGYReadMSBInt16(abyTraceHeader + 172);
     454               2 :     int nGeophoneGroupNumberOfLastTrace = SEGYReadMSBInt16(abyTraceHeader + 174);
     455               2 :     int nGapSize = SEGYReadMSBInt16(abyTraceHeader + 176);
     456               2 :     int nOverTravel = SEGYReadMSBInt16(abyTraceHeader + 178);
     457                 : 
     458               2 :     int nInlineNumber = SEGYReadMSBInt32(abyTraceHeader + 188);
     459               2 :     int nCrosslineNumber = SEGYReadMSBInt32(abyTraceHeader + 192);
     460               2 :     int nShotpointNumber = SEGYReadMSBInt32(abyTraceHeader + 196);
     461               2 :     int nShotpointScalar = SEGYReadMSBInt16(abyTraceHeader + 200);
     462                 : 
     463                 : #if 0
     464                 :     /* Extensions of http://sioseis.ucsd.edu/segy.header.html */
     465                 :     float fDeepWaterDelay = SEGYReadMSBFloat32(abyTraceHeader + 180);
     466                 :     float fStartMuteTime  = SEGYReadMSBFloat32(abyTraceHeader + 184);
     467                 :     float fEndMuteTime  = SEGYReadMSBFloat32(abyTraceHeader + 188);
     468                 :     float fSampleInterval  = SEGYReadMSBFloat32(abyTraceHeader + 192);
     469                 :     float fWaterBottomTime  = SEGYReadMSBFloat32(abyTraceHeader + 196);
     470                 :     int nEndOfRp = SEGYReadMSBInt16(abyTraceHeader + 200);
     471                 :     CPLDebug("SIGY", "fDeepWaterDelay = %f", fDeepWaterDelay);
     472                 :     CPLDebug("SIGY", "fStartMuteTime = %f", fStartMuteTime);
     473                 :     CPLDebug("SIGY", "fEndMuteTime = %f", fEndMuteTime);
     474                 :     CPLDebug("SIGY", "fSampleInterval = %f", fSampleInterval);
     475                 :     CPLDebug("SIGY", "fWaterBottomTime = %f", fWaterBottomTime);
     476                 :     CPLDebug("SIGY", "nEndOfRp = %d", nEndOfRp);
     477                 : #endif
     478                 : 
     479                 :     double dfHorizontalScale = (nHorizontalScalar > 0) ? nHorizontalScalar :
     480               2 :                                (nHorizontalScalar < 0) ? 1.0 / -nHorizontalScalar : 1.0;
     481               2 :     if (nCoordinateUnits == 2)
     482               0 :         dfHorizontalScale /= 3600;
     483                 : 
     484               2 :     double dfGroupX = nGroupX * dfHorizontalScale;
     485               2 :     double dfGroupY = nGroupY * dfHorizontalScale;
     486                 : 
     487                 : #if 0
     488                 :     double dfSourceX = nSourceX * dfHorizontalScale;
     489                 :     double dfSourceY = nSourceY * dfHorizontalScale;
     490                 : #endif
     491                 : 
     492                 : #if 0
     493                 :     CPLDebug("SIGY", "nTraceNumberWithinLine = %d", nTraceNumberWithinLine);
     494                 :     CPLDebug("SIGY", "nTraceNumberWithinFile = %d", nTraceNumberWithinFile);
     495                 :     CPLDebug("SIGY", "nOriginalFieldRecordNumber = %d", nOriginalFieldRecordNumber);
     496                 :     CPLDebug("SIGY", "nTraceNumberWithinOriginalFieldRecord = %d", nTraceNumberWithinOriginalFieldRecord);
     497                 :     CPLDebug("SIGY", "nTraceIdentificationCode = %d", nTraceIdentificationCode);
     498                 :     CPLDebug("SIGY", "nEnsembleNumber = %d", nEnsembleNumber);
     499                 :     CPLDebug("SIGY", "nTraceNumberWithinEnsemble = %d", nTraceNumberWithinEnsemble);
     500                 :     CPLDebug("SIGY", "nNumberVerticalSummedTraces = %d", nNumberVerticalSummedTraces);
     501                 :     CPLDebug("SIGY", "nNumberHorizontalStackedTraces = %d", nNumberHorizontalStackedTraces);
     502                 :     CPLDebug("SIGY", "nDataUse = %d", nDataUse);
     503                 :     CPLDebug("SIGY", "nDistanceSourceGroup = %d", nDistanceSourceGroup);
     504                 :     CPLDebug("SIGY", "nReceiverGroupElevation = %d", nReceiverGroupElevation);
     505                 :     CPLDebug("SIGY", "nSurfaceElevationAtSource = %d", nSurfaceElevationAtSource);
     506                 :     CPLDebug("SIGY", "nSourceDepthBelowSurface = %d", nSourceDepthBelowSurface);
     507                 :     CPLDebug("SIGY", "nDatumElevationAtReceiverGroup = %d", nDatumElevationAtReceiverGroup);
     508                 :     CPLDebug("SIGY", "nDatumElevationAtSource = %d", nDatumElevationAtSource);
     509                 :     CPLDebug("SIGY", "nWaterDepthAtSource = %d", nWaterDepthAtSource);
     510                 :     CPLDebug("SIGY", "nWaterDepthAtGroup = %d", nWaterDepthAtGroup);
     511                 :     CPLDebug("SIGY", "nVerticalScalar = %d", nVerticalScalar);
     512                 :     CPLDebug("SIGY", "nHorizontalScalar = %d", nHorizontalScalar);
     513                 :     CPLDebug("SIGY", "nSourceX = %d", nSourceX);
     514                 :     CPLDebug("SIGY", "nSourceY = %d", nSourceY);
     515                 :     CPLDebug("SIGY", "dfSourceX = %f", dfSourceX);
     516                 :     CPLDebug("SIGY", "dfSourceY = %f", dfSourceY);
     517                 :     CPLDebug("SIGY", "nGroupX = %d", nGroupX);
     518                 :     CPLDebug("SIGY", "nGroupY = %d", nGroupY);
     519                 :     CPLDebug("SIGY", "dfGroupX = %f", dfGroupX);
     520                 :     CPLDebug("SIGY", "dfGroupY = %f", dfGroupY);
     521                 :     CPLDebug("SIGY", "nCoordinateUnits = %d", nCoordinateUnits);
     522                 : 
     523                 :     CPLDebug("SIGY", "nWeatheringVelocity = %d", nWeatheringVelocity);
     524                 :     CPLDebug("SIGY", "nSubWeatheringVelocity = %d", nSubWeatheringVelocity);
     525                 :     CPLDebug("SIGY", "nUpholeTimeAtSource = %d", nUpholeTimeAtSource);
     526                 :     CPLDebug("SIGY", "nUpholeTimeAtGroup = %d", nUpholeTimeAtGroup);
     527                 :     CPLDebug("SIGY", "nSourceStaticCorrection = %d", nSourceStaticCorrection);
     528                 :     CPLDebug("SIGY", "nGroupStaticCorrection = %d", nGroupStaticCorrection);
     529                 :     CPLDebug("SIGY", "nTotalStaticCorrection = %d", nTotalStaticCorrection);
     530                 :     CPLDebug("SIGY", "nLagTimeA = %d", nLagTimeA);
     531                 :     CPLDebug("SIGY", "nLagTimeB = %d", nLagTimeB);
     532                 :     CPLDebug("SIGY", "nDelayRecordingTime = %d", nDelayRecordingTime);
     533                 :     CPLDebug("SIGY", "nMuteTimeStart = %d", nMuteTimeStart);
     534                 :     CPLDebug("SIGY", "nMuteTimeEnd = %d", nMuteTimeEnd);
     535                 : 
     536                 :     CPLDebug("SIGY", "nSamples = %d", nSamples);
     537                 :     CPLDebug("SIGY", "nSampleInterval = %d", nSampleInterval);
     538                 : 
     539                 :     CPLDebug("SIGY", "nGainType = %d", nGainType);
     540                 :     CPLDebug("SIGY", "nInstrumentGainConstant = %d", nInstrumentGainConstant);
     541                 :     CPLDebug("SIGY", "nInstrumentInitialGain = %d", nInstrumentInitialGain);
     542                 :     CPLDebug("SIGY", "nCorrelated = %d", nCorrelated);
     543                 :     CPLDebug("SIGY", "nSweepFrequencyAtStart = %d", nSweepFrequencyAtStart);
     544                 :     CPLDebug("SIGY", "nSweepFrequencyAtEnd = %d", nSweepFrequencyAtEnd);
     545                 :     CPLDebug("SIGY", "nSweepLength = %d", nSweepLength);
     546                 :     CPLDebug("SIGY", "nSweepType = %d", nSweepType);
     547                 :     CPLDebug("SIGY", "nSweepTraceTaperLengthAtStart = %d", nSweepTraceTaperLengthAtStart);
     548                 :     CPLDebug("SIGY", "nSweepTraceTaperLengthAtEnd = %d", nSweepTraceTaperLengthAtEnd);
     549                 :     CPLDebug("SIGY", "nTaperType = %d", nTaperType);
     550                 :     CPLDebug("SIGY", "nAliasFilterFrequency = %d", nAliasFilterFrequency);
     551                 :     CPLDebug("SIGY", "nAliasFilterSlope = %d", nAliasFilterSlope);
     552                 :     CPLDebug("SIGY", "nNotchFilterFrequency = %d", nNotchFilterFrequency);
     553                 :     CPLDebug("SIGY", "nNotchFilterSlope = %d", nNotchFilterSlope);
     554                 :     CPLDebug("SIGY", "nLowCutFrequency = %d", nLowCutFrequency);
     555                 :     CPLDebug("SIGY", "nHighCutFrequency = %d", nHighCutFrequency);
     556                 :     CPLDebug("SIGY", "nLowCutSlope = %d", nLowCutSlope);
     557                 :     CPLDebug("SIGY", "nHighCutSlope = %d", nHighCutSlope);
     558                 :     CPLDebug("SIGY", "nYear = %d", nYear);
     559                 :     CPLDebug("SIGY", "nDayOfYear = %d", nDayOfYear);
     560                 :     CPLDebug("SIGY", "nHour = %d", nHour);
     561                 :     CPLDebug("SIGY", "nMinute = %d", nMinute);
     562                 :     CPLDebug("SIGY", "nSecond = %d", nSecond);
     563                 :     CPLDebug("SIGY", "nTimeBasicCode = %d", nTimeBasicCode);
     564                 :     CPLDebug("SIGY", "nTraceWeightingFactor = %d", nTraceWeightingFactor);
     565                 :     CPLDebug("SIGY", "nGeophoneGroupNumberOfRollSwith = %d", nGeophoneGroupNumberOfRollSwith);
     566                 :     CPLDebug("SIGY", "nGeophoneGroupNumberOfTraceNumberOne = %d", nGeophoneGroupNumberOfTraceNumberOne);
     567                 :     CPLDebug("SIGY", "nGeophoneGroupNumberOfLastTrace = %d", nGeophoneGroupNumberOfLastTrace);
     568                 :     CPLDebug("SIGY", "nGapSize = %d", nGapSize);
     569                 :     CPLDebug("SIGY", "nOverTravel = %d", nOverTravel);
     570                 : 
     571                 :     if (sBFH.dfSEGYRevisionNumber >= 1.0)
     572                 :     {
     573                 :         CPLDebug("SIGY", "nInlineNumber = %d", nInlineNumber);
     574                 :         CPLDebug("SIGY", "nCrosslineNumber = %d", nCrosslineNumber);
     575                 :         CPLDebug("SIGY", "nShotpointNumber = %d", nShotpointNumber);
     576                 :         CPLDebug("SIGY", "nShotpointScalar = %d", nShotpointScalar);
     577                 :     }
     578                 : #endif
     579                 : 
     580               2 :     GByte* pabyData = (GByte*) VSIMalloc( nDataSize * nSamples );
     581               2 :     double* padfValues = (double*) VSICalloc( nSamples, sizeof(double) );
     582               2 :     if (pabyData == NULL || padfValues == NULL)
     583                 :     {
     584               0 :         VSIFSeekL( fp, nDataSize * nSamples, SEEK_CUR );
     585                 :     }
     586                 :     else
     587                 :     {
     588               2 :         if ((int)VSIFReadL(pabyData, nDataSize, nSamples, fp) != nSamples)
     589                 :         {
     590               0 :             bEOF = TRUE;
     591                 :         }
     592               2 :         for(int i=0;i<nSamples;i++)
     593                 :         {
     594               0 :             switch (sBFH.nDataSampleType)
     595                 :             {
     596                 :                 case DT_IBM_4BYTES_FP:
     597                 :                 {
     598               0 :                     padfValues[i] = GetIBMFloat(pabyData + i * 4);
     599               0 :                     break;
     600                 :                 }
     601                 : 
     602                 :                 case DT_4BYTES_INT:
     603                 :                 {
     604                 :                     int nVal;
     605               0 :                     memcpy(&nVal, pabyData + i * 4, 4);
     606               0 :                     CPL_MSBPTR32(&nVal);
     607               0 :                     padfValues[i] = nVal;
     608               0 :                     break;
     609                 :                 }
     610                 : 
     611                 :                 case DT_2BYTES_INT:
     612                 :                 {
     613                 :                     GInt16 nVal;
     614               0 :                     memcpy(&nVal, pabyData + i * 2, 2);
     615               0 :                     CPL_MSBPTR16(&nVal);
     616               0 :                     padfValues[i] = nVal;
     617               0 :                     break;
     618                 :                 }
     619                 : 
     620                 :                 case DT_IEEE_4BYTES_FP:
     621                 :                 {
     622                 :                     float fVal;
     623               0 :                     memcpy(&fVal, pabyData + i * 4, 4);
     624               0 :                     CPL_MSBPTR32(&fVal);
     625               0 :                     padfValues[i] = fVal;
     626               0 :                     break;
     627                 :                 }
     628                 : 
     629                 :                 case DT_1BYTE_INT:
     630                 :                 {
     631               0 :                     padfValues[i] = ((char*)pabyData)[i];
     632                 :                     break;
     633                 :                 }
     634                 : 
     635                 :                 default:
     636                 :                     break;
     637                 :             }
     638                 :         }
     639                 :     }
     640               2 :     CPLFree(pabyData);
     641                 : 
     642               2 :     OGRFeature* poFeature = new OGRFeature(poFeatureDefn);
     643               2 :     poFeature->SetFID(nNextFID ++);
     644               2 :     if (dfGroupX != 0.0 || dfGroupY != 0.0)
     645               2 :         poFeature->SetGeometryDirectly(new OGRPoint(dfGroupX, dfGroupY));
     646                 : 
     647               2 :     poFeature->SetField(TRACE_NUMBER_WITHIN_LINE, nTraceNumberWithinLine);
     648               2 :     poFeature->SetField(TRACE_NUMBER_WITHIN_FILE, nTraceNumberWithinFile);
     649               2 :     poFeature->SetField(ORIGINAL_FIELD_RECORD_NUMBER, nOriginalFieldRecordNumber);
     650               2 :     poFeature->SetField(TRACE_NUMBER_WITHIN_ORIGINAL_FIELD_RECORD, nTraceNumberWithinOriginalFieldRecord);
     651               2 :     poFeature->SetField(TRACE_IDENTIFICATION_CODE, nTraceIdentificationCode);
     652               2 :     poFeature->SetField(ENSEMBLE_NUMBER, nEnsembleNumber);
     653               2 :     poFeature->SetField(TRACE_NUMBER_WITHIN_ENSEMBLE, nTraceNumberWithinEnsemble);
     654               2 :     poFeature->SetField(NUMBER_VERTICAL_SUMMED_TRACES, nNumberVerticalSummedTraces);
     655               2 :     poFeature->SetField(NUMBER_HORIZONTAL_STACKED_TRACES, nNumberHorizontalStackedTraces);
     656               2 :     poFeature->SetField(DATA_USE, nDataUse);
     657               2 :     poFeature->SetField(DISTANCE_SOURCE_GROUP, nDistanceSourceGroup);
     658               2 :     poFeature->SetField(RECEIVER_GROUP_ELEVATION, nReceiverGroupElevation);
     659               2 :     poFeature->SetField(SURFACE_ELEVATION_AT_SOURCE, nSurfaceElevationAtSource);
     660               2 :     poFeature->SetField(SOURCE_DEPTH_BELOW_SURFACE, nSourceDepthBelowSurface);
     661               2 :     poFeature->SetField(DATUM_ELEVATION_AT_RECEIVER_GROUP, nDatumElevationAtReceiverGroup);
     662               2 :     poFeature->SetField(DATUM_ELEVATION_AT_SOURCE, nDatumElevationAtSource);
     663               2 :     poFeature->SetField(WATER_DEPTH_AT_SOURCE, nWaterDepthAtSource);
     664               2 :     poFeature->SetField(WATER_DEPTH_AT_GROUP, nWaterDepthAtGroup);
     665               2 :     poFeature->SetField(VERTICAL_SCALAR, nVerticalScalar);
     666               2 :     poFeature->SetField(HORIZONTAL_SCALAR, nHorizontalScalar);
     667               2 :     poFeature->SetField(SOURCE_X, nSourceX);
     668               2 :     poFeature->SetField(SOURCE_Y, nSourceY);
     669               2 :     poFeature->SetField(GROUP_X, nGroupX);
     670               2 :     poFeature->SetField(GROUP_Y, nGroupY);
     671               2 :     poFeature->SetField(COORDINATE_UNITS, nCoordinateUnits);
     672               2 :     poFeature->SetField(WEATHERING_VELOCITY, nWeatheringVelocity);
     673               2 :     poFeature->SetField(SUB_WEATHERING_VELOCITY, nSubWeatheringVelocity);
     674               2 :     poFeature->SetField(UPHOLE_TIME_AT_SOURCE, nUpholeTimeAtSource);
     675               2 :     poFeature->SetField(UPHOLE_TIME_AT_GROUP, nUpholeTimeAtGroup);
     676               2 :     poFeature->SetField(SOURCE_STATIC_CORRECTION, nSourceStaticCorrection);
     677               2 :     poFeature->SetField(GROUP_STATIC_CORRECTION, nGroupStaticCorrection);
     678               2 :     poFeature->SetField(TOTAL_STATIC_CORRECTION, nTotalStaticCorrection);
     679               2 :     poFeature->SetField(LAG_TIME_A, nLagTimeA);
     680               2 :     poFeature->SetField(LAG_TIME_B, nLagTimeB);
     681               2 :     poFeature->SetField(DELAY_RECORDING_TIME, nDelayRecordingTime);
     682               2 :     poFeature->SetField(MUTE_TIME_START, nMuteTimeStart);
     683               2 :     poFeature->SetField(MUTE_TIME_END, nMuteTimeEnd);
     684               2 :     poFeature->SetField(SAMPLES, nSamples);
     685               2 :     poFeature->SetField(SAMPLE_INTERVAL, nSampleInterval);
     686               2 :     poFeature->SetField(GAIN_TYPE, nGainType);
     687               2 :     poFeature->SetField(INSTRUMENT_GAIN_CONSTANT, nInstrumentGainConstant);
     688               2 :     poFeature->SetField(INSTRUMENT_INITIAL_GAIN, nInstrumentInitialGain);
     689               2 :     poFeature->SetField(CORRELATED, nCorrelated);
     690               2 :     poFeature->SetField(SWEEP_FREQUENCY_AT_START, nSweepFrequencyAtStart);
     691               2 :     poFeature->SetField(SWEEP_FREQUENCY_AT_END, nSweepFrequencyAtEnd);
     692               2 :     poFeature->SetField(SWEEP_LENGTH, nSweepLength);
     693               2 :     poFeature->SetField(SWEEP_TYPE, nSweepType);
     694               2 :     poFeature->SetField(SWEEP_TRACE_TAPER_LENGTH_AT_START, nSweepTraceTaperLengthAtStart);
     695               2 :     poFeature->SetField(SWEEP_TRACE_TAPER_LENGTH_AT_END, nSweepTraceTaperLengthAtEnd);
     696               2 :     poFeature->SetField(TAPER_TYPE, nTaperType);
     697               2 :     poFeature->SetField(ALIAS_FILTER_FREQUENCY, nAliasFilterFrequency);
     698               2 :     poFeature->SetField(ALIAS_FILTER_SLOPE, nAliasFilterSlope);
     699               2 :     poFeature->SetField(NOTCH_FILTER_FREQUENCY, nNotchFilterFrequency);
     700               2 :     poFeature->SetField(NOTCH_FILTER_SLOPE, nNotchFilterSlope);
     701               2 :     poFeature->SetField(LOW_CUT_FREQUENCY, nLowCutFrequency);
     702               2 :     poFeature->SetField(HIGH_CUT_FREQUENCY, nHighCutFrequency);
     703               2 :     poFeature->SetField(LOW_CUT_SLOPE, nLowCutSlope);
     704               2 :     poFeature->SetField(HIGH_CUT_SLOPE, nHighCutSlope);
     705               2 :     poFeature->SetField(YEAR, nYear);
     706               2 :     poFeature->SetField(DAY_OF_YEAR, nDayOfYear);
     707               2 :     poFeature->SetField(HOUR, nHour);
     708               2 :     poFeature->SetField(MINUTE, nMinute);
     709               2 :     poFeature->SetField(SECOND, nSecond);
     710               2 :     poFeature->SetField(TIME_BASIC_CODE, nTimeBasicCode);
     711               2 :     poFeature->SetField(TRACE_WEIGHTING_FACTOR, nTraceWeightingFactor);
     712               2 :     poFeature->SetField(GEOPHONE_GROUP_NUMBER_OF_ROLL_SWITH, nGeophoneGroupNumberOfRollSwith);
     713               2 :     poFeature->SetField(GEOPHONE_GROUP_NUMBER_OF_TRACE_NUMBER_ONE, nGeophoneGroupNumberOfTraceNumberOne);
     714               2 :     poFeature->SetField(GEOPHONE_GROUP_NUMBER_OF_LAST_TRACE, nGeophoneGroupNumberOfLastTrace);
     715               2 :     poFeature->SetField(GAP_SIZE, nGapSize);
     716               2 :     poFeature->SetField(OVER_TRAVEL, nOverTravel);
     717                 : 
     718               2 :     if (sBFH.dfSEGYRevisionNumber >= 1.0)
     719                 :     {
     720               0 :         poFeature->SetField(INLINE_NUMBER, nInlineNumber);
     721               0 :         poFeature->SetField(CROSSLINE_NUMBER, nCrosslineNumber);
     722               0 :         poFeature->SetField(SHOTPOINT_NUMBER, nShotpointNumber);
     723               0 :         poFeature->SetField(SHOTPOINT_SCALAR, nShotpointScalar);
     724                 :     }
     725                 : 
     726               2 :     if (nSamples > 0 && padfValues != NULL)
     727               0 :         poFeature->SetField(poFeature->GetFieldCount() - 1, nSamples, padfValues);
     728                 : 
     729               2 :     CPLFree(padfValues);
     730               2 :     return poFeature;
     731                 : }
     732                 : 
     733                 : 
     734                 : 
     735                 : static const FieldDesc SEGYHeaderFields[] =
     736                 : {
     737                 :     { "TEXT_HEADER", OFTString },
     738                 :     { "JOB_ID_NUMBER", OFTInteger },
     739                 :     { "LINE_NUMBER", OFTInteger },
     740                 :     { "REEL_NUMBER", OFTInteger },
     741                 :     { "DATA_TRACES_PER_ENSEMBLE", OFTInteger },
     742                 :     { "AUX_TRACES_PER_ENSEMBLE", OFTInteger },
     743                 :     { "SAMPLE_INTERVAL", OFTInteger },
     744                 :     { "SAMPLE_INTERVAL_ORIGINAL", OFTInteger },
     745                 :     { "SAMPLES_PER_DATA_TRACE", OFTInteger },
     746                 :     { "SAMPLES_PER_DATA_TRACE_ORIGINAL", OFTInteger },
     747                 :     { "DATA_SAMPLE_TYPE", OFTInteger },
     748                 :     { "ENSEMBLE_FOLD", OFTInteger },
     749                 :     { "TRACE_SORTING_CODE", OFTInteger },
     750                 :     { "VERTICAL_SUM_CODE", OFTInteger },
     751                 :     { "SWEEP_FREQUENCY_AT_START", OFTInteger },
     752                 :     { "SWEEP_FREQUENCY_AT_END", OFTInteger },
     753                 :     { "SWEEP_LENGTH", OFTInteger },
     754                 :     { "SWEEP_TYPE", OFTInteger },
     755                 :     { "TRACE_NUMBER_OF_SWEEP_CHANNEL", OFTInteger },
     756                 :     { "SWEEP_TRACE_TAPER_LENGTH_AT_START", OFTInteger },
     757                 :     { "SWEEP_TRACE_TAPER_LENGTH_AT_END", OFTInteger },
     758                 :     { "TAPER_TYPE", OFTInteger },
     759                 :     { "CORRELATED", OFTInteger },
     760                 :     { "BINARY_GAIN_RECOVERED", OFTInteger },
     761                 :     { "AMPLITUDE_RECOVERY_METHOD", OFTInteger },
     762                 :     { "MEASUREMENT_SYSTEM", OFTInteger },
     763                 :     { "IMPULSE_SIGNAL_POLARITY", OFTInteger },
     764                 :     { "VIBRATORY_POLARY_CODE", OFTInteger },
     765                 :     { "SEGY_REVISION_NUMBER", OFTInteger },
     766                 :     { "SEGY_FLOAT_REVISION_NUMBER", OFTReal },
     767                 :     { "FIXED_LENGTH_TRACE_FLAG", OFTInteger },
     768                 :     { "NUMBER_OF_EXTENDED_TEXTUAL_FILE_HEADER", OFTInteger },
     769                 : };
     770                 : 
     771                 : #define HEADER_TEXT_HEADER 0
     772                 : #define HEADER_JOB_ID_NUMBER 1
     773                 : #define HEADER_LINE_NUMBER 2
     774                 : #define HEADER_REEL_NUMBER 3
     775                 : #define HEADER_DATA_TRACES_PER_ENSEMBLE 4
     776                 : #define HEADER_AUX_TRACES_PER_ENSEMBLE 5
     777                 : #define HEADER_SAMPLE_INTERVAL 6
     778                 : #define HEADER_SAMPLE_INTERVAL_ORIGINAL 7
     779                 : #define HEADER_SAMPLES_PER_DATA_TRACE 8
     780                 : #define HEADER_SAMPLES_PER_DATA_TRACE_ORIGINAL 9
     781                 : #define HEADER_DATA_SAMPLE_TYPE 10
     782                 : #define HEADER_ENSEMBLE_FOLD 11
     783                 : #define HEADER_TRACE_SORTING_CODE 12
     784                 : #define HEADER_VERTICAL_SUM_CODE 13
     785                 : #define HEADER_SWEEP_FREQUENCY_AT_START 14
     786                 : #define HEADER_SWEEP_FREQUENCY_AT_END 15
     787                 : #define HEADER_SWEEP_LENGTH 16
     788                 : #define HEADER_SWEEP_TYPE 17
     789                 : #define HEADER_TRACE_NUMBER_OF_SWEEP_CHANNEL 18
     790                 : #define HEADER_SWEEP_TRACE_TAPER_LENGTH_AT_START 19
     791                 : #define HEADER_SWEEP_TRACE_TAPER_LENGTH_AT_END 20
     792                 : #define HEADER_TAPER_TYPE 21
     793                 : #define HEADER_CORRELATED 22
     794                 : #define HEADER_BINARY_GAIN_RECOVERED 23
     795                 : #define HEADER_AMPLITUDE_RECOVERY_METHOD 24
     796                 : #define HEADER_MEASUREMENT_SYSTEM 25
     797                 : #define HEADER_IMPULSE_SIGNAL_POLARITY 26
     798                 : #define HEADER_VIBRATORY_POLARY_CODE 27
     799                 : #define HEADER_SEGY_REVISION_NUMBER 28
     800                 : #define HEADER_FLOAT_SEGY_REVISION_NUMBER 29
     801                 : #define HEADER_FIXED_LENGTH_TRACE_FLAG 30
     802                 : #define HEADER_NUMBER_OF_EXTENDED_TEXTUAL_FILE_HEADER 31
     803                 : 
     804                 : 
     805                 : /************************************************************************/
     806                 : /*                         OGRSEGYHeaderLayer()                         */
     807                 : /************************************************************************/
     808                 : 
     809                 : 
     810               2 : OGRSEGYHeaderLayer::OGRSEGYHeaderLayer( const char* pszLayerName,
     811                 :                                         SEGYBinaryFileHeader* psBFH,
     812               2 :                                         char* pszHeaderTextIn )
     813                 : 
     814                 : {
     815               2 :     bEOF = FALSE;
     816               2 :     memcpy(&sBFH, psBFH, sizeof(sBFH));
     817               2 :     pszHeaderText = pszHeaderTextIn;
     818                 : 
     819               2 :     poFeatureDefn = new OGRFeatureDefn( pszLayerName );
     820               2 :     poFeatureDefn->Reference();
     821               2 :     poFeatureDefn->SetGeomType( wkbNone );
     822                 : 
     823                 :     int i;
     824              66 :     for(i=0;i<(int)(sizeof(SEGYHeaderFields)/sizeof(SEGYHeaderFields[0]));i++)
     825                 :     {
     826                 :         OGRFieldDefn    oField( SEGYHeaderFields[i].pszName,
     827              64 :                                 SEGYHeaderFields[i].eType );
     828              64 :         poFeatureDefn->AddFieldDefn( &oField );
     829                 :     }
     830                 : 
     831               2 :     ResetReading();
     832               2 : }
     833                 : 
     834                 : /************************************************************************/
     835                 : /*                            ~OGRSEGYLayer()                          */
     836                 : /************************************************************************/
     837                 : 
     838               2 : OGRSEGYHeaderLayer::~OGRSEGYHeaderLayer()
     839                 : 
     840                 : {
     841               2 :     poFeatureDefn->Release();
     842               2 :     CPLFree(pszHeaderText);
     843               2 : }
     844                 : 
     845                 : /************************************************************************/
     846                 : /*                            ResetReading()                            */
     847                 : /************************************************************************/
     848                 : 
     849               2 : void OGRSEGYHeaderLayer::ResetReading()
     850                 : 
     851                 : {
     852               2 :     bEOF = FALSE;
     853               2 : }
     854                 : 
     855                 : /************************************************************************/
     856                 : /*                           GetNextFeature()                           */
     857                 : /************************************************************************/
     858                 : 
     859               4 : OGRFeature *OGRSEGYHeaderLayer::GetNextFeature()
     860                 : {
     861                 :     OGRFeature  *poFeature;
     862                 : 
     863               0 :     while(TRUE)
     864                 :     {
     865               4 :         poFeature = GetNextRawFeature();
     866               4 :         if (poFeature == NULL)
     867               2 :             return NULL;
     868                 : 
     869               2 :         if((m_poFilterGeom == NULL
     870                 :             || FilterGeometry( poFeature->GetGeometryRef() ) )
     871                 :         && (m_poAttrQuery == NULL
     872                 :             || m_poAttrQuery->Evaluate( poFeature )) )
     873                 :         {
     874               2 :             return poFeature;
     875                 :         }
     876                 :         else
     877               0 :             delete poFeature;
     878                 :     }
     879                 : }
     880                 : 
     881                 : /************************************************************************/
     882                 : /*                         GetNextRawFeature()                          */
     883                 : /************************************************************************/
     884                 : 
     885               4 : OGRFeature *OGRSEGYHeaderLayer::GetNextRawFeature()
     886                 : {
     887               4 :     if (bEOF)
     888               2 :         return NULL;
     889                 : 
     890               2 :     bEOF = TRUE;
     891                 : 
     892               2 :     OGRFeature* poFeature = new OGRFeature(poFeatureDefn);
     893               2 :     poFeature->SetFID(0);
     894                 : 
     895               2 :     poFeature->SetField(HEADER_TEXT_HEADER, pszHeaderText);
     896               2 :     poFeature->SetField(HEADER_JOB_ID_NUMBER, sBFH.nJobIdNumber);
     897               2 :     poFeature->SetField(HEADER_LINE_NUMBER, sBFH.nLineNumber);
     898               2 :     poFeature->SetField(HEADER_REEL_NUMBER, sBFH.nReelNumber);
     899               2 :     poFeature->SetField(HEADER_DATA_TRACES_PER_ENSEMBLE, sBFH.nDataTracesPerEnsemble);
     900               2 :     poFeature->SetField(HEADER_AUX_TRACES_PER_ENSEMBLE, sBFH.nAuxTracesPerEnsemble);
     901               2 :     poFeature->SetField(HEADER_SAMPLE_INTERVAL, sBFH.nSampleInterval);
     902               2 :     poFeature->SetField(HEADER_SAMPLE_INTERVAL_ORIGINAL, sBFH.nSampleIntervalOriginal);
     903               2 :     poFeature->SetField(HEADER_SAMPLES_PER_DATA_TRACE, sBFH.nSamplesPerDataTrace);
     904               2 :     poFeature->SetField(HEADER_SAMPLES_PER_DATA_TRACE_ORIGINAL, sBFH.nSamplesPerDataTraceOriginal);
     905               2 :     poFeature->SetField(HEADER_DATA_SAMPLE_TYPE, sBFH.nDataSampleType);
     906               2 :     poFeature->SetField(HEADER_ENSEMBLE_FOLD, sBFH.nEnsembleFold);
     907               2 :     poFeature->SetField(HEADER_TRACE_SORTING_CODE, sBFH.nTraceSortingCode);
     908               2 :     poFeature->SetField(HEADER_VERTICAL_SUM_CODE, sBFH.nVerticalSumCode);
     909               2 :     poFeature->SetField(HEADER_SWEEP_FREQUENCY_AT_START, sBFH.nSweepFrequencyAtStart);
     910               2 :     poFeature->SetField(HEADER_SWEEP_FREQUENCY_AT_END, sBFH.nSweepFrequencyAtEnd);
     911               2 :     poFeature->SetField(HEADER_SWEEP_LENGTH, sBFH.nSweepLength);
     912               2 :     poFeature->SetField(HEADER_SWEEP_TYPE, sBFH.nSweepType);
     913               2 :     poFeature->SetField(HEADER_TRACE_NUMBER_OF_SWEEP_CHANNEL, sBFH.nTraceNumberOfSweepChannel);
     914               2 :     poFeature->SetField(HEADER_SWEEP_TRACE_TAPER_LENGTH_AT_START, sBFH.nSweepTraceTaperLengthAtStart);
     915               2 :     poFeature->SetField(HEADER_SWEEP_TRACE_TAPER_LENGTH_AT_END, sBFH.nSweepTraceTaperLengthAtEnd);
     916               2 :     poFeature->SetField(HEADER_TAPER_TYPE, sBFH.nTaperType);
     917               2 :     poFeature->SetField(HEADER_CORRELATED, sBFH.nCorrelated);
     918               2 :     poFeature->SetField(HEADER_BINARY_GAIN_RECOVERED, sBFH.nBinaryGainRecovered);
     919               2 :     poFeature->SetField(HEADER_AMPLITUDE_RECOVERY_METHOD, sBFH.nAmplitudeRecoveryMethod);
     920               2 :     poFeature->SetField(HEADER_MEASUREMENT_SYSTEM, sBFH.nMeasurementSystem);
     921               2 :     poFeature->SetField(HEADER_IMPULSE_SIGNAL_POLARITY, sBFH.nImpulseSignalPolarity);
     922               2 :     poFeature->SetField(HEADER_VIBRATORY_POLARY_CODE, sBFH.nVibratoryPolaryCode);
     923               2 :     poFeature->SetField(HEADER_SEGY_REVISION_NUMBER, sBFH.nSEGYRevisionNumber);
     924               2 :     poFeature->SetField(HEADER_FLOAT_SEGY_REVISION_NUMBER, sBFH.dfSEGYRevisionNumber);
     925               2 :     poFeature->SetField(HEADER_FIXED_LENGTH_TRACE_FLAG, sBFH.nFixedLengthTraceFlag);
     926               2 :     poFeature->SetField(HEADER_NUMBER_OF_EXTENDED_TEXTUAL_FILE_HEADER, sBFH.nNumberOfExtendedTextualFileHeader);
     927                 : 
     928               2 :     return poFeature;
     929                 : }

Generated by: LCOV version 1.7