arcgis jsapi介面入門系列(5):幾何(點線面)基本操作
阿新 • • 發佈:2018-11-29
點
point: function () { //通過wkt生成點 //wkt,代表點的座標 let wkt = "POINT(113.566806 22.22445)"; //wkt轉點幾何物件 // * @param apiInstance api // * @param wkt wkt // * @param sr 空間參考 let point = mapUtil.geometry.wktToPoint(this.apiInstance, wkt, this.mapView.spatialReference); //通過座標生成點,座標格式是arcgis jsapi的標準,詳情可看官方文件 let coord = [113.566806, 22.22445]; // * @param apiInstance api // * @param wkt wkt // * @param sr 空間參考 point = mapUtil.geometry.coordToPoint(this.apiInstance, coord, this.mapView.spatialReference); //點轉wkt wkt = mapUtil.geometry.pointToWkt(point); //獲取點座標 let x = point.x; let y = point.y; },
線
polyline: function () { //通過wkt生成線 //wkt,代表線的座標 let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)"; // * @param apiInstance api // * @param wkt wkt // * @param sr 空間參考 let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference); //通過座標生成線,座標格式是arcgis jsapi的標準,詳情可看官方文件 let coord = [[[113.545949, 22.24015749], [113.56989, 22.24916], [113.55324, 22.220588]]]; // * @param apiInstance api // * @param coord 座標物件,格式如:[[[113.545949, 22.24015749], [113.56989, 22.24916], [113.55324, 22.220588]]] // * @param sr 空間參考 polyline = mapUtil.geometry.coordToPolyline(this.apiInstance, coord, this.mapView.spatialReference); //線轉wkt wkt = mapUtil.geometry.polylineToWkt(polyline); //幾何物件是否幾何正確的檢查與修復 //線和麵(點不會)存在幾何錯誤的情況,當有幾何錯誤,幾何物件的某些操作會出錯,jsapi提供檢查是否有幾何錯誤的isSimple方法以及解決幾何錯誤的simplify方法 if (this.apiInstance.geometryEngine.isSimple(polyline) === false) { polyline = this.apiInstance.geometryEngine.simplify(polyline); } //遍歷線的所有點的座標 //paths指線的“路徑”,一條線可以有多條路徑,但我們使用大多數情況都只有一條路徑 let path = polyline.paths[0]; //遍歷一條路徑的所有點座標 for (let i = 0; i < path.length; i++) { //獲取點座標 let pointCoord = path[i]; let x = pointCoord[0]; let y = pointCoord[1]; //獲取點物件 let pointLine = polyline.getPoint(0, i); } //獲取線的起點和終點(假設只有一個path) let pointStart = polyline.getPoint(0, 0); let pointEnd = polyline.getPoint(0, polyline.paths[0].length - 1); //獲取線長度 //jsapi提供兩個獲取長度的方法,大意是如果幾何物件的座標系是地理座標系,例如wgs84,那就用geodesicLength,如果是平面座標系,就用planarLength //引數2是計算的長度的單位,可以有這些值:meters | feet | kilometers | miles | nautical-miles | yards let length1 = this.apiInstance.geometryEngine.geodesicLength(polyline, "meters"); //PS:因為測試資料是wgs84,所以把planarLength遮蔽了,其實不是無效程式碼 // let length2 = this.apiInstance.geometryEngine.planarLength(polyline, "meters"); //幾何物件的範圍 let extent = polyline.extent; },
面
polygon: function () { //通過wkt生成面 let wkt = "POLYGON((113.527839 22.27028,113.527238 22.2557786,113.5437178 22.2597268,113.54423 22.2730306,113.527839 22.27028))"; // * @param apiInstance api // * @param wkt wkt // * @param sr 空間參考 let polygon = mapUtil.geometry.wktToPolygon(this.apiInstance, wkt, this.mapView.spatialReference); //通過座標生成面,座標格式是arcgis jsapi的標準,詳情可看官方文件 let coord = [[[113.527839, 22.27028], [113.527238, 22.2557786], [113.5437178, 22.2597268], [113.54423, 22.2730306], [113.527839, 22.27028]]]; // * @param apiInstance api // * @param coord 座標物件 格式是arcgis jsapi標準,例如:[[[113.527839, 22.27028], [113.527238, 22.2557786], [113.5437178, 22.2597268], [113.54423, 22.2730306], [113.527839, 22.27028]]] // * @param sr 空間參考 polygon = mapUtil.geometry.coordToPolygon(this.apiInstance, coord, this.mapView.spatialReference); //面轉wkt wkt = mapUtil.geometry.polygonToWkt(polygon); //幾何物件是否幾何正確的檢查與修復 //線和麵(點不會)存在幾何錯誤的情況,當有幾何錯誤,幾何物件的某些操作會出錯,jsapi提供檢查是否有幾何錯誤的isSimple方法以及解決幾何錯誤的simplify方法 if (this.apiInstance.geometryEngine.isSimple(polygon) === false) { polygon = this.apiInstance.geometryEngine.simplify(polygon); } //遍歷面的所有點的座標 //rings指面的“路徑”,一條面對象可以有多個面,但我們使用大多數情況都只有一個面 let ring = polygon.rings[0]; //遍歷一個面的所有點座標 for (let i = 0; i < ring.length; i++) { //獲取點座標 let pointCoord = ring[i]; let x = pointCoord[0]; let y = pointCoord[1]; //獲取點物件 let pointLine = polygon.getPoint(0, i); } //獲取面的周長 //jsapi提供兩個獲取長度的方法,大意是如果幾何物件的座標系是地理座標系,例如wgs84,那就用geodesicLength,如果是平面座標系,就用planarLength //引數2是計算的長度的單位,可以有這些值:meters | feet | kilometers | miles | nautical-miles | yards let length1 = this.apiInstance.geometryEngine.geodesicLength(polygon, "meters"); //PS:因為測試資料是wgs84,所以把planarLength遮蔽了,其實不是無效程式碼 // let length2 = this.apiInstance.geometryEngine.planarLength(polygon, "meters"); //獲取面積也是兩個方法,也是geodesicArea和planarArea,情況和獲取長度的相同 //引數2是計算的面積的單位,可以有這些值:acres | ares | hectares | square-feet | square-meters | square-yards | square-kilometers | square-miles //PS:計算面積前要先檢查是否有幾何錯誤,目前已知有幾何錯誤會導致面積計算不準確 let area1 = this.apiInstance.geometryEngine.geodesicArea(polygon, "square-meters"); // let area2 = this.apiInstance.geometryEngine.planarArea(polygon, "square-meters"); //獲取面是否自相交 let isSelfIntersecting = polygon.isSelfIntersecting; //獲取面的幾何中心點 let pointCenter = polygon.centroid; //幾何物件的範圍 let extent = polygon.extent; //把extent轉面 //PS:extent是矩形,也屬於面(多邊形),因此邏輯上可以單向轉換 let polygon2 = this.apiInstance.Polygon.fromExtent(extent); },
extent(範圍,矩形,envelope)
extent: function () {
//先生成任意矩形,作為測試資料
let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)";
let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference);
let extent = polyline.extent;
//矩形4個角的座標
let xmax = extent.xmax;
let xmin = extent.xmin;
let ymax = extent.ymax;
let ymin = extent.ymin;
//矩形的寬高
let width = extent.width;
let height = extent.height;
//矩形中心點
let centerPoint = extent.center;
let point1 = mapUtil.geometry.xyToPoint(this.apiInstance, 113.545949, 22.24015749, this.mapView.spatialReference);
//把矩形移動到以某個點為中心點的位置
let extent3 = extent.centerAt(point1);
//把矩形按比例縮放,例如值為1.2即放到到原來的1.2倍
extent3 = extent.expand(1.2);
//生成矩形
let extent2 = new this.apiInstance.Extent({
xmin: -9177882,
ymin: 4246761,
xmax: -9176720,
ymax: 4247967,
spatialReference: this.mapView.spatialReference
});
},
幾何計算
geometryCalculate: function () {
//測試的線
let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)";
let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference);
//測試的面
wkt = "POLYGON((113.527839 22.27028,113.527238 22.2557786,113.5437178 22.2597268,113.54423 22.2730306,113.527839 22.27028))";
let polygon = mapUtil.geometry.wktToPolygon(this.apiInstance, wkt, this.mapView.spatialReference);
//以下只包含常用的幾何操作,其他操作請看官方文件的geometryEngine類的方法
//生成緩衝區
//引數1:生成緩衝區的幾何物件
//引數2:緩衝半徑
//引數3:緩衝半徑單位
//PS:關於單位。當幾何物件座標系為地理座標系時,如果單位用平面的座標系,例如米,會報錯,但是單位的選項沒有經緯度
//這情況可以傳null,官方文件說法是預設值就是幾何物件座標系的單位
let bufferPolygon = this.apiInstance.geometryEngine.buffer(polyline, 100, null);
//判斷兩個幾何物件是否重疊
//intersects關係是隻要有任意部分重疊就為true
let isIntersect = this.apiInstance.geometryEngine.intersects(polyline, bufferPolygon);
//獲取兩個幾何物件的重疊部分並輸出新的幾何物件
let intersectGeometry = this.apiInstance.geometryEngine.intersect(polygon, bufferPolygon);
//計算兩個幾何物件的距離
//引數3:距離的單位
let distance = this.apiInstance.geometryEngine.distance(polyline, bufferPolygon, null);
},