當前需求是需要爲建圖算法建立評價指標,比如精準率和召回率指標,這兩個指標如何計算在此不細說了,其中主要用到了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