00001 #ifndef __TerrainDatabase__
00002 #define __TerrainDatabase__
00003
00004 #include <string>
00005 #include <sstream>
00006 #include <sys/stat.h>
00007
00008 #include "Log.h"
00009
00010 #include <assert.h>
00011 #include "GeoToUTM.h"
00012
00013
00014
00015 class Point2d
00016 {
00017 public:
00018 int x, y;
00019
00020 Point2d(int _x, int _y);
00021 bool Valid();
00022 };
00023
00024
00025
00026 class TileData;
00027 class Tile;
00028
00029
00030 class TerrainDatabase
00031 {
00032 public:
00033 void LLToXY(double lat, double longi, double& x, double& y);
00034 void XYToLL(double& lat, double& longi, double x, double y);
00035 double x0, y0, x1, y1;
00036 double pixelSize;
00037 int width, height;
00038 int imageSize, tileSize;
00039 int lods;
00040 std::string databaseFolder;
00041
00042 TerrainDatabase(std::string _databaseFolder="TerrainDatabase");
00043
00044 virtual bool LoadHeightmap(Tile* tile);
00045 virtual bool LoadBitmap(Tile* tile);
00046
00047 void SetBounds(double _x0, double _y0, int _width, int _height, int _tileSize=65, int _imageSize=512, double _pixelSize=1);
00048 int GetLocalLOD(double x, double y, int minLOD=1);
00049 std::string TileName(int x, int y, int lod=1);
00050 std::string TileName(TileData* tileData);
00051 Point2d GetPosition(double x, double y);
00052 float GetTileSize(int lod=1);
00053 bool Save(Tile* tile);
00054 bool SaveOutline(Tile* tile);
00055 std::string GetFilePath(Tile* tile);
00056 bool Load(Tile* tile);
00057
00058 bool Valid(double x, double y) { return (x>=x0 && x<=x1 && y>=y0 && y<=y1); }
00059
00060 bool FindTileAtPoint(int x, int y, int lod=1)
00061 {
00062 int size=tileSize*LODMultiplier(lod);
00063 return FindTile(x/size, y/size, lod);
00064 };
00065
00066
00067 bool FindTile(int x, int y, int lod=1)
00068 {
00069 return FileExists("./"+databaseFolder+"/"+TileName(x, y, lod));
00070 }
00071
00072
00073 inline int LODMultiplier(int _lod)
00074 {
00075 int mul=1;
00076 while (--_lod>0)
00077 mul*=2;
00078 return mul;
00079 }
00080
00081 int GetUniqueIndex(int lod, int x, int y)
00082 {
00083 int true_lod = lods - 1 - lod;
00084 assert ( lod>= 1 && lod <= lods);
00085 assert( x <= true_lod && y <= true_lod);
00086
00087 int c_idx = 0;
00088 for(int i = 1; i < lod ; ++i)
00089 {
00090 int iwid = 1 << (lods-i);
00091 c_idx += iwid*iwid;
00092 }
00093
00094 int iwid = 1 << (lods-lod);
00095 c_idx += (y * iwid +x );
00096
00097 return c_idx;
00098
00099 }
00100
00101 protected:
00102 Log myLog;
00103 STMCoorz m_tmorigin;
00104
00105
00106 bool FileExists(std::string filename)
00107 {
00108 struct stat stFileInfo;
00109 return (stat(filename.c_str(), &stFileInfo)==0);
00110 }
00111
00112
00113 };
00114
00115 #endif