ArcGIS for JS 獲取兩條相交線的交點坐標信息


 1  /**
 2          * 獲取兩條相交線的交點坐標信息
 3          * @param {any} 線1
 4          * @param {any} 線2
 5          * @param {any} 回調函數
 6          */
 7         intersect: function (geometry_r1, geometry_r2, func) {
 8             var path1 = geometry_r1.paths[0];
 9             var path2 = geometry_r2.paths[0];
10             for (var i = 0; i < path1.length - 1; i++) {
11                 for (var j = 0; j < path2.length - 1; j++) {
12                     var a1 = path1[i][1] - path1[i + 1][1];
13                     var b1 = path1[i + 1][0] - path1[i][0];
14                     var c1 = a1 * path1[i + 1][0] + b1 * path1[i + 1][1];
15                     //轉換成一般式: Ax+By = C
16                     var a2 = path2[j][1] - path2[j + 1][1];
17                     var b2 = path2[j + 1][0] - path2[j][0];
18                     var c2 = a2 * path2[j + 1][0] + b2 * path2[j + 1][1];
19                     // 計算交點        
20                     var d = a1 * b2 - a2 * b1;
21                     // 當d==0時,兩線平行
22                     if (d == 0) {
23                         return false;
24                     } else {
25                         var x = (b2 * c1 - b1 * c2) / d;
26                         var y = (a1 * c2 - a2 * c1) / d;
27                         // 檢測交點是否在兩條線段上
28                         if ((isInBetween(path1[i + 1][0], x, path1[i][0]) || isInBetween(path1[i + 1][1], y, path1[i][1])) &&
29                             (isInBetween(path2[j + 1][0], x, path2[j][0]) || isInBetween(path2[j + 1][1], y, path2[j][1]))) {
30                             require(["esri/geometry/Point"], function (Point) {
31                                 var pt = new Point(x, y, map2dBase.map.spatialReference);
32                                 func(pt);
33                             });
34                         }
35                     }
36                 }
37                 //如果b在a和c之間,返回true
38                 //當a==b或者b==c時排除結果,返回false
39                 function isInBetween(a, b, c) {
40                     // 如果b幾乎等於a或c,返回false.為了避免浮點運行時兩值幾乎相等,但存在相差0.00000...0001的這種情況出現使用下面方式進行避免
41                     if ((Math.abs(a - b) > 0.000001 || Math.abs(b - c) > 0.000001) && ((b > a && b < c) || (b < a && b > c)) || (a == b || b == c)) {
42                         return true;
43                     } else {
44                         return false;
45                     }
46                 }
47             }
48         }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM