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