【JTS -- 空間數據處理】--計算兩個幾何圖形的關係

當前需求是需要爲建圖算法建立評價指標,比如精準率和召回率指標,這兩個指標如何計算在此不細說了,其中主要用到了JTS做空間關係計算。

差分出兩份OSM 文件中同一個Way節點之間的重合的Node部分,多餘的部分和空缺的部分;
用到了JTS 中的 buffer 和 intersection來做

兩個Way也就是兩個LINESTRING ,但並不是所有Node經緯度完全相同的Linestring, 而是兩條在一定閾值內重合的Linestring,所以這裏通過buffer在擴大閾值的範圍

buffer:

一條linestring經過buffer之後某種意義上變成一個ploygon,下面藍色的線經過buffer之後成爲了這個樣子,如此就可以判斷兩條在一定閾值內重合的線,實質上是擴大了一條線的範圍,然後再求buffer這個ploygon與另外一條linestring有無交集。
在這裏插入圖片描述

常見的關係:

在這裏插入圖片描述

Demo

計算出預測線與實際線再閾值爲1的情況下重合的部分:
在這裏插入圖片描述

    @Test
    public void contextLoads() throws ParseException {
        // 創建g1-預測值
        Geometry g1 = new WKTReader().read("LINESTRING (0 0, 2 3, 3 2.5, 5 4, 6 3)");
        System.out.println("Geometry 1: " + g1);

        // 創建g2-實際值  
        Geometry g2 = new WKTReader().read("LINESTRING (1 1, 2 2, 3 1, 5 3, 6 2, 8 3)");
        System.out.println("Geometry 2: " + g2);

        Geometry buffer = g1.buffer(1);
        // 重合的部分
        Geometry g1_g2 = buffer.intersection(g2);
        System.out.println("G1 intersection G2: " + g1_g2);

        // g2- g1_g2
        Geometry difference_addLine = g2.difference(g1_g2);
        System.out.println("G2 difference g1_g2: " + difference_addLine);

        //計算兩條線的交集
        Geometry g3 = g1.intersection(g2);
        System.out.println("G1 intersection G2: " + g3);
    }

輸出結果:

Geometry 1: LINESTRING (0 0, 2 3, 3 2.5, 5 4, 6 3)
Geometry 2: LINESTRING (1 1, 2 2, 3 1, 5 3, 6 2, 8 3)
G1 intersection G2: MULTILINESTRING ((1 1, 2 2, 2.321110255092798 1.6788897449072022), (4 1.9999999999999998, 5 3, 6 2), (6 2, 6.791532493266639 2.3957662466333196))
G1 difference g1_g2: MULTILINESTRING ((0 0, 0.2390229155277314 0.3585343732915971), (2.8284271247461903 2.585786437626905, 3 2.5, 3.3431457505076203 2.7573593128807152))
G2 difference g1_g2: MULTILINESTRING ((2 2, 3 1, 5 3), (6.791532493266639 2.3957662466333196, 8 3))
G1 intersection G2: LINESTRING EMPTY
發佈了279 篇原創文章 · 獲贊 246 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章