2015-05-29 20:28:29 -04:00
|
|
|
#ifndef RASTER_SOURCE_HPP
|
|
|
|
#define RASTER_SOURCE_HPP
|
|
|
|
|
2016-03-30 18:29:47 -04:00
|
|
|
#include "util/coordinate.hpp"
|
2016-05-27 15:05:04 -04:00
|
|
|
#include "util/exception.hpp"
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2016-05-27 15:05:04 -04:00
|
|
|
#include <boost/algorithm/string/trim.hpp>
|
2019-10-03 03:44:27 -04:00
|
|
|
#include <boost/algorithm/string.hpp>
|
2016-05-27 15:05:04 -04:00
|
|
|
#include <boost/assert.hpp>
|
2015-05-29 20:28:29 -04:00
|
|
|
#include <boost/filesystem.hpp>
|
|
|
|
#include <boost/filesystem/fstream.hpp>
|
|
|
|
#include <boost/spirit/include/qi.hpp>
|
2016-05-27 15:05:04 -04:00
|
|
|
#include <boost/spirit/include/qi_int.hpp>
|
2019-10-03 03:44:27 -04:00
|
|
|
#include <boost/foreach.hpp>
|
|
|
|
|
2016-11-30 22:08:01 -05:00
|
|
|
#include <storage/io.hpp>
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
#include <iterator>
|
2016-05-27 15:05:04 -04:00
|
|
|
#include <unordered_map>
|
2019-10-03 03:44:27 -04:00
|
|
|
#include <string>
|
|
|
|
#include <list>
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2016-01-05 10:51:13 -05:00
|
|
|
namespace osrm
|
|
|
|
{
|
|
|
|
namespace extractor
|
|
|
|
{
|
|
|
|
|
2015-05-29 20:28:29 -04:00
|
|
|
/**
|
|
|
|
\brief Small wrapper around raster source queries to optionally provide results
|
|
|
|
gracefully, depending on source bounds
|
|
|
|
*/
|
|
|
|
struct RasterDatum
|
|
|
|
{
|
|
|
|
static std::int32_t get_invalid() { return std::numeric_limits<std::int32_t>::max(); }
|
|
|
|
|
|
|
|
std::int32_t datum = get_invalid();
|
|
|
|
|
|
|
|
RasterDatum() = default;
|
|
|
|
|
|
|
|
RasterDatum(std::int32_t _datum) : datum(_datum) {}
|
|
|
|
};
|
|
|
|
|
|
|
|
class RasterGrid
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RasterGrid(const boost::filesystem::path &filepath, std::size_t _xdim, std::size_t _ydim)
|
|
|
|
{
|
|
|
|
xdim = _xdim;
|
|
|
|
ydim = _ydim;
|
|
|
|
_data.reserve(ydim * xdim);
|
2019-10-02 02:47:16 -04:00
|
|
|
BOOST_ASSERT(_data.capacity() >= ydim * xdim);
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2019-10-03 03:44:27 -04:00
|
|
|
// Construct FileReader
|
2016-11-30 22:08:01 -05:00
|
|
|
storage::io::FileReader file_reader(filepath, storage::io::FileReader::HasNoFingerprint);
|
2019-10-03 03:44:27 -04:00
|
|
|
std::string buf;
|
|
|
|
buf.resize(xdim * 11); // INT32_MAX = 2147483647 = 10 chars + 1 white space = 11
|
|
|
|
BOOST_ASSERT(buf.size() >= xdim * 11);
|
|
|
|
|
|
|
|
for (unsigned int y = 0 ; y < ydim ; y++) {
|
|
|
|
// read one line from file.
|
|
|
|
file_reader.ReadLine(&buf[0], xdim * 11);
|
|
|
|
boost::algorithm::trim(buf);
|
|
|
|
|
|
|
|
std::vector<std::string> result;
|
|
|
|
std::string delim (" ");
|
|
|
|
//boost::split(result, buf, boost::is_any_of(delim), boost::algorithm::token_compress_on);
|
|
|
|
boost::split(result, buf, boost::is_any_of(delim));
|
|
|
|
unsigned int x = 0;
|
|
|
|
BOOST_FOREACH(std::string s, result) {
|
|
|
|
_data[(y * xdim) + x] = atoi(s.c_str());
|
|
|
|
++x;
|
|
|
|
}
|
|
|
|
BOOST_ASSERT(x == xdim);
|
|
|
|
}
|
|
|
|
/*
|
2015-05-29 20:28:29 -04:00
|
|
|
std::string buffer;
|
2017-04-08 07:37:54 -04:00
|
|
|
buffer.resize(file_reader.GetSize());
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
BOOST_ASSERT(buffer.size() > 1);
|
2016-11-30 22:08:01 -05:00
|
|
|
|
|
|
|
file_reader.ReadInto(&buffer[0], buffer.size());
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
boost::algorithm::trim(buffer);
|
|
|
|
|
|
|
|
auto itr = buffer.begin();
|
|
|
|
auto end = buffer.end();
|
|
|
|
|
|
|
|
bool r = false;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
r = boost::spirit::qi::parse(
|
|
|
|
itr, end, +boost::spirit::qi::int_ % +boost::spirit::qi::space, _data);
|
|
|
|
}
|
|
|
|
catch (std::exception const &ex)
|
|
|
|
{
|
2016-12-06 15:30:46 -05:00
|
|
|
throw util::exception("Failed to read from raster source " + filepath.string() + ": " +
|
|
|
|
ex.what() + SOURCE_REF);
|
2015-05-29 20:28:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!r || itr != end)
|
|
|
|
{
|
2016-12-06 15:30:46 -05:00
|
|
|
throw util::exception("Failed to parse raster source: " + filepath.string() +
|
|
|
|
SOURCE_REF);
|
2015-05-29 20:28:29 -04:00
|
|
|
}
|
2019-10-03 03:44:27 -04:00
|
|
|
*/
|
2015-05-29 20:28:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
RasterGrid(const RasterGrid &) = default;
|
|
|
|
RasterGrid &operator=(const RasterGrid &) = default;
|
|
|
|
|
|
|
|
RasterGrid(RasterGrid &&) = default;
|
|
|
|
RasterGrid &operator=(RasterGrid &&) = default;
|
|
|
|
|
|
|
|
std::int32_t operator()(std::size_t x, std::size_t y) { return _data[y * xdim + x]; }
|
|
|
|
std::int32_t operator()(std::size_t x, std::size_t y) const { return _data[(y)*xdim + (x)]; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::vector<std::int32_t> _data;
|
|
|
|
std::size_t xdim, ydim;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
\brief Stores raster source data in memory and provides lookup functions.
|
|
|
|
*/
|
|
|
|
class RasterSource
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
const float xstep;
|
|
|
|
const float ystep;
|
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
float CalcSize(int min, int max, std::size_t count) const;
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
public:
|
|
|
|
RasterGrid raster_data;
|
|
|
|
|
|
|
|
const std::size_t width;
|
|
|
|
const std::size_t height;
|
|
|
|
const int xmin;
|
|
|
|
const int xmax;
|
|
|
|
const int ymin;
|
|
|
|
const int ymax;
|
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
RasterDatum GetRasterData(const int lon, const int lat) const;
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
RasterDatum GetRasterInterpolate(const int lon, const int lat) const;
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
RasterSource(RasterGrid _raster_data,
|
|
|
|
std::size_t width,
|
|
|
|
std::size_t height,
|
|
|
|
int _xmin,
|
|
|
|
int _xmax,
|
|
|
|
int _ymin,
|
|
|
|
int _ymax);
|
|
|
|
};
|
|
|
|
|
2017-05-18 08:27:28 -04:00
|
|
|
class RasterContainer
|
2015-05-29 20:28:29 -04:00
|
|
|
{
|
|
|
|
public:
|
2017-05-18 08:27:28 -04:00
|
|
|
RasterContainer() = default;
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
int LoadRasterSource(const std::string &path_string,
|
2015-05-29 20:28:29 -04:00
|
|
|
double xmin,
|
|
|
|
double xmax,
|
|
|
|
double ymin,
|
|
|
|
double ymax,
|
|
|
|
std::size_t nrows,
|
|
|
|
std::size_t ncols);
|
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
RasterDatum GetRasterDataFromSource(unsigned int source_id, double lon, double lat);
|
2015-05-29 20:28:29 -04:00
|
|
|
|
2016-04-28 18:26:13 -04:00
|
|
|
RasterDatum GetRasterInterpolateFromSource(unsigned int source_id, double lon, double lat);
|
2015-05-29 20:28:29 -04:00
|
|
|
|
|
|
|
private:
|
2019-10-03 03:44:27 -04:00
|
|
|
static std::vector<RasterSource> LoadedSources;
|
|
|
|
static std::unordered_map<std::string, int> LoadedSourcePaths;
|
2015-05-29 20:28:29 -04:00
|
|
|
};
|
2016-01-05 10:51:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-29 20:28:29 -04:00
|
|
|
#endif /* RASTER_SOURCE_HPP */
|