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") } }