16 #include <boost/date_time/gregorian/gregorian.hpp> 17 #include <boost/timer/timer.hpp> 23 impl(
const std::map <std::string, std::map <std::string, std::string > >& tile_idx,
24 const std::string subdataset_prefix,
25 const std::string subdataset_suffix,
26 std::size_t max_pixel_cache_size,
27 std::size_t max_block_cache_size,
28 std::size_t max_raster_cache_size);
32 void query(
const double& longitude,
const double& latitude,
33 const unsigned char** values,
34 const std::vector<boost::gregorian::date>**
times)
const;
46 unsigned char*
check_in_disk(
unsigned int col,
unsigned int row)
const;
50 unsigned int row)
const;
54 unsigned int row)
const;
61 const std::vector<te::rst::Raster*>& rasters,
63 unsigned int block_y)
const;
73 std::vector<boost::gregorian::date>
m_times;
77 const std::map <std::string, std::map <std::string, std::string > >*
m_tile_idx;
101 const std::string subdataset_prefix,
102 const std::string subdataset_suffix,
103 std::size_t max_pixel_cache_size,
104 std::size_t max_block_cache_size,
105 std::size_t max_raster_cache_size)
163 const unsigned char** values,
164 const std::vector<boost::gregorian::date>**
times)
const 174 double x = longitude;
190 unsigned int col =
static_cast<unsigned int>(dcol);
191 unsigned int row =
static_cast<unsigned int>(drow);
194 boost::uint64_t
id =
static_cast<boost::uint64_t
>(row) *
196 static_cast<boost::uint64_t>(col);
212 throw std::logic_error(
"a coisa ta feia!");
240 boost::uint64_t tile_block_x = tile_col /
m_blk_w;
241 boost::uint64_t tile_block_y = tile_row /
m_blk_h;
245 (tile_block_y *
m_nblks_x + tile_block_x);
258 boost::uint64_t
id =
static_cast<boost::uint64_t
>(v) *
m_ntiles_x + static_cast<boost::uint64_t>(h);
267 const std::size_t nrasters =
m_times.size();
269 std::vector<te::rst::Raster*>*
rasters = 0;
273 for(std::size_t i = 0; i != nrasters; ++i)
275 delete (*rasters)[i];
281 rasters =
new std::vector<te::rst::Raster*>(nrasters);
289 std::string sh = boost::lexical_cast<std::string>(h);
294 std::string sv = boost::lexical_cast<std::string>(v);
299 std::string hv =
"h" + sh +
"v" + sv;
301 const std::map<std::string, std::string>& raster_files =
m_tile_idx->at(hv);
303 std::map<std::string, std::string>::const_iterator it = raster_files.begin();
307 boost::timer::cpu_timer timer;
309 while(it != raster_files.end())
311 const std::string& raster_file = it->second;
315 (*rasters)[i] = raster;
321 std::string ret_val = timer.format();
322 std::cout <<
"tile dataset opened in: " << ret_val << std::endl;
329 unsigned int row)
const 336 unsigned char* data = 0;
345 boost::uint64_t
id =
static_cast<boost::uint64_t
>(row) *
347 static_cast<boost::uint64_t>(col);
356 unsigned int row)
const 358 assert(rasters.size() ==
m_times.size());
363 boost::uint64_t tile_block_x = tile_col /
m_blk_w;
364 boost::uint64_t tile_block_y = tile_row /
m_blk_h;
369 std::vector<unsigned char*>* blocks = 0;
380 (tile_block_y *
m_nblks_x + tile_block_x);
389 const std::size_t nblocks =
m_times.size();
391 std::vector<unsigned char*>* blocks =
new std::vector<unsigned char*>(nblocks);
393 for(std::size_t i = 0; i != nblocks; ++i)
395 unsigned char* block_data =
new unsigned char[
m_blk_size];
397 (*blocks)[i] = block_data;
404 const std::vector<te::rst::Raster*>&
rasters,
405 unsigned int block_x,
406 unsigned int block_y)
const 408 assert(blocks.size() == rasters.size());
409 assert(blocks.size() ==
m_times.size());
411 const std::size_t nrasters = rasters.size();
413 for(std::size_t i = 0; i != nrasters; ++i)
417 unsigned char* block_data = blocks[i];
421 raster->
getBand(0)->
read(block_x, block_y, block_data);
430 const std::string& sample_file =
m_tile_idx->begin()->second.begin()->second;
434 m_blk_w = raster->getBand(0)->getProperty()->m_blkw;
435 m_blk_h = raster->getBand(0)->getProperty()->m_blkh;
437 m_nblks_x = raster->getBand(0)->getProperty()->m_nblocksx;
438 m_nblks_y = raster->getBand(0)->getProperty()->m_nblocksy;
457 unsigned int min_h = std::numeric_limits<unsigned int>::max();
458 unsigned int min_v = std::numeric_limits<unsigned int>::max();
459 unsigned int max_h = std::numeric_limits<unsigned int>::min();
460 unsigned int max_v = std::numeric_limits<unsigned int>::min();
465 std::map <std::string, std::map <std::string, std::string > >::const_iterator it =
m_tile_idx->begin();
469 const std::string& hv = it->first;
471 const std::map <std::string, std::string >& rasters_of_a_tile = it->second;
473 if(rasters_of_a_tile.empty())
480 unsigned int h = boost::lexical_cast<
unsigned int>(hv.substr(1, 2));
481 unsigned int v = boost::lexical_cast<
unsigned int>(hv.substr(4, 2));
495 const std::string& raster_file = rasters_of_a_tile.begin()->second;
499 modis_extent.
Union(*(raster->getGrid()->getExtent()));
519 std::set<std::string> all_times;
521 std::map <std::string, std::map <std::string, std::string > >::const_iterator hv_it =
m_tile_idx->begin();
525 std::map <std::string, std::string>::const_iterator it = hv_it->second.begin();
527 while(it != hv_it->second.end())
530 all_times.insert(it->first);
538 std::set<std::string>::const_iterator time_it = all_times.begin();
540 while(time_it != all_times.end())
542 m_times.push_back(boost::gregorian::from_string(*time_it));
549 const std::string subdataset_prefix,
550 const std::string subdataset_suffix,
551 std::size_t max_pixel_cache_size,
552 std::size_t max_block_cache_size,
553 std::size_t max_raster_cache_size)
556 m_pimpl =
new impl(tile_idx, subdataset_prefix, subdataset_suffix,
557 max_pixel_cache_size, max_block_cache_size, max_raster_cache_size);
566 const unsigned char** values,
567 const std::vector<boost::gregorian::date>**
times)
const const te::rst::Grid * grid() const
unsigned int m_modis_tile_w
fifo_cache< unsigned char > * m_pixel_cache
std::string m_subdataset_suffix
void load_dataset_grid_info()
const std::map< std::string, std::map< std::string, std::string > > * m_tile_idx
This file contains include headers for TerraLib Spatial Reference System module.
impl(const std::map< std::string, std::map< std::string, std::string > > &tile_idx, const std::string subdataset_prefix, const std::string subdataset_suffix, std::size_t max_pixel_cache_size, std::size_t max_block_cache_size, std::size_t max_raster_cache_size)
const te::rst::Grid * grid() const
void Union(const Envelope &rhs)
It updates the envelop with coordinates of another envelope.
void query(const double &longitude, const double &latitude, const unsigned char **values, const std::vector< boost::gregorian::date > **times) const
void geoToGrid(const double &x, const double &y, double &col, double &row) const
Get the grid point associated to a spatial location.
unsigned int m_nblks_per_tile
unsigned char * sync_cache_from_rasters(const std::vector< te::rst::Raster * > &rasters, unsigned int col, unsigned int row) const
unsigned char * check_in_disk(unsigned int col, unsigned int row) const
void(* extract_pixel_data_fnct_t)(const std::vector< unsigned char * > &, unsigned int, unsigned char *)
fifo_cache< std::vector< te::rst::Raster * > > * m_raster_cache
int m_pixel_data_type_size
boost::shared_ptr< Raster > RasterPtr
std::vector< unsigned char * > * alloc_blocks() const
An Envelope defines a 2D rectangular region.
An abstract class for raster data strucutures.
unsigned char * check_in_raster_cache(unsigned int col, unsigned int row) const
virtual std::size_t getNumberOfBands() const =0
Returns the number of bands (dimension of cells attribute values) in the raster.
void set_extract_pixel_data_strategy(extract_pixel_data_fnct_t *f, int data_type)
unsigned int m_tot_blocks_in_x
unsigned int getNumberOfColumns() const
Returns the grid number of columns.
std::complex< double > times(std::complex< double > lhs, std::complex< double > rhs)
void extract_block_data(std::vector< unsigned char * > &blocks, const std::vector< te::rst::Raster * > &rasters, unsigned int block_x, unsigned int block_y) const
const T * data(boost::uint64_t id) const
virtual const Band * getBand(std::size_t i) const =0
Returns the raster i-th band.
te::srs::Converter * m_converter
std::string m_subdataset_prefix
TERASTEREXPORT int GetPixelSize(int datatype)
Returns the byte size of a given datatype.
unsigned char * check_in_block_cache(unsigned int col, unsigned int row) const
std::vector< boost::gregorian::date > m_times
A Converter is responsible for the conversion of coordinates between different Coordinate Systems (CS...
virtual void read(int x, int y, void *buffer) const =0
It reads a data block to the specified buffer.
modis_dataset(const std::map< std::string, std::map< std::string, std::string > > &tile_idx, const std::string subdataset_prefix, const std::string subdataset_suffix, std::size_t max_pixel_cache_size=2, std::size_t max_block_cache_size=1, std::size_t max_raster_cache_size=1)
void load_dataset_tile_info()
unsigned char * sync_cache_from_blocks(const std::vector< unsigned char * > &blocks, unsigned int col, unsigned int row) const
unsigned int m_modis_tile_h
fifo_cache< std::vector< unsigned char * > > * m_block_cache
This file contains include headers for the Vector Geometry model of TerraLib.
A rectified grid is the spatial support for raster data.
void query(const double &longitude, const double &latitude, const unsigned char **values, const std::vector< boost::gregorian::date > **times) const
unsigned int m_modis_tile_h_offset
void push(boost::uint64_t id, T *data)
static Raster * open(const std::map< std::string, std::string > &rinfo, te::common::AccessPolicy p=te::common::RAccess)
It opens a raster with the given parameters and default raster driver.
extract_pixel_data_fnct_t m_extract_pixel_data
unsigned int m_modis_tile_v_offset