遙感圖像快速傳輸算法

遙感技術的飛速發展爲人們提供了大量的地球空間信息,然而製作地圖緩存即切圖過程本身是一項非常耗時的工作,按傳統的切緩存做法,存在着影像數據不能及時上線使用,即時效性差;切片製作過程頻繁、難以管理,需要強大的硬件支持;海量的切片數據容易造成磁盤碎片化等問題,因而如何解決瓦片碎片化問題是解決遙感圖像快速傳輸的關鍵。

  設想這樣的場景:如果空間上相鄰的瓦片在磁盤上的存儲也是相關的,那麼不僅能夠很好的解決磁盤碎片的問題,同時還可以降低對磁盤的seek,優化遙感影像的傳輸。衆所周知,Hilbert曲線是目前空間自相關性最好的空間填充曲線,如果以該曲線作爲索引對遙感瓦片進行索引,從而實現遙感瓦片的重組織。

  德國數學家David Hilbert發現了一種曲線,首先把一個正方形等分成四個小正方形,依次從西南角的正方形中心出發往北到西北正方形中心,再往東到東北角的正方形中心,再往南到東南角正方形中心,這是一次迭代,如果對四個小正方形繼續上述過程,往下劃分,反覆進行,最終就得到一條可以填滿整個正方形的曲線,這就是Hibert曲線,其大致過程如下圖所示:


                  Hibert曲線生成過程

實現步驟:

1、首先對遙感瓦片進行切片;

2、利用遊程編碼對瓦片進行壓縮處理;

3、利用Hilbert曲線進行瓦片重編碼;

3、根據編碼對瓦片進行線性化存儲,並在索引文件中記錄編碼位置;

部分實現代碼:

1、Hilbert編碼代碼:

[cpp] view plaincopy

  1. //rotate/flip a quadrant appropriately  

  2. void rot(int n, int *x, int *y, int rx, int ry) {  

  3.      if (ry == 0) {  

  4.           if (rx == 1) {  

  5.                *x = n - 1 - *x;  

  6.                *y = n - 1 - *y;  

  7.           }  

  8.           //Swap x and y  

  9.           int t = *x;  

  10.           *x = *y;  

  11.           *y = t;  

  12.      }  

  13. }  

  14.   

  15. int xy2d(int n, int x, int y) {  

  16.      int rx, ry, s, d = 0;  

  17.      for (s = n / 2; s>0; s /= 2) {  

  18.           rx = (x & s) > 0;  

  19.           ry = (y & s) > 0;  

  20.           d += s * s * ((3 * rx) ^ ry);  

  21.           rot(s, &x, &y, rx, ry);  

  22.      }  

  23.      return d;  

  24. }  

  25.   

  26. //convert d to (x,y)  

  27. void d2xy(int n, int d, int *x, int *y) {  

  28.      int rx, ry, s, t = d;  

  29.      *x = *y = 0;  

  30.      for (s = 1; s<n; s *= 2) {  

  31.           rx = 1 & (t / 2);  

  32.           ry = 1 & (t ^ rx);  

  33.           rot(s, x, y, rx, ry);  

  34.           *x += s * rx;  

  35.           *y += s * ry;  

  36.           t /= 4;  

  37.      }  

  38. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章