51 OpenShapeFile(
const char *fn );
55 CustomErrors(
const char *message );
105 #define OpenMap OpenShapeFile
106 #define CloseMap SHPClose
108 #define MAP_FILE ".map"
109 #define OpenMap plLibOpenPdfstrm
110 #define CloseMap pdf_close
111 #define OFFSET ( 180 * 100 )
113 #define W_BUFSIZ ( 32 * 1024 )
120 #if defined ( HAVE_SHAPELIB ) || defined ( PL_DEPRECATED )
125 PLFLT minsectlon, maxsectlon, minsectlat, maxsectlat;
126 const int ncopies = 5;
127 const int mid = ncopies / 2 + 1;
128 PLFLT **bufx = NULL, **bufy = NULL;
141 SHPObject *
object = NULL;
147 unsigned char n_buff[2], buff[800];
155 filename = malloc( strlen( type ) + strlen(
MAP_FILE ) + 1 );
156 strcpy( filename, type );
159 warning = malloc( strlen( type ) + strlen(
MAP_FILE ) + 50 );
160 strcpy( warning,
"Could not find " );
161 strcat( warning, filename );
162 strcat( warning,
" file." );
164 if ( ( in = OpenShapeFile( filename ) ) == NULL )
169 SHPGetInfo( in, &nentries, &shapetype, mins, maxs );
178 bufx = malloc( (
size_t) ncopies *
sizeof (
PLFLT* ) );
179 bufy = malloc( (
size_t) ncopies *
sizeof (
PLFLT* ) );
180 for ( i = 0; i < ncopies; i++ )
190 if ( entrynumber == nentries )
193 if ( partnumber == 0 )
195 object = SHPReadObject( in, entrynumber );
196 nparts =
object->nParts;
200 if ( partnumber == ( nparts - 1 ) )
201 n =
object->nVertices -
object->panPartStart[partnumber];
203 n =
object->panPartStart[partnumber + 1] -
object->panPartStart[partnumber];
209 for ( i = 0; i < ncopies; i++ )
215 bufx[i] = malloc( (
size_t) bufsize *
sizeof (
double ) );
216 bufy[i] = malloc( (
size_t) bufsize *
sizeof (
double ) );
223 bufxraw =
object->padfX +
object->panPartStart[partnumber];
224 bufyraw =
object->padfY +
object->panPartStart[partnumber];
225 for ( i = 0; i < n; i++ )
227 bufx[mid][i] = (
PLFLT) bufxraw[i];
228 for ( j = 0; j < ncopies; j++ )
229 bufy[j][i] = (
PLFLT) bufyraw[i];
233 minsectlon =
object->dfXMin;
234 maxsectlon =
object->dfXMax;
235 minsectlat =
object->dfYMin;
236 maxsectlat =
object->dfYMax;
240 if ( partnumber == nparts - 1 )
249 if (
pdf_rdx( n_buff, (
long)
sizeof (
unsigned char ) * 2, in ) == 0 )
251 n = ( n_buff[0] << 8 ) + n_buff[1];
255 pdf_rdx( buff, (
long)
sizeof (
unsigned char ) * 4 * n, in );
259 for ( j = i = 0; i < n; i++, j += 2 )
261 t = ( buff[j] << 8 ) + buff[j + 1];
264 for ( i = 0; i < n; i++, j += 2 )
266 t = ( buff[j] << 8 ) + buff[j + 1];
268 for ( k = 1; k < ncopies; k++ )
269 bufy[k][i] = bufy[0][i];
291 for ( i = 0; i < n - 1; i++ )
293 if ( bufx[mid][i] - bufx[mid][i + 1] > 180. )
294 bufx[mid][i + 1] += 360.;
295 else if ( bufx[mid][i] - bufx[mid][i + 1] < -180. )
296 bufx[mid][i + 1] -= 360.;
298 for ( i = 0; i < n; i++ )
300 for ( j = 0; j < mid; j++ )
301 bufx[j][i] = bufx[mid][i] + 360. * (
PLFLT) ( j - mid );
302 for ( j = mid + 1; j < ncopies; j++ )
303 bufx[j][i] = bufx[mid][i] + 360. * (
PLFLT) ( j - mid );
304 #ifndef HAVE_SHAPELIB
305 minsectlon =
MIN( minsectlon, bufx[mid][i] );
306 maxsectlon =
MAX( minsectlon, bufx[mid][i] );
307 minsectlat =
MIN( minsectlat, bufy[mid][i] );
308 maxsectlat =
MAX( minsectlat, bufy[mid][i] );
313 if ( ( maxsectlat > minlat ) && ( minsectlat < maxlat ) )
318 for ( j = 0; j < ncopies; j++ )
320 if ( ( minsectlon + 360. * (
PLFLT) ( j - mid ) < maxlong )
321 && ( maxsectlon + 360. * (
PLFLT) ( j - mid ) > minlong ) )
324 ( *mapform )( n, bufx[j], bufy[j] );
325 plline( n, bufx[j], bufy[j] );
333 if ( partnumber == 0 )
334 SHPDestroyObject(
object );
345 for ( i = 0; i < ncopies; i++ )
356 #else // defined (HAVE_SHAPELIB) || defined (PL_DEPRECATED)
357 plwarn(
"Use of the old plplot map file format is deprecated.\nIt is recommended that the shapelib library be used to provide map support.\n" );
358 #endif // defined (HAVE_SHAPELIB) || defined (PL_DEPRECATED)
402 if ( minlong > maxlong )
408 if ( minlat > maxlat )
414 dx = ( maxlong - minlong ) /
NSEG;
415 dy = ( maxlat - minlat ) /
NSEG;
419 for ( yy = dlat * ceil( minlat / dlat ); yy <= maxlat; yy += dlat )
427 for ( xx = minlong; xx < maxlong; xx +=
dx )
432 ( *mapform )( 2,
x,
y );
440 for ( xx = dlong * ceil( minlong / dlong ); xx <= maxlong; xx += dlong )
448 for ( yy = minlat; yy < maxlat; yy +=
dy )
453 ( *mapform )( 2,
x,
y );
482 void CustomErrors(
const char *message )
484 if ( strstr( message,
"Unable to open" ) == NULL )
485 fprintf( stderr,
"%s\n", message );
490 OpenShapeFile(
const char *fn )
493 char *fs = NULL, *dn = NULL;
497 SASetupDefaultHooks( &sHooks );
498 sHooks.Error = CustomErrors;
504 #define SHPOpenLL( a, b, c ) SHPOpen( a, b )
513 if ( ( file = SHPOpenLL( fs,
"rb", &sHooks ) ) != NULL )
519 #if defined ( PLPLOT_LIB_ENV )
524 if ( ( file = SHPOpenLL( fs,
"rb", &sHooks ) ) != NULL )
528 #endif // PLPLOT_LIB_ENV
532 if ( ( file = SHPOpenLL( fn,
"rb", &sHooks ) ) != NULL )
534 pldebug(
"OpenShapeFile",
"Found file %s in current directory.\n", fn );
541 #if defined ( PLPLOT_HOME_ENV )
546 if ( ( file = SHPOpenLL( fs,
"rb", &sHooks ) ) != NULL )
550 #endif // PLPLOT_HOME_ENV/lib
554 #if defined ( DATA_DIR )
557 if ( ( file = SHPOpenLL( fs,
"rb", &sHooks ) ) != NULL )
566 if ( ( file = SHPOpenLL( fs,
"rb", &sHooks ) ) != NULL )
571 pldebug(
"OpenShapeFile",
"File %s not found.\n", fn );
576 pldebug(
"OpenShapeFile",
"SHPOpen successfully opened two files with basename %s\n", fs );