28 #include <gdal_priv.h>
29 #include <ogr_spatialref.h>
58 d_coards_lat_units.insert(
"degrees_north");
59 d_coards_lat_units.insert(
"degree_north");
60 d_coards_lat_units.insert(
"degree_N");
61 d_coards_lat_units.insert(
"degrees_N");
63 d_coards_lon_units.insert(
"degrees_east");
64 d_coards_lon_units.insert(
"degree_east");
65 d_coards_lon_units.insert(
"degrees_E");
66 d_coards_lon_units.insert(
"degree_E");
68 d_lat_names.insert(
"COADSY");
69 d_lat_names.insert(
"lat");
70 d_lat_names.insert(
"Lat");
71 d_lat_names.insert(
"LAT");
73 d_lon_names.insert(
"COADSX");
74 d_lon_names.insert(
"lon");
75 d_lon_names.insert(
"Lon");
76 d_lon_names.insert(
"LON");
97 is_prefix(
const string & in): s(in)
100 bool operator()(
const string & prefix)
102 return s.find(prefix) == 0;
117 FONgGrid::m_lat_unit_or_name_match(
const string &var_units,
const string &var_name,
118 const string &long_name)
120 return (long_name ==
"latitude"
121 || d_coards_lat_units.find(var_units) != d_coards_lat_units.end()
122 || find_if(d_lat_names.begin(), d_lat_names.end(), is_prefix(var_name)) != d_lat_names.end());
126 FONgGrid::m_lon_unit_or_name_match(
const string &var_units,
const string &var_name,
127 const string &long_name)
129 return (long_name ==
"longitude"
130 || d_coards_lon_units.find(var_units) != d_coards_lon_units.end()
131 || find_if(d_lon_names.begin(), d_lon_names.end(), is_prefix(var_name)) != d_lon_names.end());
151 Grid::Map_iter m = d_grid->map_begin();
156 Array::Dim_iter d = d_grid->get_array()->dim_begin();
164 while (m != d_grid->map_end() && (!d_lat || !d_lon)) {
165 string units_value = (*m)->get_attr_table().get_attr(
"units");
166 units_value = remove_quotes(units_value);
167 string long_name = (*m)->get_attr_table().get_attr(
"long_name");
168 long_name = remove_quotes(long_name);
169 string map_name = (*m)->name();
173 if (!d_lat && m_lat_unit_or_name_match(units_value, map_name, long_name)) {
180 d_lat = dynamic_cast < Array * >(*m);
182 throw InternalErr(__FILE__, __LINE__,
"Expected an array.");
184 if (!d_lat->read_p())
188 if (!d_lon && m_lon_unit_or_name_match(units_value, map_name, long_name)) {
189 d_lon = dynamic_cast < Array * >(*m);
191 throw InternalErr(__FILE__, __LINE__,
"Expected an array.");
193 if (!d_lon->read_p())
201 return d_lat && d_lon;
214 BESDEBUG(
"fong3",
"Entering FONgGrid::extract_coordinates" << endl);
216 double *lat = 0, *lon = 0;
226 lat = extract_double_array(d_lat);
227 lon = extract_double_array(d_lon);
235 string missing_value = d_grid->get_attr_table().get_attr(
"missing_value");
236 if (missing_value.empty())
237 missing_value = d_grid->get_array()->get_attr_table().get_attr(
"missing_value");
238 if (missing_value.empty())
239 missing_value = d_grid->get_attr_table().get_attr(
"_FillValue");
240 if (missing_value.empty())
241 missing_value = d_grid->get_array()->get_attr_table().get_attr(
"_FillValue");
243 BESDEBUG(
"fong3",
"missing_value attribute: " << missing_value << endl);
246 if (!missing_value.empty()) {
272 static bool is_spherical(BaseType *btp)
278 bool gmn = btp->get_attr_table().get_attr(
"grid_mapping_name") ==
"latitude_longitude";
279 bool sma = btp->get_attr_table().get_attr(
"semi_major_axis") ==
"6371000.0";
280 bool iflat = btp->get_attr_table().get_attr(
"inverse_flattening") ==
"0";
282 return gmn && sma && iflat;
286 static bool is_wgs84(BaseType *btp)
293 bool gmn = btp->get_attr_table().get_attr(
"grid_mapping_name") ==
"latitude_longitude";
294 bool lpm = btp->get_attr_table().get_attr(
"longitude_of_prime_meridian") ==
"0.0";
295 bool sma = btp->get_attr_table().get_attr(
"semi_major_axis") ==
"6378137.0";
296 bool iflat = btp->get_attr_table().get_attr(
"inverse_flattening") ==
"298.257223563";
298 return gmn && lpm && sma && iflat;
315 string mapping_info = d_grid->get_attr_table().get_attr(
"grid_mapping");
316 if (mapping_info.empty())
317 mapping_info = d_grid->get_array()->get_attr_table().get_attr(
"grid_mapping");
321 if (!mapping_info.empty()) {
329 BaseType *btp = dds->var(mapping_info);
330 if (btp->name() ==
"crs") {
333 else if (is_spherical(btp))
334 WK_GCS =
"EPSG:4047";
338 OGRSpatialReference srs;
339 srs.SetWellKnownGeogCS(WK_GCS.c_str());
340 char *srs_wkt =
NULL;
341 srs.exportToWkt(&srs_wkt);
343 string wkt = srs_wkt;
352 if (!d_grid->get_array()->read_p())
353 d_grid->get_array()->read();
356 return extract_double_array(d_grid->get_array());
virtual ~FONgGrid()
Destructor that cleans up the grid.
static string default_gcs
FONgGrid(libdap::Grid *g)
Constructor for FONgGrid that takes a DAP Grid.
string get_projection(libdap::DDS *dds)
Set the projection information For Grids, look for CF information.
bool find_lat_lon_maps()
A private method called by the constructor that searches for latitude and longitude map vectors...
static class NCMLUtil overview
virtual double * get_data()
Get the data values for the band(s). Call must delete.
A DAP BaseType with file out gdal information included.
virtual void extract_coordinates(FONgTransform &t)
Extract the size (pixels), element data type and top-left and bottom-right lat/lon corner points for ...
#define BESDEBUG(x, y)
macro used to send debug information to the debug stream