341{
342 uchar abyHeader[100];
343 int i;
345 double dValue;
347
348 if (psSHP->fpSHX == NULL)
349 {
350 psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed");
351 return;
352 }
353
354
355
356
357 for( i = 0; i < 100; i++ )
358 abyHeader[i] = 0;
359
360 abyHeader[2] = 0x27;
361 abyHeader[3] = 0x0a;
362
363 i32 = psSHP->nFileSize/2;
366
367 i32 = 1000;
370
371 i32 = psSHP->nShapeType;
374
375 dValue = psSHP->adBoundsMin[0];
376 ByteCopy( &dValue, abyHeader+36, 8 );
378
379 dValue = psSHP->adBoundsMin[1];
380 ByteCopy( &dValue, abyHeader+44, 8 );
382
383 dValue = psSHP->adBoundsMax[0];
384 ByteCopy( &dValue, abyHeader+52, 8 );
386
387 dValue = psSHP->adBoundsMax[1];
388 ByteCopy( &dValue, abyHeader+60, 8 );
390
391 dValue = psSHP->adBoundsMin[2];
392 ByteCopy( &dValue, abyHeader+68, 8 );
394
395 dValue = psSHP->adBoundsMax[2];
396 ByteCopy( &dValue, abyHeader+76, 8 );
398
399 dValue = psSHP->adBoundsMin[3];
400 ByteCopy( &dValue, abyHeader+84, 8 );
402
403 dValue = psSHP->adBoundsMax[3];
404 ByteCopy( &dValue, abyHeader+92, 8 );
406
407
408
409
410 if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0
411 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 )
412 {
413 psSHP->sHooks.Error( "Failure writing .shp header" );
414 return;
415 }
416
417
418
419
420 i32 = (psSHP->nRecords * 2 *
sizeof(
int32) + 100)/2;
423
424 if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0
425 || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 )
426 {
427 psSHP->sHooks.Error( "Failure writing .shx header" );
428 return;
429 }
430
431
432
433
435
436 for( i = 0; i < psSHP->nRecords; i++ )
437 {
438 panSHX[i*2 ] = psSHP->panRecOffset[i]/2;
439 panSHX[i*2+1] = psSHP->panRecSize[i]/2;
442 }
443
444 if( (
int)psSHP->sHooks.FWrite( panSHX,
sizeof(
int32)*2, psSHP->nRecords, psSHP->fpSHX )
445 != psSHP->nRecords )
446 {
447 psSHP->sHooks.Error( "Failure writing .shx contents" );
448 }
449
451
452
453
454
455 psSHP->sHooks.FFlush( psSHP->fpSHP );
456 psSHP->sHooks.FFlush( psSHP->fpSHX );
457}
static void SwapWord(int length, void *wordP)
#define ByteCopy(a, b, c)