diff --git a/Util/NASAGridSquare.cpp b/Util/NASAGridSquare.cpp new file mode 100644 index 000000000..2d319e570 --- /dev/null +++ b/Util/NASAGridSquare.cpp @@ -0,0 +1,106 @@ +/* + open source routing machine + Copyright (C) Dennis Luxen, others 2010 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU AFFERO General Public License as published by +the Free Software Foundation; either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +or see http://www.gnu.org/licenses/agpl.txt. + */ + + +#include "NASAGridSquare.h" + +NasaGridSquare::~NasaGridSquare() { + DELETE(elevationMap); +} + +std::string NasaGridSquare::make_filename(const char* ext) const { + char EW =(longitude>=0 ? 'E' : 'W' ); + char NS =(latitude >=0 ? 'N' : 'S'); + std::stringstream ss; + ss<=numCols || row>=numRows) + return NO_DATA; + unsigned int i=( col + row * numCols ); + unsigned short datum2=((unsigned short*)elevationMap)[i]; + short result2=(datum2>>8 | datum2<<8); + return result2; +} diff --git a/Util/NASAGridSquare.h b/Util/NASAGridSquare.h new file mode 100644 index 000000000..53d0e9c9a --- /dev/null +++ b/Util/NASAGridSquare.h @@ -0,0 +1,70 @@ +/* + open source routing machine + Copyright (C) Dennis Luxen, others 2010 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU AFFERO General Public License as published by +the Free Software Foundation; either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +or see http://www.gnu.org/licenses/agpl.txt. + */ + + +#ifndef NASA_GRID_SQUARE_H +#define NASA_GRID_SQUARE_H + +#include "ProjectionUtils.h" +#include "../typedefs.h" + +#include +#include +#include +#include +#include +#include +#include +#include + + +class NasaGridSquare { +public: + const static short NO_DATA =-32768; ///< NASA's magic number for no data. + + NasaGridSquare(int lng, int lat, std::string & _rp); + ~NasaGridSquare(); + short getHeight(float lng_fraction, float lat_fraction) const; + bool hasData() const {return bool(elevationMap != NULL);} + +private: + std::string ROOT_PATH; + char * elevationMap; + int longitude; + int latitude; + unsigned int num_bytes; ///< Length of data. + unsigned int numRows; + unsigned int numCols; + + std::string make_filename(const char* ext) const; + + /** Loads the file into memory, pointed to by 'data'. Sets num_bytes. */ + void load(const char* filename); + /** Converts lng,lat floats to col,row ints. Returns TRUE if result valid. */ + bool lngLat_to_colRow(float lng_fraction, float lat_fraction, unsigned int& col, unsigned int& row) const; + + inline bool exists(const char* path) { + std::ifstream ifile(path); + return ifile; + } + +}; + +#endif // NASA_GRID_SQUARE_H diff --git a/Util/SRTMLookup.h b/Util/SRTMLookup.h new file mode 100644 index 000000000..92146cdcf --- /dev/null +++ b/Util/SRTMLookup.h @@ -0,0 +1,87 @@ +/* + open source routing machine + Copyright (C) Dennis Luxen, others 2010 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU AFFERO General Public License as published by +the Free Software Foundation; either version 3 of the License, or +any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +or see http://www.gnu.org/licenses/agpl.txt. + + ** Interface to the GridSquares. Template parameter determines which kind of + * raw data is used (NASA, or reduced). GridSquare data is globally cached, so + * that many queries can be answered without having to constantly mmap & unmmap + * the data files. + * + * Typical usage: + * + * Grid g(); + * cout << g.height(lng,lat) << endl; + * + */ + +#ifndef SRTMLOOKUP_H +#define SRTMLOOKUP_H + +#include +#include + +#include "NASAGridSquare.h" +#include "../DataStructures/LRUCache.h" + +class SRTMLookup { +public: + + SRTMLookup(std::string & _rp) : cache(MAX_CACHE_SIZE), ROOT_PATH(_rp) { + // Double check that this compiler truncates towards zero. + assert(-1 == int(float(-1.9))); + } + + /** Returns the height above sea level for the given lat/lng. */ + short height(const float longitude, const float latitude) { + if(0 == ROOT_PATH.size()) + return 0; + int lng,lat; + float lng_fraction,lat_fraction; + split(longitude,lng,lng_fraction); + split(latitude ,lat,lat_fraction); + + int k = key(lng,lat); + if(!cache.Holds(k)) { + cache.Insert(k , new NasaGridSquare(lng,lat, ROOT_PATH)); + } + NasaGridSquare * result; + cache.Fetch(k, result); + return result->getHeight(lng_fraction,lat_fraction); + } + +private: + /** Split a floating point number (num) into integer (i) & fraction (f) + * components. */ + inline void split(float num, int& i, float& f) const { + if(num>=0.0) + i=int(num); + else + i=int(num)-1; + f=num-float(i); + } + + /** Formula for grid squares' unique keys. */ + int key(int lng, int lat) { + return 1000*lat + lng; + } + LRUCache cache; + static const int MAX_CACHE_SIZE = 250; + std::string ROOT_PATH; +}; + +#endif // SRTMLOOKUP_H