1. 程式人生 > >ArcGIS for qml -測距

ArcGIS for qml -測距

 

這個功能主要實現滑鼠在地圖上點選兩點進行測距。

在ArcGIS for qml中是沒有直接封裝好的測距模組的,檢視文件可以看見:

文件明確說明,不能在QML中宣告或建立Distance元件

1.確認所需

實現測距功能,首先還是明確需求,利用滑鼠點選進行測距,點選第一次確定起始點,第二次確定終點,終點確定,距離路徑出現,隨之距離顯示出來。

由此可知,需要兩個點一條路徑一個文字

2.佈局

(1)地圖測距,地基肯定是地圖底圖,MapView{ Map{ } }

(2)要在地圖上新增點以及路徑,需要符號,所以需要圖層來承載 GraphicsOverlay{ Graphic{ Symbol:}}

(3)顯示距離,需要一個Text固定位置顯示,在最上層 Text{ }

3.計算距離

(1)單位

檢視文件中對Distance的說明,可以看的一個相關的型別叫liearUnit->例項或線性測量操作的特定測量單位

是從Unit型別繼承的型別例項被初始化為特定的度量單位每個例項都具有單元名稱的屬性(單數,複數和縮寫),並提供單位轉換的方法。

往上檢視linearUnit的父級可以看到

Unit是測量單位的基本型別,但是不允許在QML中進行宣告和建立。但是Unit下面的子型別有三個:LinearUnit(線性單位)AngularUnit(度量單位)AreaUnit(面積單位)都是可以在qml中宣告建立的。測距所需的肯定就是線性單位了。

(2)路徑線(Path)

關於線段,幾何圖形都得由polygon來建立,路徑是線段,所以選擇其中PolylineBuilder,至於如何生成隨機滑鼠點選的兩點之間的線呢

在文件中搜索Distance,可以得到6個型別結果

其中,有一個GeodeticDistanceResult 型別,距離結果,點開看發現不能在QMl中宣告建立,但是有一句話

所以點選藍色標註的地方,可以知道,幾何引擎提供一組方法以對幾何例項執行幾何操作,關於幾何的計算都可以在此找到。

有一個方法

返回點整合的線,所需引數都給出了,完全可以得到。這樣就得到了path,path是起始點和終點之間的點整合的路徑線,每個點之間的距離長度可以根據maxSedmentLength

進行自行設定。

(3)計算

目前我們所需的就是如何得到地面距離長度,依然在幾何引擎中找

所需要的引數依然很容易得到,所以可以完成功能了。

4.核心程式碼

 onMouseClicked: {
            clickNum++
            if(clickNum == 1){//滑鼠點選第一次 確實起點位置 並新增圖形
                console.log(clickNum)
                dis_startPoint = mouse.mapPoint
                //graphicsOverlayer.graphics.append(createGraphic(dis_startPoint,startMarkSymbol))
                var dis_start = GeometryEngine.project(dis_startPoint,spatialReference.createWgs84())
                dis_startGraphic.geometry = dis_start
                console.log(dis_startPoint)
            }
            if(clickNum == 2){//滑鼠點選第二次 確定終點位置 並新增圖形
                console.log(clickNum)
                clickNum = 0;
                dis_endPoint = mouse.mapPoint
                var dis_end = GeometryEngine.project(dis_endPoint,spatialReference.createWgs84())
                dis_endGraphic.geometry = dis_end
                console.log(dis_endPoint)
                //建立路徑線
                var polylineBuilder = ArcGISRuntimeEnvironment.createObject("PolylineBuilder", {spatialReference:SpatialReference.createWgs84()});
                polylineBuilder.addPoints([dis_startGraphic.geometry,dis_endGraphic.geometry])
                var polyline = polylineBuilder.geometry;

                //生成路徑線
                var maxSegmentLength = 1;
                var unitOfMeasurement = ArcGISRuntimeEnvironment.createObject("LinearUnit", {linearUnitId: Enums.LinearUnitIdKilometers});
                var curveType = Enums.GeodeticCurveTypeGeodesic;
                var pathGeometry = GeometryEngine.densifyGeodetic(polyline, maxSegmentLength, unitOfMeasurement, curveType);

                pathGraphic.geometry = pathGeometry;
                //計算距離
                distanceText = GeometryEngine.lengthGeodetic(pathGeometry,unitOfMeasurement,curveType).toFixed(2)
                console.log("polyline builded",distanceText_main + "km")
            }
        }