(十五)GeoSpark源碼解析(四)

GeoSpark源碼解析(四)

上節(jié)我們講了GeoSpark如何根據(jù)已經(jīng)分好的格網(wǎng)(Grid)來進行分塊(partition)操作毒姨。對于GeoSpark來說搂鲫,格網(wǎng)的生成算法實際上是決定了并行計算的關鍵,在上一節(jié)中同窘,我們講到了SpatialRDDspatialPartitioning方法,他需要一個SpatialPartitioner類型的參數(shù),這個參數(shù)有三種類型:

image.png

這三種SpatialPartitioner其實是在public void spatialPartitioning(GridType gridType, int numPartitions)這個函數(shù)中構造的讼庇。我們先看下GridType

public enum GridType{
    /**
     * The equalgrid.
     */
    EQUALGRID,
    /**
     * The hilbert.
     */
    HILBERT,
    /**
     * The rtree.
     */
    RTREE,
    /**
     * The voronoi.
     */
    VORONOI,
    /**
     * The voronoi.
     */
    QUADTREE,
    /**
     * K-D-B-tree (k-dimensional B-tree)
     */
    KDBTREE;
}

代碼中共有6種,我們分別介紹下:

  1. EQUALGRID近尚,這個我們從名字上就可以看出他是等分蠕啄,就是等分為多少行多少列。
  public EqualPartitioning(Envelope boundary, int partitions)
       {
           //Local variable should be declared here
           Double root = Math.sqrt(partitions);
           int partitionsAxis;
           double intervalX;
           double intervalY;
   
           //Calculate how many bounds should be on each axis
           partitionsAxis = root.intValue();
           intervalX = (boundary.getMaxX() - boundary.getMinX()) / partitionsAxis;
           intervalY = (boundary.getMaxY() - boundary.getMinY()) / partitionsAxis;
           //System.out.println("Boundary: "+boundary+"root: "+root+" interval: "+intervalX+","+intervalY);
           for (int i = 0; i < partitionsAxis; i++) {
               for (int j = 0; j < partitionsAxis; j++) {
                   Envelope grid = new Envelope(boundary.getMinX() + intervalX * i, boundary.getMinX() + intervalX * (i + 1), boundary.getMinY() + intervalY * j, boundary.getMinY() + intervalY * (j + 1));
                   //System.out.println("Grid: "+grid);
                   grids.add(grid);
               }
               //System.out.println("Finish one column/one certain x");
           }
       }

代碼的第11戈锻、12行首先根據(jù)要分塊的長寬計算X歼跟、Y間隔,然后第14格遭、15行for循環(huán)遍歷生成網(wǎng)格。

  1. HILBERT:Hilbert其實是最近很流行的一種新型NoSQL空間索引拒迅,就是利用這個算法生成key-Value格式的空間索引骚秦,存儲在HBase、Accumulo等分布式非關系型數(shù)據(jù)庫中坪它,目前LocationTech下的GeoWave骤竹、GeoMesa就是采用了這個思路。
  2. RTREE往毡,下面這張圖很好的展示R樹的工作原理蒙揣,其實就是對整個空間建立索引關系,加快搜索效率开瞭。然后GeoSpark是將RTree的最后一級葉子節(jié)點作為網(wǎng)格建立懒震。
image.png
  1. VORONOI,這個不了解嗤详。
  2. QUADTREE个扰,GIS中很經(jīng)典的一種索引算法,就是數(shù)據(jù)結構中的四叉樹葱色,其原理就是將一個空間每次四等分下去递宅,分到某個級別后停止。
  3. KDBTREE,這個我也不是特別理解办龄,感覺和RTREE大致上差不多的烘绽,可能具體針對特別的空間分布下的空間數(shù)據(jù)有相應的優(yōu)勢吧。
image.png

當Grid構建好之后俐填,就可以構造SpatialPartitioner安接,然后進行分塊操作。

    public void spatialPartitioning(GridType gridType, int numPartitions)
            throws Exception{
        //  省略部分代碼
        switch (gridType) {
            case EQUALGRID: {
                EqualPartitioning EqualPartitioning = new EqualPartitioning(paddedBoundary, numPartitions);
                grids = EqualPartitioning.getGrids();
                partitioner = new FlatGridPartitioner(grids);
                break;
            }
            case HILBERT: {
                HilbertPartitioning hilbertPartitioning = new HilbertPartitioning(samples, paddedBoundary, numPartitions);
                grids = hilbertPartitioning.getGrids();
                partitioner = new FlatGridPartitioner(grids);
                break;
            }
            case RTREE: {
                RtreePartitioning rtreePartitioning = new RtreePartitioning(samples, numPartitions);
                grids = rtreePartitioning.getGrids();
                partitioner = new FlatGridPartitioner(grids);
                break;
            }
            case VORONOI: {
                VoronoiPartitioning voronoiPartitioning = new VoronoiPartitioning(samples, numPartitions);
                grids = voronoiPartitioning.getGrids();
                partitioner = new FlatGridPartitioner(grids);
                break;
            }
            case QUADTREE: {
                QuadtreePartitioning quadtreePartitioning = new QuadtreePartitioning(samples, paddedBoundary, numPartitions);
                partitionTree = quadtreePartitioning.getPartitionTree();
                partitioner = new QuadTreePartitioner(partitionTree);
                break;
            }
            case KDBTREE: {
                final KDBTree tree = new KDBTree(samples.size() / numPartitions, numPartitions, paddedBoundary);
                for (final Envelope sample : samples) {
                    tree.insert(sample);
                tree.assignLeafIds();
                partitioner = new KDBTreePartitioner(tree);
                break;
            }
        }
        this.spatialPartitionedRDD = partition(partitioner);
    }

到這里英融,基本上GeoSpark基本代碼就介紹完了盏檐,也算是對前期自己工作的一個總結,后續(xù)根據(jù)時間驶悟、項目再來進行探討胡野。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撩银,隨后出現(xiàn)的幾起案子给涕,更是在濱河造成了極大的恐慌,老刑警劉巖额获,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件够庙,死亡現(xiàn)場離奇詭異,居然都是意外死亡抄邀,警方通過查閱死者的電腦和手機耘眨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境肾,“玉大人剔难,你說我怎么就攤上這事“掠鳎” “怎么了偶宫?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長环鲤。 經(jīng)常有香客問我纯趋,道長,這世上最難降的妖魔是什么冷离? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任吵冒,我火速辦了婚禮,結果婚禮上西剥,老公的妹妹穿的比我還像新娘痹栖。我一直安慰自己,他們只是感情好瞭空,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布揪阿。 她就那樣靜靜地躺著疗我,像睡著了一般。 火紅的嫁衣襯著肌膚如雪南捂。 梳的紋絲不亂的頭發(fā)上碍粥,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音黑毅,去河邊找鬼。 笑死钦讳,一個胖子當著我的面吹牛矿瘦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愿卒,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缚去,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琼开?” 一聲冷哼從身側響起易结,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柜候,沒想到半個月后搞动,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡渣刷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年鹦肿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅柴。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡箩溃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碌嘀,到底是詐尸還是另有隱情涣旨,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布股冗,位于F島的核電站霹陡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏魁瞪。R本人自食惡果不足惜穆律,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望导俘。 院中可真熱鬧峦耘,春花似錦、人聲如沸旅薄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洛口,卻和暖如春矫付,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背第焰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工买优, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挺举。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓杀赢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湘纵。 傳聞我的和親對象是個殘疾皇子脂崔,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345