42 #define NEED_PLDEBUG 1
50 OpenShapeFile(
const char *fn );
99 #define OpenMap OpenShapeFile
100 #define CloseMap SHPClose
102 #define MAP_FILE ".map"
103 #define OpenMap plLibOpenPdfstrm
104 #define CloseMap pdf_close
105 #define OFFSET ( 180 * 100 )
107 #define W_BUFSIZ ( 32 * 1024 )
114 #if defined ( HAVE_SHAPELIB ) || defined ( PL_DEPRECATED )
119 PLFLT minsectlon, maxsectlon, minsectlat, maxsectlat;
120 const int ncopies = 5;
121 const int mid = ncopies / 2 + 1;
122 PLFLT **bufx = NULL, **bufy = NULL;
134 SHPObject *
object = NULL;
140 unsigned char n_buff[2], buff[800];
148 filename = malloc( strlen( type ) + strlen(
MAP_FILE ) + 1 );
149 strcpy( filename, type );
152 warning = malloc( strlen( type ) + strlen(
MAP_FILE ) + 50 );
153 strcpy( warning,
"Could not find " );
154 strcat( warning, filename );
155 strcat( warning,
" file." );
157 if ( ( in = OpenShapeFile( filename ) ) == NULL )
162 SHPGetInfo( in, &nentries, &shapetype, mins, maxs );
171 bufx = malloc( ncopies *
sizeof (
PLFLT* ) );
172 bufy = malloc( ncopies *
sizeof (
PLFLT* ) );
173 for ( i = 0; i < ncopies; i++ )
183 if ( entrynumber == nentries )
186 if ( partnumber == 0 )
188 object = SHPReadObject( in, entrynumber );
189 nparts =
object->nParts;
193 if ( partnumber == ( nparts - 1 ) )
194 n =
object->nVertices -
object->panPartStart[partnumber];
196 n =
object->panPartStart[partnumber + 1] -
object->panPartStart[partnumber];
202 for ( i = 0; i < ncopies; i++ )
208 bufx[i] = malloc( bufsize *
sizeof (
double ) );
209 bufy[i] = malloc( bufsize *
sizeof (
double ) );
216 bufxraw =
object->padfX +
object->panPartStart[partnumber];
217 bufyraw =
object->padfY +
object->panPartStart[partnumber];
218 for ( i = 0; i < n; i++ )
220 bufx[mid][i] = (
PLFLT) bufxraw[i];
221 for ( j = 0; j < ncopies; j++ )
222 bufy[j][i] = (
PLFLT) bufyraw[i];
226 minsectlon =
object->dfXMin;
227 maxsectlon =
object->dfXMax;
228 minsectlat =
object->dfYMin;
229 maxsectlat =
object->dfYMax;
233 if ( partnumber == nparts - 1 )
242 if (
pdf_rdx( n_buff, (
long)
sizeof (
unsigned char ) * 2, in ) == 0 )
244 n = ( n_buff[0] << 8 ) + n_buff[1];
248 pdf_rdx( buff, (
long)
sizeof (
unsigned char ) * 4 * n, in );
252 for ( j = i = 0; i < n; i++, j += 2 )
254 t = ( buff[j] << 8 ) + buff[j + 1];
257 for ( i = 0; i < n; i++, j += 2 )
259 t = ( buff[j] << 8 ) + buff[j + 1];
261 for ( k = 1; k < ncopies; k++ )
262 bufy[k][i] = bufy[0][i];
284 for ( i = 0; i < n - 1; i++ )
286 if ( bufx[mid][i] - bufx[mid][i + 1] > 180. )
287 bufx[mid][i + 1] += 360.;
288 else if ( bufx[mid][i] - bufx[mid][i + 1] < -180. )
289 bufx[mid][i + 1] -= 360.;
291 for ( i = 0; i < n; i++ )
293 for ( j = 0; j < mid; j++ )
294 bufx[j][i] = bufx[mid][i] + 360. * (
PLFLT) ( j - mid );
295 for ( j = mid + 1; j < ncopies; j++ )
296 bufx[j][i] = bufx[mid][i] + 360. * (
PLFLT) ( j - mid );
297 #ifndef HAVE_SHAPELIB
298 minsectlon =
MIN( minsectlon, bufx[mid][i] );
299 maxsectlon =
MAX( minsectlon, bufx[mid][i] );
300 minsectlat =
MIN( minsectlat, bufy[mid][i] );
301 maxsectlat =
MAX( minsectlat, bufy[mid][i] );
306 if ( ( maxsectlat > minlat ) && ( minsectlat < maxlat ) )
311 for ( j = 0; j < ncopies; j++ )
313 if ( ( minsectlon + 360. * (
PLFLT) ( j - mid ) < maxlong )
314 && ( maxsectlon + 360. * (
PLFLT) ( j - mid ) > minlong ) )
317 ( *mapform )( n, bufx[j], bufy[j] );
318 plline( n, bufx[j], bufy[j] );
326 if ( partnumber == 0 )
327 SHPDestroyObject(
object );
338 for ( i = 0; i < ncopies; i++ )
349 #else // defined (HAVE_SHAPELIB) || defined (PL_DEPRECATED)
350 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" );
351 #endif // defined (HAVE_SHAPELIB) || defined (PL_DEPRECATED)
395 if ( minlong > maxlong )
401 if ( minlat > maxlat )
407 dx = ( maxlong - minlong ) /
NSEG;
408 dy = ( maxlat - minlat ) /
NSEG;
412 for ( yy = dlat * ceil( minlat / dlat ); yy <= maxlat; yy += dlat )
420 for ( xx = minlong; xx < maxlong; xx +=
dx )
425 ( *mapform )( 2,
x,
y );
433 for ( xx = dlong * ceil( minlong / dlong ); xx <= maxlong; xx += dlong )
441 for ( yy = minlat; yy < maxlat; yy +=
dy )
446 ( *mapform )( 2,
x,
y );
472 OpenShapeFile(
const char *fn )
475 char *fs = NULL, *dn = NULL;
483 if ( ( file = SHPOpen( fs,
"rb" ) ) != NULL )
489 #if defined ( PLPLOT_LIB_ENV )
494 if ( ( file = SHPOpen( fs,
"rb" ) ) != NULL )
498 #endif // PLPLOT_LIB_ENV
502 if ( ( file = SHPOpen( fn,
"rb" ) ) != NULL )
504 pldebug(
"OpenShapeFile",
"Found file %s in current directory.\n", fn );
511 #if defined ( PLPLOT_HOME_ENV )
516 if ( ( file = SHPOpen( fs,
"rb" ) ) != NULL )
520 #endif // PLPLOT_HOME_ENV/lib
524 #if defined ( DATA_DIR )
527 if ( ( file = SHPOpen( fs,
"rb" ) ) != NULL )
536 if ( ( file = SHPOpen( fs,
"rb" ) ) != NULL )
541 pldebug(
"OpenShapeFile",
"File %s not found.\n", fn );
546 pldebug(
"OpenShapeFile",
"Found file %s\n", fs );