1 : /******************************************************************************
2 : * $Id: ogr_srs_dict.cpp 11881 2007-08-13 18:03:48Z mloskot $
3 : *
4 : * Project: OpenGIS Simple Features Reference Implementation
5 : * Purpose: Implement importFromDict() method to read a WKT SRS from a
6 : * coordinate system dictionary in a simple text format.
7 : * Author: Frank Warmerdam, warmerdam@pobox.com
8 : *
9 : ******************************************************************************
10 : * Copyright (c) 2004, Frank Warmerdam
11 : *
12 : * Permission is hereby granted, free of charge, to any person obtaining a
13 : * copy of this software and associated documentation files (the "Software"),
14 : * to deal in the Software without restriction, including without limitation
15 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 : * and/or sell copies of the Software, and to permit persons to whom the
17 : * Software is furnished to do so, subject to the following conditions:
18 : *
19 : * The above copyright notice and this permission notice shall be included
20 : * in all copies or substantial portions of the Software.
21 : *
22 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 : * DEALINGS IN THE SOFTWARE.
29 : ****************************************************************************/
30 :
31 : #include "ogr_spatialref.h"
32 : #include "cpl_conv.h"
33 :
34 : CPL_CVSID("$Id: ogr_srs_dict.cpp 11881 2007-08-13 18:03:48Z mloskot $");
35 :
36 :
37 : /************************************************************************/
38 : /* importFromDict() */
39 : /************************************************************************/
40 :
41 : /**
42 : * Read SRS from WKT dictionary.
43 : *
44 : * This method will attempt to find the indicated coordinate system identity
45 : * in the indicated dictionary file. If found, the WKT representation is
46 : * imported and used to initialize this OGRSpatialReference.
47 : *
48 : * More complete information on the format of the dictionary files can
49 : * be found in the epsg.wkt file in the GDAL data tree. The dictionary
50 : * files are searched for in the "GDAL" domain using CPLFindFile(). Normally
51 : * this results in searching /usr/local/share/gdal or somewhere similar.
52 : *
53 : * This method is the same as the C function OSRImportFromDict().
54 : *
55 : * @param pszDictFile the name of the dictionary file to load.
56 : *
57 : * @param pszCode the code to lookup in the dictionary.
58 : *
59 : * @return OGRERR_NONE on success, or OGRERR_SRS_UNSUPPORTED if the code isn't
60 : * found, and OGRERR_SRS_FAILURE if something more dramatic goes wrong.
61 : */
62 :
63 2884 : OGRErr OGRSpatialReference::importFromDict( const char *pszDictFile,
64 : const char *pszCode )
65 :
66 : {
67 : const char *pszFilename;
68 : FILE *fp;
69 2884 : OGRErr eErr = OGRERR_UNSUPPORTED_SRS;
70 :
71 : /* -------------------------------------------------------------------- */
72 : /* Find and open file. */
73 : /* -------------------------------------------------------------------- */
74 2884 : pszFilename = CPLFindFile( "gdal", pszDictFile );
75 2884 : if( pszFilename == NULL )
76 0 : return OGRERR_UNSUPPORTED_SRS;
77 :
78 2884 : fp = VSIFOpen( pszFilename, "rb" );
79 2884 : if( fp == NULL )
80 0 : return OGRERR_UNSUPPORTED_SRS;
81 :
82 : /* -------------------------------------------------------------------- */
83 : /* Process lines. */
84 : /* -------------------------------------------------------------------- */
85 : const char *pszLine;
86 :
87 642736 : while( (pszLine = CPLReadLine(fp)) != NULL )
88 :
89 : {
90 637390 : if( pszLine[0] == '#' )
91 : /* do nothing */;
92 :
93 604840 : else if( EQUALN(pszLine,"include ",8) )
94 : {
95 1748 : eErr = importFromDict( pszLine + 8, pszCode );
96 1748 : if( eErr != OGRERR_UNSUPPORTED_SRS )
97 154 : break;
98 : }
99 :
100 603092 : else if( strstr(pszLine,",") == NULL )
101 : /* do nothing */;
102 :
103 602558 : else if( EQUALN(pszLine,pszCode,strlen(pszCode))
104 268 : && pszLine[strlen(pszCode)] == ',' )
105 : {
106 268 : char *pszWKT = (char *) pszLine + strlen(pszCode)+1;
107 :
108 268 : eErr = importFromWkt( &pszWKT );
109 268 : break;
110 : }
111 : }
112 :
113 : /* -------------------------------------------------------------------- */
114 : /* Cleanup */
115 : /* -------------------------------------------------------------------- */
116 2884 : VSIFClose( fp );
117 :
118 2884 : return eErr;
119 : }
120 :
121 : /************************************************************************/
122 : /* OSRImportFromDict() */
123 : /************************************************************************/
124 :
125 0 : OGRErr OSRImportFromDict( OGRSpatialReferenceH hSRS,
126 : const char *pszDictFile,
127 : const char *pszCode )
128 :
129 : {
130 0 : VALIDATE_POINTER1( hSRS, "OSRImportFromDict", CE_Failure );
131 :
132 : return ((OGRSpatialReference *) hSRS)->importFromDict( pszDictFile,
133 0 : pszCode );
134 : }
|