Refactored access to NASA data
This commit is contained in:
parent
53d87eb9be
commit
1741ce7ec9
106
Util/NASAGridSquare.cpp
Normal file
106
Util/NASAGridSquare.cpp
Normal file
@ -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<<setfill('0')
|
||||
<< ROOT_PATH
|
||||
<< "/"
|
||||
<<NS
|
||||
<<setw(2)<<abs(latitude)<<setw(0)
|
||||
<<EW
|
||||
<<setw(3)<<abs(longitude)<<setw(0)
|
||||
<<'.'<<ext;
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
void NasaGridSquare::load(const char* filename) {
|
||||
const std::string gzipfile =std::string(filename)+".zip";
|
||||
std::cout << "testing for zipped file " << gzipfile << std::endl;
|
||||
if(exists(gzipfile.c_str())) {
|
||||
std::cout << gzipfile << " exists" << std::endl;
|
||||
}
|
||||
int errorcode = 0;
|
||||
int errorcode2 = 0;
|
||||
zip * test = zip_open(gzipfile.c_str(), 0, &errorcode);
|
||||
if(errorcode) {
|
||||
char buffer[1024];
|
||||
zip_error_to_str(buffer, 1024, errorcode, errno);
|
||||
ERR("Error occured opening zipfile " << filename << ", error: " << buffer);
|
||||
//TODO: Load from URL
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned entries = zip_get_num_files(test);
|
||||
INFO("File has " << entries << " entries");
|
||||
struct zip_stat stat;
|
||||
zip_stat_index(test, 0, 0, &stat);
|
||||
INFO("included: " << stat.name);
|
||||
INFO("uncompressed: " << stat.size);
|
||||
INFO("compressed: " << stat.comp_size);
|
||||
num_bytes = stat.size;
|
||||
DELETE(elevationMap);
|
||||
elevationMap = new char[stat.size];
|
||||
|
||||
zip_file * file = zip_fopen_index(test, 0, 0 );
|
||||
zip_file_error_get(file, &errorcode, &errorcode2);
|
||||
zip_fread(file, elevationMap, stat.size);
|
||||
zip_fclose(file);
|
||||
zip_close(test);
|
||||
|
||||
}
|
||||
|
||||
bool NasaGridSquare::lngLat_to_colRow(float lng_fraction, float lat_fraction, unsigned int& col, unsigned int& row) const {
|
||||
col = int( 0.5 + lng_fraction * float(numCols-1) );
|
||||
row = numRows-1 - int( 0.5 + lat_fraction * float(numRows-1) );
|
||||
return( col<numCols && row<numRows );
|
||||
}
|
||||
|
||||
NasaGridSquare::NasaGridSquare(int lng, int lat, std::string & _rp) : ROOT_PATH(_rp), elevationMap(NULL), longitude(lng), latitude(lat), num_bytes(0), numRows(1), numCols(1) {
|
||||
std::string filename =make_filename("hgt");
|
||||
std::cout << "Loading " << filename << std::endl;
|
||||
load(filename.c_str());
|
||||
if(hasData())
|
||||
numRows=numCols=std::sqrt(num_bytes/2);
|
||||
}
|
||||
|
||||
short NasaGridSquare::getHeight(float lng_fraction, float lat_fraction) const {
|
||||
if(!hasData())
|
||||
return NO_DATA;
|
||||
unsigned int col,row;
|
||||
if(!lngLat_to_colRow(lng_fraction,lat_fraction, col,row))
|
||||
return NO_DATA;
|
||||
if(col>=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;
|
||||
}
|
70
Util/NASAGridSquare.h
Normal file
70
Util/NASAGridSquare.h
Normal file
@ -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 <cmath>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <zip.h>
|
||||
|
||||
|
||||
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
|
87
Util/SRTMLookup.h
Normal file
87
Util/SRTMLookup.h
Normal file
@ -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<NasaGridSquare> g();
|
||||
* cout << g.height(lng,lat) << endl;
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef SRTMLOOKUP_H
|
||||
#define SRTMLOOKUP_H
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
|
||||
#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<NasaGridSquare*> cache;
|
||||
static const int MAX_CACHE_SIZE = 250;
|
||||
std::string ROOT_PATH;
|
||||
};
|
||||
|
||||
#endif // SRTMLOOKUP_H
|
Loading…
Reference in New Issue
Block a user