UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) • 14.5 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{__decorate as e}from"tslib";import t from"../../../../Graphic.js";import{createTask as a}from"../../../../core/asyncUtils.js";import{EsriPromise as i}from"../../../../core/Promise.js";import{throwIfAborted as r}from"../../../../core/promiseUtils.js";import{property as s,subclass as n}from"../../../../core/accessorSupport/decorators.js";import o from"../../../../geometry/Polygon.js";import l from"../../../../geometry/Polyline.js";import{load as c}from"../../../../geometry/projectionUtils.js";import u from"../../../../geometry/SpatialReference.js";import h from"../../../../layers/GraphicsLayer.js";import{convertSphereVertexToPixelLocation as m,convertPixelToHeadingPitch as d,convertHeadingPitchToSphereVertex as w}from"../../../../layers/orientedImagery/transformations/utils.js";import{getMeasurementProperties as p,getMeasurementPropertiesPanoramic as g,pixelAreaMeasurement2D as y,pixelAreaMeasurementPanoramic as v,pixelDistanceMeasurement2D as M,pixelDistanceMeasurementPanoramic as f,getPixelLocationFromSphereVertices as T,formatPixels as A,imageToImageTransform as V,imageToImageTransformPanoramic as k}from"../../imageMeasurementUtils.js";import{extractHorizonAnglesFromMedia as S}from"../../utils.js";import{SketchHandlerMixin as _}from"../../mixins/SketchHandlerMixin.js";import x from"../../../Sketch/SketchViewModel.js";let F=[],z=[],G=0,B=class extends(_(i)){constructor(e){super(e),this.type="measurement",this.measurementArray=[],this.pixelMeasurement=0,this.pixelAreaMeasurement=0,this.polygonVertices=[],this._calculationTask=null,this._distanceCalculation=0,this._areaCalculation=null}initialize(){this.addResolvingPromise(c())}async handleCreate(e){const t=e.toolEventInfo;switch(e.tool){case"polyline":await this.handlePolylineEvents(e,t);break;case"polygon":await this.handlePolygonEvents(e,t)}}handleDelete(e){this.resetDistanceMeasurements(),this.resetAreaMeasurements()}handleDestroy(){this.resetDistanceMeasurements(),this.resetAreaMeasurements()}async calculateAreaMeasurement(e,t,a){if(e.length<3||!this.viewModel.currentBestFeature||!this.viewModel.activeViewer?.imageSize||"none"===this.viewModel.mode)return null;const i="default"===t?await p(this.viewModel.currentBestFeature,this.viewModel.activeViewer?.imageSize,this.viewModel.footprintExtent):await g(this.viewModel.currentBestFeature,this.viewModel.activeViewer?.imageSize,this.viewModel.footprintExtent);return r(a),i?"default"===t?await y(e,i,!0):await v(e,i,!0,a):null}async calculateDistanceMeasurement(e,t,a){const{currentBestFeature:i,activeViewer:s}=this.viewModel;if(e.length<2||!i||!s?.imageSize||"none"===t)return null;const n="default"===t?await p(i,s?.imageSize,this.viewModel.footprintExtent):await g(i,s?.imageSize,this.viewModel.footprintExtent);return r(a),n?"default"===t?await M([e.at(0),e.at(-1)],n,!0):await f([e.at(0),e.at(-1)],n,!0):null}cursorUpdatePolylineHandler(e){const{mode:t,activeViewer:a}=this.viewModel;if("none"===t||!a?.imageSize)return;if("default"===t)this.measurementArray.push(e.coordinates);else{const t={x:e.coordinates[0],y:e.coordinates[1],z:e.coordinates[2]},i=m(t,a.imageSize[0],a.imageSize[1]);this.measurementArray.push([i.x,i.y])}const i=z.reduce((e,t)=>e+t,0)+this.pixelMeasurement;this.viewModel.distanceMeasurementResult=i}async cursorUpdatePolygonHandler(e){const{mode:t,activeViewer:a}=this.viewModel;if("none"===t||!a?.imageSize)return;const i=e.coordinates;if(F=[...this.polygonVertices],"default"===t)F.push(i);else{const e={x:i[0],y:i[1],z:i[2]},t=m(e,a?.imageSize[0],a?.imageSize[1]);F.push([t.x,t.y])}if(F.length<3||!this.viewModel.currentBestFeature||!this.viewModel.activeViewer?.imageSize)return;const r=F[0];F=F.filter((e,t)=>0===t||t===F.length-1||JSON.stringify(e)!==JSON.stringify(r));const s=await this._getAreaFromTask(F);s?.area&&s?.perimeter&&(G=s.area)}async handlePolylineEvents(e,t){const{currentBestFeature:a,activeViewer:i,mode:r,view:s}=this.viewModel,n=!this.viewModel.accuracyParametersMissing;if("cancel"===e.state)return this.resetDistanceMeasurements(),this.viewModel.distanceMeasurementResult=0,this.viewModel.distanceAccuracyArray=[],void(this.viewModel.displayNewMeasurementButton=!0);if("complete"===e.state&&e.graphic){if(this.viewModel.activeViewer?.addGraphic(e.graphic),this.viewModel.triangularMeasurementActive&&a){const t={pixels:e.graphic.geometry.paths[0],activeFeature:a,activeViewer:i,mode:r,spatialReference:s?.spatialReference};await(this.measurementService?.updateMeasurementVectorsArray(t)),await this._overlayFirstMeasurement(e.graphic,e.tool)}return this.viewModel.measurementGraphic=e.graphic,void this.resetDistanceMeasurements()}switch(t?.type){case"cursor-update":this.cursorUpdatePolylineHandler(t);break;case"vertex-add":if(this.measurementArray.length&&n){const e=await this._getAccuracyFromTask();e&&this.viewModel.distanceAccuracyArray.push(e)}this.vertexUpdatePolylineHandler()}const o=await this._getDistanceFromTask();this.pixelMeasurement=o??this.pixelMeasurement}async handlePolygonEvents(e,t){const{currentBestFeature:a,activeViewer:i,mode:r,view:s,accuracyParametersMissing:n}=this.viewModel;if("cancel"===e.state)return this.resetAreaMeasurements(),this.viewModel.areaMeasurementResult=0,this.viewModel.areaMeasurementAccuracy=0,void(this.viewModel.displayNewMeasurementButton=!0);if("complete"===e.state&&e.graphic){this.viewModel.activeViewer?.addGraphic(e.graphic);if(!n&&!this.viewModel.triangularMeasurementActive){const e=await this._getAreaAccuracyFromTask(this.polygonVertices);this.viewModel.areaMeasurementAccuracy=e||this.viewModel.areaMeasurementAccuracy}if(this.viewModel.triangularMeasurementActive&&a){const t={pixels:e.graphic.geometry.rings[0],activeFeature:a,activeViewer:i,mode:r,spatialReference:s?.spatialReference};await(this.measurementService?.updateMeasurementVectorsArray(t)),await this._overlayFirstMeasurement(e.graphic,e.tool)}return this.viewModel.measurementGraphic=e.graphic,void this.resetAreaMeasurements()}switch(t?.type){case"vertex-add":await this.vertexAddPolygonHandler(t);break;case"cursor-update":await this.cursorUpdatePolygonHandler(t)}this.viewModel.areaMeasurementResult=G>0?G:this.pixelAreaMeasurement}async vertexAddPolygonHandler(e){const{mode:t,activeViewer:a}=this.viewModel,i=e.added,r=i[i.length-1];if(!Array.isArray(r)||"none"===t||!a?.imageSize)return;if("default"===t)this.polygonVertices.push(r);else{const e={x:r[0],y:r[1],z:r[2]},t=m(e,a?.imageSize[0],a?.imageSize[1]);this.polygonVertices.push([t.x,t.y])}if(this.polygonVertices.length<3||!this.viewModel.currentBestFeature||!this.viewModel.activeViewer?.imageSize)return;const s=this.polygonVertices[0];this.polygonVertices=this.polygonVertices.filter((e,t)=>0===t||t===this.polygonVertices.length-1||JSON.stringify(e)!==JSON.stringify(s));const n=await this._getAreaFromTask(this.polygonVertices);if(!n?.area||!n?.perimeter)return;const{area:o}=n;this.pixelAreaMeasurement=o}vertexUpdatePolylineHandler(){this.measurementArray=this.measurementArray.slice(-1);const e=z.reduce((e,t)=>e+t,0)+this.pixelMeasurement;this.viewModel.distanceMeasurementResult=e,this.pixelMeasurement>0&&z.push(this.pixelMeasurement)}resetDistanceMeasurements(){this.measurementArray=[],this.pixelMeasurement=0,z=[]}resetAreaMeasurements(){this.polygonVertices=[],this.pixelAreaMeasurement=0,G=0}async _editOverlayedGraphics(e){this.viewModel.sketchTriangularGraphicsLayer||this._initializeSketchTriangularGraphicsLayer(),this.viewModel.sketchTriangularGraphicsLayer?.destroyed&&this._handleDestroyedTriangularSketchLayer(),this.viewModel.sketchTriangularGraphicsLayer.add(e),this.viewModel.sketchTriangular||(this._initializeSketchTriangular(),await this._loadTriangulatedMeasurementAdapter()),this._updateOverlayedGeometry(e)}_handleDestroyedTriangularSketchLayer(){this.viewModel.sketchTriangularGraphicsLayer&&this.viewModel.activeTriangulatedViewer&&(this.viewModel.activeTriangulatedViewer.imageRenderer.map.layers.remove(this.viewModel.sketchTriangularGraphicsLayer),this.viewModel.sketchTriangularGraphicsLayer=new h,this.viewModel.activeTriangulatedViewer.imageRenderer.map.layers.add(this.viewModel.sketchTriangularGraphicsLayer),this.viewModel.sketchTriangular&&(this.viewModel.sketchTriangular.layer=this.viewModel.sketchTriangularGraphicsLayer,this.viewModel.sketchTriangular.view=this.viewModel.activeTriangulatedViewer.imageRenderer))}_initializeSketchTriangular(){if(!this.viewModel.activeTriangulatedViewer)return;const e="panoramic"===this.viewModel.mode;this.viewModel.sketchTriangular=new x({view:this.viewModel.activeTriangulatedViewer.imageRenderer,layer:this.viewModel.sketchTriangularGraphicsLayer,updateOnGraphicClick:!1,defaultUpdateOptions:{toggleToolOnClick:!1,enableZ:!e}}),e&&(this.viewModel.sketchTriangular.defaultUpdateOptions.reshapeOptions={edgeOperation:"offset",shapeOperation:"move-xy",vertexOperation:"move-xy"})}_initializeSketchTriangularGraphicsLayer(){this.viewModel.activeTriangulatedViewer&&(this.viewModel.sketchTriangularGraphicsLayer=new h,this.viewModel.activeTriangulatedViewer.imageRenderer.map.layers.add(this.viewModel.sketchTriangularGraphicsLayer))}async _overlayFirstMeasurement(e,t){switch(t){case"polyline":await this._overlayFirstDistanceMeasurement(e);break;case"polygon":await this._overlayFirstAreaGeometry(e)}}async _overlayFirstDistanceMeasurement(e){const{mode:a,activeTriangulatedViewer:i,currentBestFeature:r,activeViewer:s,footprintExtent:n,currentBestFeatureMeasurementImage:o}=this.viewModel,c=e.geometry?.clone(),h=e.symbol?.clone(),m=i?.imageSize,d=[...c.paths[0]],w=S(i?.media),y="default"===a;if(!("none"!==a&&"video"!==a&&m&&r&&s?.imageSize&&o))return;const v=y?d:T(d,m,w),M=y?A(v,!0):v,f=y?await p(r,s?.imageSize,n):await g(r,s?.imageSize,n),_=y?await p(o,this.viewModel.imageMeasurementViewer?.imageSize,n):await g(o,this.viewModel.activeTriangulatedViewer?.imageSize,n);if(M?.length&&f&&_){const e=y?await V(M,f,_):await k(M,f,_),a=e.map(e=>[e.x-.5,-.5-e.y]),i=e.slice(0,2).map(e=>R(e,m,w)),r=new l({paths:y?[a]:[i],spatialReference:u.WebMercator}),s=new t({geometry:r,symbol:h});await this._editOverlayedGraphics(s)}}async _overlayFirstAreaGeometry(e){const{mode:a,activeTriangulatedViewer:i,currentBestFeature:r,currentBestFeatureMeasurementImage:s,activeViewer:n,footprintExtent:l}=this.viewModel,c=e.geometry?.clone(),h=e.symbol?.clone(),m=i?.imageSize,d=S(i?.media),w=[...c.rings[0]],y="default"===a;if(!("none"!==a&&"video"!==a&&m&&r&&n?.imageSize&&s))return;const v=y?w:T(w,m,d),M=y?A(v,!0):v,f=y?await p(r,n?.imageSize,l):await g(r,n?.imageSize,l),_=y?await p(s,this.viewModel.imageMeasurementViewer?.imageSize,l):await g(s,this.viewModel.activeTriangulatedViewer?.imageSize,l);if(M?.length&&f&&_){const e=y?await V(M,f,_):await k(M,f,_),a=e.map(e=>[e.x-.5,-.5-e.y]),i=e.slice(0,y?2:e.length).map(e=>R(e,m,d)),r=new o({rings:y?[a]:[i],spatialReference:u.WebMercator}),s=new t({geometry:r,symbol:h});await this._editOverlayedGraphics(s)}}async _loadTriangulatedMeasurementAdapter(e){if(!this.viewModel.triangulatedMeasurementAdapter){const t=import("./TriangulatedMeasurementAdapter.js"),{default:a}=await t;if(r(e),this.viewModel.triangulatedMeasurementAdapter=new a({viewModel:this.viewModel,measurementService:this.measurementService}),!this.viewModel.triangulatedMeasurementAdapter.viewModel.isResolved())return}return this.viewModel.triangulatedMeasurementAdapter}async _getAreaFromTask(e){const{mode:t}=this.viewModel;return this._calculationTask?.abort(),this._calculationTask=a(async a=>{this._areaCalculation=null;const i=await this.calculateAreaMeasurement(e,t,a);r(a),this._areaCalculation=i}),await this._calculationTask.promise,this._areaCalculation}async _getDistanceFromTask(){const{mode:e}=this.viewModel;return this._calculationTask?.abort(),this._calculationTask=a(async t=>{this._distanceCalculation=0;const a=await this.calculateDistanceMeasurement(this.measurementArray,e,t);r(t),this._distanceCalculation=a}),await this._calculationTask.promise,this._distanceCalculation}async _getAccuracyFromTask(){const{mode:e,currentBestFeature:t,currentBestFeatureMeasurementImage:i,activeViewer:s,activeTriangulatedViewer:n,layer:o,footprintExtent:l}=this.viewModel,c=s?.imageSize;return"none"!==e&&c?(this._calculationTask?.abort(),this._calculationTask=a(async a=>{this._distanceCalculation=0;const u={measurementArray:this.measurementArray,measurementType:"distance",currentBestFeature:t,currentBestFeatureMeasurementImage:i,activeViewer:s,imageSize:c,layer:o,triangularMeasurementActive:!1,footprintExtent:l,signal:a},h={measurementArray:this.measurementArray,measurementType:"distance",secondaryViewer:!1,currentBestFeature:t,currentBestFeatureMeasurementImage:i,activeViewer:s,activeTriangulatedViewer:n,layer:o,footprintExtent:l,signal:a},m="default"===e?await(this.measurementService?.calculateAccuracy(u)):await(this.measurementService?.calculateAccuracyPanoramic(h));r(a),this._distanceCalculation=m}),await this._calculationTask.promise,this._distanceCalculation):null}async _getAreaAccuracyFromTask(e){const{mode:t,currentBestFeature:i,currentBestFeatureMeasurementImage:s,activeViewer:n,activeTriangulatedViewer:o,layer:l,footprintExtent:c}=this.viewModel,u=n?.imageSize;return"none"!==t&&u?(this._calculationTask?.abort(),this._calculationTask=a(async a=>{this._distanceCalculation=0;const h={measurementArray:e,measurementType:"area",currentBestFeature:i,currentBestFeatureMeasurementImage:s,activeViewer:n,imageSize:u,layer:l,triangularMeasurementActive:!1,footprintExtent:c,signal:a},m={measurementArray:e,measurementType:"area",secondaryViewer:!1,currentBestFeature:i,currentBestFeatureMeasurementImage:s,activeViewer:n,activeTriangulatedViewer:o,layer:l,footprintExtent:c,signal:a},d="default"===t?await(this.measurementService?.calculateAccuracy(h)):await(this.measurementService?.calculateAccuracyPanoramic(m));r(a),this._distanceCalculation=d}),await this._calculationTask.promise,this._distanceCalculation):null}_updateOverlayedGeometry(e){this.viewModel.sketchTriangular?.update([e],{tool:"reshape"})}};e([s()],B.prototype,"type",void 0),e([s()],B.prototype,"measurementArray",void 0),e([s()],B.prototype,"pixelMeasurement",void 0),e([s()],B.prototype,"pixelAreaMeasurement",void 0),e([s()],B.prototype,"polygonVertices",void 0),B=e([n("esri.widgets.OrientedImageryViewer.adapters.sketch.MeasurementAdapter")],B);const P=B,R=(e,t,a)=>{const{heading:i,pitch:r}=d(e,t[0],t[1]);return w(i,r,a)};export{P as default};