char *GXFGetMapProjectionAsPROJ4( GXFHandle hGXF ) { GXFInfo_t *psGXF = (GXFInfo_t *) hGXF; char **papszMethods = NULL; char szPROJ4[512]; /* -------------------------------------------------------------------- */ /* If there was nothing in the file return "unknown". */ /* -------------------------------------------------------------------- */ if( CSLCount(psGXF->papszMapProjection) < 2 ) return( CPLStrdup( "unknown" ) ); szPROJ4[0] = '\0'; /* -------------------------------------------------------------------- */ /* Parse the third line, looking for known projection methods. */ /* -------------------------------------------------------------------- */ if( psGXF->papszMapProjection[2] != NULL ) { if( strlen(psGXF->papszMapProjection[2]) > 80 ) return( CPLStrdup( "" ) ); papszMethods = CSLTokenizeStringComplex(psGXF->papszMapProjection[2], ",", TRUE, TRUE ); } #ifdef DBMALLOC malloc_chain_check(1); #endif if( papszMethods == NULL || papszMethods[0] == NULL || EQUAL(papszMethods[0],"Geographic") ) { strcat( szPROJ4, "+proj=longlat" ); } #ifdef notdef else if( EQUAL(papszMethods[0],"Lambert Conic Conformal (1SP)") && CSLCount(papszMethods) > 5 ) { /* notdef: It isn't clear that this 1SP + scale method is even supported by PROJ.4 Later note: It is not. */ strcat( szPROJ4, "+proj=lcc" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } #endif else if( EQUAL(papszMethods[0],"Lambert Conic Conformal (2SP)") || EQUAL(papszMethods[0],"Lambert Conformal (2SP Belgium)") ) { /* notdef: Note we are apparently losing whatever makes the Belgium variant different than normal LCC, but hopefully they are close! */ strcat( szPROJ4, "+proj=lcc" ); if( CSLCount(papszMethods) > 1 ) { strcat( szPROJ4, " +lat_1=" ); strcat( szPROJ4, papszMethods[1] ); } if( CSLCount(papszMethods) > 2 ) { strcat( szPROJ4, " +lat_2=" ); strcat( szPROJ4, papszMethods[2] ); } if( CSLCount(papszMethods) > 3 ) { strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[3] ); } if( CSLCount(papszMethods) > 4 ) { strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[4] ); } if( CSLCount(papszMethods) > 5 ) { strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[5] ); } if( CSLCount(papszMethods) > 6 ) { strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[6] ); } } else if( EQUAL(papszMethods[0],"Mercator (1SP)") && CSLCount(papszMethods) > 5 ) { /* notdef: it isn't clear that +proj=merc support a scale of other than 1.0 in PROJ.4 */ strcat( szPROJ4, "+proj=merc" ); strcat( szPROJ4, " +lat_ts=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else if( EQUAL(papszMethods[0],"Mercator (2SP)") && CSLCount(papszMethods) > 4 ) { /* notdef: it isn't clear that +proj=merc support a scale of other than 1.0 in PROJ.4 */ strcat( szPROJ4, "+proj=merc" ); strcat( szPROJ4, " +lat_ts=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[4] ); } else if( EQUAL(papszMethods[0],"Hotine Oblique Mercator") && CSLCount(papszMethods) > 7 ) { /* Note that only the second means of specifying omerc is supported by this code in GXF. */ strcat( szPROJ4, "+proj=omerc" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lonc=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +alpha=" ); strcat( szPROJ4, papszMethods[3] ); if( CPLAtof(papszMethods[4]) < 0.00001 ) { strcat( szPROJ4, " +not_rot" ); } else { #ifdef notdef if( CPLAtof(papszMethods[4]) + CPLAtof(papszMethods[3]) < 0.00001 ) /* ok */; else /* notdef: no way to specify arbitrary angles! */; #endif } strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[5] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[6] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[7] ); } else if( EQUAL(papszMethods[0],"Laborde Oblique Mercator") && CSLCount(papszMethods) > 6 ) { strcat( szPROJ4, "+proj=labrd" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +azi=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[5] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[6] ); } else if( EQUAL(papszMethods[0],"New Zealand Map Grid") && CSLCount(papszMethods) > 4 ) { strcat( szPROJ4, "+proj=nzmg" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[4] ); } else if( EQUAL(papszMethods[0],"New Zealand Map Grid") && CSLCount(papszMethods) > 4 ) { strcat( szPROJ4, "+proj=nzmg" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[4] ); } else if( EQUAL(papszMethods[0],"Oblique Stereographic") && CSLCount(papszMethods) > 5 ) { /* there is an option to produce +lat_ts, which we ignore */ strcat( szPROJ4, "+proj=stere" ); strcat( szPROJ4, " +lat_0=45" ); strcat( szPROJ4, " +lat_ts=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else if( EQUAL(papszMethods[0],"Polar Stereographic") && CSLCount(papszMethods) > 5 ) { /* there is an option to produce +lat_ts, which we ignore */ strcat( szPROJ4, "+proj=stere" ); strcat( szPROJ4, " +lat_0=90" ); strcat( szPROJ4, " +lat_ts=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else if( EQUAL(papszMethods[0],"Swiss Oblique Cylindrical") && CSLCount(papszMethods) > 4 ) { /* notdef: geotiff's geo_ctrans.inc says this is the same as ObliqueMercator_Rosenmund, which GG's geotiff support just maps directly to +proj=omerc, though I find that questionable. */ strcat( szPROJ4, "+proj=omerc" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lonc=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[4] ); } else if( EQUAL(papszMethods[0],"Transverse Mercator") && CSLCount(papszMethods) > 5 ) { /* notdef: geotiff's geo_ctrans.inc says this is the same as ObliqueMercator_Rosenmund, which GG's geotiff support just maps directly to +proj=omerc, though I find that questionable. */ strcat( szPROJ4, "+proj=tmerc" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else if( EQUAL(papszMethods[0],"Transverse Mercator (South Oriented)") && CSLCount(papszMethods) > 5 ) { /* notdef: I don't know how south oriented is different from normal, and I don't find any mention of it in Geotiff;s geo_ctrans. Translating as tmerc, but that is presumably wrong. */ strcat( szPROJ4, "+proj=tmerc" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else if( EQUAL(papszMethods[0],"*Equidistant Conic") && CSLCount(papszMethods) > 6 ) { strcat( szPROJ4, "+proj=eqdc" ); strcat( szPROJ4, " +lat_1=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lat_2=" ); strcat( szPROJ4, papszMethods[2] ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[3] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[5] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[6] ); } else if( EQUAL(papszMethods[0],"*Polyconic") && CSLCount(papszMethods) > 5 ) { strcat( szPROJ4, "+proj=poly" ); strcat( szPROJ4, " +lat_0=" ); strcat( szPROJ4, papszMethods[1] ); strcat( szPROJ4, " +lon_0=" ); strcat( szPROJ4, papszMethods[2] ); #ifdef notdef /*not supported by PROJ.4 */ strcat( szPROJ4, " +k=" ); strcat( szPROJ4, papszMethods[3] ); #endif strcat( szPROJ4, " +x_0=" ); strcat( szPROJ4, papszMethods[4] ); strcat( szPROJ4, " +y_0=" ); strcat( szPROJ4, papszMethods[5] ); } else { strcat( szPROJ4, "unknown" ); } CSLDestroy( papszMethods ); /* -------------------------------------------------------------------- */ /* Now get the ellipsoid parameters. For a bunch of common */ /* ones we preserve the name. For the rest we just carry over */ /* the parameters. */ /* -------------------------------------------------------------------- */ if( CSLCount(psGXF->papszMapProjection) > 1 ) { char **papszTokens; if( strlen(psGXF->papszMapProjection[1]) > 80 ) return CPLStrdup(""); papszTokens = CSLTokenizeStringComplex(psGXF->papszMapProjection[1], ",", TRUE, TRUE ); if( EQUAL(papszTokens[0],"WGS 84") ) strcat( szPROJ4, " +ellps=WGS84" ); else if( EQUAL(papszTokens[0],"*WGS 72") ) strcat( szPROJ4, " +ellps=WGS72" ); else if( EQUAL(papszTokens[0],"*WGS 66") ) strcat( szPROJ4, " +ellps=WGS66" ); else if( EQUAL(papszTokens[0],"*WGS 60") ) strcat( szPROJ4, " +ellps=WGS60" ); else if( EQUAL(papszTokens[0],"Clarke 1866") ) strcat( szPROJ4, " +ellps=clrk66" ); else if( EQUAL(papszTokens[0],"Clarke 1880") ) strcat( szPROJ4, " +ellps=clrk80" ); else if( EQUAL(papszTokens[0],"GRS 1980") ) strcat( szPROJ4, " +ellps=GRS80" ); else if( CSLCount( papszTokens ) > 2 ) { sprintf( szPROJ4+strlen(szPROJ4), " +a=%s +e=%s", papszTokens[1], papszTokens[2] ); } CSLDestroy(papszTokens); } /* -------------------------------------------------------------------- */ /* Extract the units specification. */ /* -------------------------------------------------------------------- */ if( psGXF->pszUnitName != NULL ) { if( EQUAL(psGXF->pszUnitName,"ft") ) { strcat( szPROJ4, " +units=ft" ); } else if( EQUAL(psGXF->pszUnitName,"ftUS") ) { strcat( szPROJ4, " +units=us-ft" ); } else if( EQUAL(psGXF->pszUnitName,"km") ) { strcat( szPROJ4, " +units=km" ); } else if( EQUAL(psGXF->pszUnitName,"mm") ) { strcat( szPROJ4, " +units=mm" ); } else if( EQUAL(psGXF->pszUnitName,"in") ) { strcat( szPROJ4, " +units=in" ); } else if( EQUAL(psGXF->pszUnitName,"ftInd") ) { strcat( szPROJ4, " +units=ind-ft" ); } else if( EQUAL(psGXF->pszUnitName,"lk") ) { strcat( szPROJ4, " +units=link" ); } } return( CPLStrdup( szPROJ4 ) ); }
void TIFF_ProcessFullResBlock( TIFF *hTIFF, int nPlanarConfig, int nOverviews, int * panOvList, int nBitsPerPixel, int nSamples, TIFFOvrCache ** papoRawBIs, int nSXOff, int nSYOff, unsigned char *pabySrcTile, int nBlockXSize, int nBlockYSize, int nSampleFormat, const char * pszResampling ) { int iOverview, iSample; for( iSample = 0; iSample < nSamples; iSample++ ) { /* * We have to read a tile/strip for each sample for * PLANARCONFIG_SEPARATE. Otherwise, we just read all the samples * at once when handling the first sample. */ if( nPlanarConfig == PLANARCONFIG_SEPARATE || iSample == 0 ) { if( TIFFIsTiled(hTIFF) ) { TIFFReadEncodedTile( hTIFF, TIFFComputeTile(hTIFF, nSXOff, nSYOff, 0, iSample ), pabySrcTile, TIFFTileSize(hTIFF)); } else { TIFFReadEncodedStrip( hTIFF, TIFFComputeStrip(hTIFF, nSYOff, iSample), pabySrcTile, TIFFStripSize(hTIFF) ); } } /* * Loop over destination overview layers */ for( iOverview = 0; iOverview < nOverviews; iOverview++ ) { TIFFOvrCache *poRBI = papoRawBIs[iOverview]; unsigned char *pabyOTile; int nTXOff, nTYOff, nOXOff, nOYOff, nOMult; int nOBlockXSize = poRBI->nBlockXSize; int nOBlockYSize = poRBI->nBlockYSize; int nSkewBits, nSampleByteOffset; /* * Fetch the destination overview tile */ nOMult = panOvList[iOverview]; nOXOff = (nSXOff/nOMult) / nOBlockXSize; nOYOff = (nSYOff/nOMult) / nOBlockYSize; pabyOTile = TIFFGetOvrBlock( poRBI, nOXOff, nOYOff, iSample ); /* * Establish the offset into this tile at which we should * start placing data. */ nTXOff = (nSXOff - nOXOff*nOMult*nOBlockXSize) / nOMult; nTYOff = (nSYOff - nOYOff*nOMult*nOBlockYSize) / nOMult; /* * Figure out the skew (extra space between ``our samples'') and * the byte offset to the first sample. */ assert( (nBitsPerPixel % 8) == 0 ); if( nPlanarConfig == PLANARCONFIG_SEPARATE ) { nSkewBits = 0; nSampleByteOffset = 0; } else { nSkewBits = nBitsPerPixel * (nSamples-1); nSampleByteOffset = (nBitsPerPixel/8) * iSample; } /* * Perform the downsampling. */ #ifdef DBMALLOC malloc_chain_check( 1 ); #endif TIFF_DownSample( pabySrcTile + nSampleByteOffset, nBlockXSize, nBlockYSize, nSkewBits, nBitsPerPixel, pabyOTile, poRBI->nBlockXSize, poRBI->nBlockYSize, nTXOff, nTYOff, nOMult, nSampleFormat, pszResampling ); #ifdef DBMALLOC malloc_chain_check( 1 ); #endif } } }
char *GXFGetMapProjectionAsOGCWKT( GXFHandle hGXF ) { GXFInfo_t *psGXF = (GXFInfo_t *) hGXF; char **papszMethods = NULL; char szWKT[1024]; char szGCS[512]; char szProjection[512]; /* -------------------------------------------------------------------- */ /* If there was nothing in the file return "unknown". */ /* -------------------------------------------------------------------- */ if( CSLCount(psGXF->papszMapProjection) < 2 ) return( CPLStrdup( "" ) ); strcpy( szWKT, "" ); strcpy( szGCS, "" ); strcpy( szProjection, "" ); /* -------------------------------------------------------------------- */ /* Parse the third line, looking for known projection methods. */ /* -------------------------------------------------------------------- */ if( psGXF->papszMapProjection[2] != NULL ) { /* We allow more than 80 characters if the projection parameters */ /* are on 2 lines as allowed by GXF 3 */ if( strlen(psGXF->papszMapProjection[2]) > 120 ) return( CPLStrdup( "" ) ); papszMethods = CSLTokenizeStringComplex(psGXF->papszMapProjection[2], ",", TRUE, TRUE ); } #ifdef DBMALLOC malloc_chain_check(1); #endif /* -------------------------------------------------------------------- */ /* Create the PROJCS. */ /* -------------------------------------------------------------------- */ if( papszMethods == NULL || papszMethods[0] == NULL || EQUAL(papszMethods[0],"Geographic") ) { /* do nothing */ } else if( EQUAL(papszMethods[0],"Lambert Conic Conformal (1SP)") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_LAMBERT_CONFORMAL_CONIC_1SP, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Lambert Conic Conformal (2SP)") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP, SRS_PP_STANDARD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_2, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL ); } else if( EQUAL(papszMethods[0],"Lambert Conformal (2SP Belgium)") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_LAMBERT_CONFORMAL_CONIC_2SP_BELGIUM, SRS_PP_STANDARD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_2, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL ); } else if( EQUAL(papszMethods[0],"Mercator (1SP)")) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_MERCATOR_1SP, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Mercator (2SP)")) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_MERCATOR_2SP, SRS_PP_LATITUDE_OF_ORIGIN,/* should it be StdParalle1?*/ SRS_PP_CENTRAL_MERIDIAN, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Laborde Oblique Mercator") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_LABORDE_OBLIQUE_MERCATOR, SRS_PP_LATITUDE_OF_CENTER, SRS_PP_LONGITUDE_OF_CENTER, SRS_PP_AZIMUTH, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL ); } else if( EQUAL(papszMethods[0],"Hotine Oblique Mercator") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_HOTINE_OBLIQUE_MERCATOR, SRS_PP_LATITUDE_OF_CENTER, SRS_PP_LONGITUDE_OF_CENTER, SRS_PP_AZIMUTH, SRS_PP_RECTIFIED_GRID_ANGLE, SRS_PP_SCALE_FACTOR, /* not in normal formulation */ SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING ); } else if( EQUAL(papszMethods[0],"New Zealand Map Grid") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_NEW_ZEALAND_MAP_GRID, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Oblique Stereographic") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_OBLIQUE_STEREOGRAPHIC, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Polar Stereographic") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_POLAR_STEREOGRAPHIC, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Swiss Oblique Cylindrical") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_SWISS_OBLIQUE_CYLINDRICAL, SRS_PP_LATITUDE_OF_CENTER, SRS_PP_LONGITUDE_OF_CENTER, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Transverse Mercator") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_TRANSVERSE_MERCATOR, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"Transverse Mercator (South Oriented)") || EQUAL(papszMethods[0],"Transverse Mercator (South Orientated)")) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_TRANSVERSE_MERCATOR_SOUTH_ORIENTED, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } else if( EQUAL(papszMethods[0],"*Albers Conic") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_ALBERS_CONIC_EQUAL_AREA, SRS_PP_STANDARD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_2, SRS_PP_LATITUDE_OF_CENTER, SRS_PP_LONGITUDE_OF_CENTER, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL ); } else if( EQUAL(papszMethods[0],"*Equidistant Conic") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_EQUIDISTANT_CONIC, SRS_PP_STANDARD_PARALLEL_1, SRS_PP_STANDARD_PARALLEL_2, SRS_PP_LATITUDE_OF_CENTER, SRS_PP_LONGITUDE_OF_CENTER, SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL ); } else if( EQUAL(papszMethods[0],"*Polyconic") ) { OGCWKTSetProj( szProjection, sizeof(szProjection), papszMethods, SRS_PT_POLYCONIC, SRS_PP_LATITUDE_OF_ORIGIN, SRS_PP_CENTRAL_MERIDIAN, SRS_PP_SCALE_FACTOR, /* not normally expected */ SRS_PP_FALSE_EASTING, SRS_PP_FALSE_NORTHING, NULL, NULL ); } CSLDestroy( papszMethods ); /* -------------------------------------------------------------------- */ /* Extract the linear Units specification. */ /* -------------------------------------------------------------------- */ if( psGXF->pszUnitName != NULL && strlen(szProjection) > 0 ) { if( strlen(psGXF->pszUnitName) > 80 ) return CPLStrdup(""); CPLsnprintf( szProjection+strlen(szProjection), sizeof(szProjection) - strlen(szProjection), ",UNIT[\"%s\",%.15g]", psGXF->pszUnitName, psGXF->dfUnitToMeter ); } /* -------------------------------------------------------------------- */ /* Build GEOGCS. There are still "issues" with the generation */ /* of the GEOGCS/Datum and Spheroid names. Of these, only the */ /* datum name is really significant. */ /* -------------------------------------------------------------------- */ if( CSLCount(psGXF->papszMapProjection) > 1 ) { char **papszTokens; if( strlen(psGXF->papszMapProjection[1]) > 80 ) return CPLStrdup(""); papszTokens = CSLTokenizeStringComplex(psGXF->papszMapProjection[1], ",", TRUE, TRUE ); if( CSLCount(papszTokens) > 2 ) { double dfMajor = CPLAtof(papszTokens[1]); double dfEccentricity = CPLAtof(papszTokens[2]); double dfInvFlattening, dfMinor; char *pszOGCDatum; /* translate eccentricity to inv flattening. */ if( dfEccentricity == 0.0 ) dfInvFlattening = 0.0; else { dfMinor = dfMajor * pow(1.0-dfEccentricity*dfEccentricity,0.5); dfInvFlattening = OSRCalcInvFlattening(dfMajor, dfMinor); } pszOGCDatum = CPLStrdup(papszTokens[0]); WKTMassageDatum( &pszOGCDatum ); CPLsnprintf( szGCS, sizeof(szGCS), "GEOGCS[\"%s\"," "DATUM[\"%s\"," "SPHEROID[\"%s\",%s,%.15g]],", papszTokens[0], pszOGCDatum, papszTokens[0], /* this is datum, but should be ellipse*/ papszTokens[1], dfInvFlattening ); CPLFree( pszOGCDatum ); } if( CSLCount(papszTokens) > 3 ) CPLsnprintf( szGCS + strlen(szGCS), sizeof(szGCS) - strlen(szGCS), "PRIMEM[\"unnamed\",%s],", papszTokens[3] ); CPLsnprintf( szGCS + strlen(szGCS), sizeof(szGCS) - strlen(szGCS), "%s", "UNIT[\"degree\",0.0174532925199433]]" ); CSLDestroy( papszTokens ); } CPLAssert(strlen(szProjection) < sizeof(szProjection)); CPLAssert(strlen(szGCS) < sizeof(szGCS)); /* -------------------------------------------------------------------- */ /* Put this all together into a full projection. */ /* -------------------------------------------------------------------- */ if( strlen(szProjection) > 0 ) { if( strlen(psGXF->papszMapProjection[0]) > 80 ) return CPLStrdup(""); if( psGXF->papszMapProjection[0][0] == '"' ) snprintf( szWKT, sizeof(szWKT), "PROJCS[%s,%s,%s]", psGXF->papszMapProjection[0], szGCS, szProjection ); else snprintf( szWKT, sizeof(szWKT), "PROJCS[\"%s\",%s,%s]", psGXF->papszMapProjection[0], szGCS, szProjection ); } else { strcpy( szWKT, szGCS ); } return( CPLStrdup( szWKT ) ); }
int handle_command(char *buffer) { int rc = 1; char *op; int cmdtype; static unsigned long mark; if (ExtractArg(buffer, &op, &buffer) < 0) { return -1; } cmdtype = type_command(op); switch (cmdtype) { case COMMAND_GET: handle_get_command(buffer); break; case COMMAND_SET: handle_set_command(buffer); break; case COMMAND_RESET: handle_reset_command(buffer); break; case COMMAND_BYE: handle_bye_command(buffer); rc = 0; break; case COMMAND_CLI: handle_cli_command(buffer); break; case COMMAND_MEMSTART: #ifdef _DMALLOC_ dmalloc_message("starting new log"); mark = dmalloc_mark(); #elif _DBMALLOC_ if(malloc_chain_check(0)!=0) { int fd; fd = open("/usr/local/nextone/logs/malloc.inuse", O_CREAT|O_RDWR ); malloc_dump(fd ); close(fd); } orig_size = malloc_inuse(&histid1); #endif break; case COMMAND_MEMSTOP: #ifdef _DMALLOC_ dmalloc_log_changed(mark, 1, 0, 1); dmalloc_message("end of log"); #elif _DBMALLOC_ current_size = malloc_inuse(&histid2); if(current_size != orig_size) { int fd; fd = open("/usr/local/nextone/logs/malloc.inuse", O_CREAT|O_RDWR ); malloc_list(fd, histid1, histid2); close(fd); } #endif break; case COMMAND_NONE: default: break; } return rc; }