Ticket #4211: patch-meta2.txt

File patch-meta2.txt, 9.1 KB (added by etiennesky, 5 years ago)

patch for metatada fixes

Line 
1Index: netcdfdataset.cpp
2===================================================================
3--- netcdfdataset.cpp   (revision 23000)
4+++ netcdfdataset.cpp   (working copy)
5@@ -185,7 +185,7 @@
6 {
7     char     szVarName[NC_MAX_NAME];
8     char     szMetaName[NC_MAX_NAME];
9-    char     szMetaTemp[8192];
10+    char     szMetaTemp[MAX_STR_LEN];
11     int      nd;
12     int      i,j;
13     int      Sum  = 1;
14@@ -293,7 +293,7 @@
15                     status =  nc_get_vara_double( poDS->cdfid, nVarID,
16                                                   start,
17                                                   count, &dfData);
18-                    sprintf( szMetaTemp,"%g", dfData );
19+                    sprintf( szMetaTemp,"%.16g", dfData );
20                     break;
21                 default:
22                     break;
23@@ -331,8 +331,59 @@
24         Taken += result * Sum;
25     }
26 
27+/* etiennesky fix for netCDF import/export */
28 
29+/* -------------------------------------------------------------------- */
30+/*      Get all other metadata                                          */
31+/* -------------------------------------------------------------------- */
32 
33+    int nAtt=0;
34+    nc_type  atttype=NC_NAT;
35+    size_t   attlen;
36+    float fval;
37+    double dval;
38+    int ival;
39+
40+    nc_inq_varnatts( poDS->cdfid, nZId, &nAtt );
41+    for( i=0; i < nAtt ; i++ ) {
42+       status = nc_inq_attname( poDS->cdfid, nZId,
43+                                i, szTemp);
44+       status = nc_inq_att( poDS->cdfid, nZId,
45+                            szTemp, &atttype, &attlen);
46+       if(strcmp(szTemp,_FillValue) ==0) continue;
47+       sprintf( szMetaTemp,"%s",szTemp);
48+       switch( atttype ) {
49+       case NC_CHAR:
50+           char *fillc;
51+           fillc = (char *) CPLCalloc( attlen+1, sizeof(char) );
52+           status=nc_get_att_text( poDS->cdfid, nZId,
53+                                   szTemp, fillc );
54+           SetMetadataItem( szMetaTemp, fillc );
55+           CPLFree(fillc);
56+           break;
57+       case NC_INT:
58+           status = nc_get_att_int( poDS->cdfid, nZId,
59+                                    szTemp, &ival );
60+           sprintf( szTemp,"%d",ival);
61+           SetMetadataItem( szMetaTemp, szTemp );
62+           break;
63+       case NC_FLOAT:
64+           status = nc_get_att_float( poDS->cdfid, nZId,
65+                                      szTemp, &fval );
66+           sprintf( szTemp,"%f",fval);
67+           SetMetadataItem( szMetaTemp, szTemp );
68+           break;
69+       case NC_DOUBLE:
70+           status = nc_get_att_double( poDS->cdfid, nZId,
71+                                       szTemp, &dval );
72+           sprintf( szTemp,"%.16g",dval);
73+           SetMetadataItem( szMetaTemp, szTemp );
74+           break;
75+       default:
76+           break;
77+       }
78+    }
79+
80     return CE_None;
81 }
82 
83@@ -355,7 +406,7 @@
84     nc_type  atttype=NC_NAT;
85     size_t   attlen;
86     int      status;
87-    char     szNoValueName[8192];
88+    char     szNoValueName[MAX_STR_LEN];
89 
90 
91     this->panBandZPos = NULL;
92@@ -826,7 +877,8 @@
93 
94     nc_inq_varname(  cdfid, var, szVarName );
95     strcpy(szTemp,szVarName);
96-    strcat(szTemp,"#grid_mapping");
97+    strcat(szTemp,"#");
98+    strcat(szTemp,GRD_MAPPING);
99     pszValue = CSLFetchNameValue(poDS->papszMetadata, szTemp);
100     if( pszValue ) {
101         strcpy(szGridMappingName,szTemp);
102@@ -852,7 +904,7 @@
103     szDimNameY[3] = '\0';
104 
105 /* -------------------------------------------------------------------- */
106-/*      Read grid_mappinginformation and set projections               */
107+/*      Read grid_mapping information and set projections               */
108 /* -------------------------------------------------------------------- */
109 
110     if( !( EQUAL(szGridMappingName,"" ) ) ) {
111@@ -1778,10 +1830,10 @@
112                 pfTemp = (float *) CPLCalloc( nAttrLen, sizeof( float ) );
113                 nc_get_att_float( cdfid, var, szAttrName, pfTemp );
114                 for(m=0; m < nAttrLen-1; m++) {
115-                    sprintf( szTemp, "%e, ", pfTemp[m] );
116+                    sprintf( szTemp, "%f, ", pfTemp[m] );
117                     SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize);
118                 }
119-                   sprintf( szTemp, "%e", pfTemp[m] );
120+                   sprintf( szTemp, "%f", pfTemp[m] );
121                    SafeStrcat(&pszMetaTemp,szTemp, &nMetaTempSize);
122                 CPLFree(pfTemp);
123                 break;
124@@ -1790,10 +1842,10 @@
125                 pdfTemp = (double *) CPLCalloc(nAttrLen, sizeof(double));
126                 nc_get_att_double( cdfid, var, szAttrName, pdfTemp );
127                 for(m=0; m < nAttrLen-1; m++) {
128-                    sprintf( szTemp, "%g, ", pdfTemp[m] );
129+                    sprintf( szTemp, "%.16g, ", pdfTemp[m] );
130                     SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize);
131                 }
132-                   sprintf( szTemp, "%g", pdfTemp[m] );
133+                   sprintf( szTemp, "%.16g", pdfTemp[m] );
134                    SafeStrcat(&pszMetaTemp, szTemp, &nMetaTempSize);
135                 CPLFree(pdfTemp);
136                 break;
137@@ -2281,6 +2333,7 @@
138     const char *pszField;
139     char       szMetaName[ MAX_STR_LEN ];
140     char       szMetaValue[ MAX_STR_LEN ];
141+    char       szTemp[ MAX_STR_LEN ];
142     int        nDataLength;
143     int        nItems;
144 
145@@ -2312,15 +2365,33 @@
146         if( papszFieldData[1] != NULL ) {
147             strcpy( szMetaName,  papszFieldData[ 0 ] );
148             strcpy( szMetaValue, papszFieldData[ 1 ] );
149+           if( CDFVarID == NC_GLOBAL ) {
150 
151+             /* Fix NC_GLOBAL, time and GDAL- */
152+             if( strncmp( szMetaName, "NC_GLOBAL#", 10 ) == 0 ) {
153+               strcpy( szTemp, szMetaName+10 );
154+               strcpy( szMetaName, szTemp );
155+             }
156+             else if( strncmp( szMetaName, "time#", 5 ) == 0 ) {
157+               szMetaName[4] = '-';
158+             }
159+             else if ( strstr( szMetaName, "#" ) == NULL ) {
160+               strcpy( szTemp, "GDAL_" );
161+               strcat( szTemp, szMetaName );
162+               strcpy( szMetaName, szTemp );
163+             }
164+
165+           }
166+
167 /* -------------------------------------------------------------------- */
168-/*      netCDF attributes do not like the '#' character.                */
169+/*     Only copy data without #                                         */
170 /* -------------------------------------------------------------------- */
171-
172-            for( unsigned int h=0; h < strlen( szMetaName ) -1 ; h++ ) {
173-                if( szMetaName[h] == '#' ) szMetaName[h] = '-';
174-            }
175+            // for( unsigned int h=0; h < strlen( szMetaName ) -1 ; h++ ) {
176+            //     if( szMetaName[h] == '#' ) szMetaName[h] = '-';
177+            // }
178           
179+           if (  strstr( szMetaName, "#" ) == NULL ) {
180+           
181             nDataLength = strlen( szMetaValue );
182             nc_put_att_text( fpImage,
183                              CDFVarID,
184@@ -2328,6 +2399,7 @@
185                              nDataLength,
186                              szMetaValue );
187 
188+           }
189           
190         }
191         CSLDestroy( papszFieldData );
192@@ -2677,19 +2749,43 @@
193         int       NCDFVarID;
194         size_t    start[ GDALNBDIM ];
195         size_t    count[ GDALNBDIM ];
196-        size_t    nBandNameLen;
197         double    dfNoDataValue;
198         unsigned char      cNoDataValue;
199         float     fNoDataValue;
200         int       nlNoDataValue;
201         short     nsNoDataValue;
202         GDALRasterBandH        hBand;
203+       const char *tmpMetadata;
204+        char      szLongName[ NC_MAX_NAME ];
205 
206         GDALRasterBand *poSrcBand = poSrcDS->GetRasterBand( i );
207         hBand = GDALGetRasterBand( poSrcDS, i );
208 
209-        sprintf( szBandName, "Band%d", i );
210+       /* etiennesky fix for netCDF import/export */
211+
212+       /* Get var name from NETCDF_VARNAME */
213+       tmpMetadata = poSrcBand->GetMetadataItem("NETCDF_VARNAME");
214+               if( tmpMetadata != NULL) {
215+            if(nBands>1) sprintf(szBandName,"%s%d",tmpMetadata,i);
216+            else strcpy( szBandName, tmpMetadata );
217+            // poSrcBand->SetMetadataItem("NETCDF_VARNAME","");
218+       }
219+        else
220+            sprintf( szBandName, "Band%d", i );
221 
222+        /* Get long_name from <var>#long_name */
223+        sprintf(szLongName,"%s#long_name",poSrcBand->GetMetadataItem("NETCDF_VARNAME"));
224+        tmpMetadata = poSrcDS->GetMetadataItem(szLongName);
225+       if( tmpMetadata != NULL)
226+            strcpy( szLongName, tmpMetadata);
227+        else
228+            sprintf( szLongName, "GDAL Band Number %d", i);
229+
230+/* -------------------------------------------------------------------- */
231+/*      Get Data type                                                   */
232+/* -------------------------------------------------------------------- */
233+
234+
235         eDT = poSrcDS->GetRasterBand(i)->GetRasterDataType();
236         anBandDims[0] = nYDimID;
237         anBandDims[1] = nXDimID;
238@@ -2933,13 +3029,15 @@
239                              pszNetcdfProjection );
240         }
241 
242-        sprintf( szBandName, "GDAL Band Number %d", i);
243-        nBandNameLen = strlen( szBandName );
244+/* -------------------------------------------------------------------- */
245+/*      Copy Metadata for band                                          */
246+/* -------------------------------------------------------------------- */
247+
248         nc_put_att_text( fpImage,
249                          NCDFVarID,
250                          "long_name",
251-                         nBandNameLen,
252-                         szBandName );
253+                         strlen( szLongName ),
254+                         szLongName );
255 
256         CopyMetadata( (void *) hBand, fpImage, NCDFVarID );
257