@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 5.67 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */
import{__decorate as e}from"tslib";import t from"../../../../Graphic.js";import{EsriPromise as i}from"../../../../core/Promise.js";import{property as r,subclass as a}from"../../../../core/accessorSupport/decorators.js";import{distance as s}from"../../../../core/libs/gl-matrix-2/math/vec2.js";import n from"../../../../geometry/Polyline.js";import{getImageToWorldProperties as h,convertPixelLocationToSphereVertex as c}from"../../../../layers/orientedImagery/transformations/utils.js";import{formatPixels as o,getMeasurementPropertiesPanoramic as l,calculateReferenceImagePointPanoramic as m,calculateAnglePano as u,calculateTempImagePoint as p,calculateAngle as g,heightMeasurementPanoramic as d,heightMeasurement2D as w,getModeCorrectedPoint as v,calculateCorrectedPixel as M,getUnitRateFromSpatialReference as f,calculateHeightFromTemporaryDistance as y}from"../../imageMeasurementUtils.js";import{measurementPolylineSymbol as x,polylineSymbolPanoramic as P}from"../../symbols.js";import{DrawHandlerMixin as A}from"../../mixins/DrawHandlerMixin.js";let G=class extends(A(i)){constructor(e){super(e),this.heightMeasurementPixels=[],this.measurementAngle=null,this.tempDistance=null}async calculateHeightMeasurementInfo(e,t,i){const{currentBestFeature:r,activeViewer:a}=this.viewModel,n=a?.imageSize;if(!r||!a||!n?.length||"none"===t)return;const{attributes:c}=r,[d]=o([e],"panoramic"!==t),w="panoramic"===t?await l(r,a?.imageSize,this.viewModel.footprintExtent):h(c,n[0],n[1]);if("panoramic"===t){if(!w)return;const e=await m(d,w,r,i);if(!e)return;e?.heading>180&&(e.heading-=360);const t=u(d,e),a=s([d.x,d.y],[e.x,e.y]);if(!t||!a)return;return{measurementAngle:t,tempDistance:a}}const v=await p(d,w,i);if(!v)return;const M=g(d,v),f=s([d.x,d.y],[v.x,v.y]);return M&&f?{measurementAngle:M,tempDistance:f}:void 0}async computeHeight(e,t,i=!0){const{currentBestFeature:r,activeViewer:a,layer:s,footprintExtent:n}=this.viewModel,c=a?.imageSize,m=r?.attributes,u=s?.orientationAccuracy;if(!m||!c||!e||e.length<2||!u)return;const p="panoramic"===t?await l(r,a?.imageSize,n):h(m,c[0],c[1]),g=e.at(0),v=e.at(-1);if(!(p&&g&&v&&u&&n))return;const M=[v,g],f=o(M,!1),y="panoramic"===t?await d(M,p,u,r,!0,!1):await w(M,p,u,!0,i);if(!y)return;const x=await(this.measurementService?.calculateHeightAccuracy({accuracyParameters:u,pixelObj:f,properties:p,height:y,currentBestFeature:r,mode:t}));return x?{value:y,accuracy:x}:{value:y}}createPolylineGraphic(){const e=[this.heightMeasurementPixels[0],this.heightMeasurementPixels.at(-1)],i=this.viewModel.activeViewer?.imageRenderer.spatialReference;if(this.viewModel.heightGraphic)this.viewModel.heightGraphic.geometry=new n({paths:[e],spatialReference:i});else{const r=new n({paths:[e],spatialReference:i}),a=this.viewModel.activeViewer?.imageRenderer.effectiveTheme.accentColor;this.viewModel.heightGraphic=new t({geometry:r,symbol:x(a,2.5)}),this.viewModel.activeViewer?.addGraphic(this.viewModel.heightGraphic)}}createPolylineGraphicPano(){const e=this.viewModel.activeViewer?.imageRenderer.spatialReference,i=this.viewModel.activeViewer?.imageSize;if(!i)return;const r={x:this.heightMeasurementPixels[0][0],y:this.heightMeasurementPixels[0][1]},a={x:this.heightMeasurementPixels.at(-1)[0],y:this.heightMeasurementPixels.at(-1)[1]},s=[[...c(r,i[0],i[1])],[...c(a,i[0],i[1])]];if(this.viewModel.heightGraphic)this.viewModel.heightGraphic.geometry=new n({paths:[s],spatialReference:e});else{const i=new n({paths:[s],spatialReference:e});this.viewModel.heightGraphic=new t({geometry:i,symbol:P}),this.viewModel.activeViewer?.addGraphic(this.viewModel.heightGraphic,0)}}async displayHeightResults(){const{currentBestFeature:e,activeViewer:t,mode:i}=this.viewModel,r=this.heightMeasurementPixels,a=t?.imageSize,s=e?.attributes;if(!s||!a)return;const n=await this.computeHeight(r,i);n?.value&&n?.accuracy&&(this.viewModel.heightMeasurementResult=n.value,this.viewModel.heightMeasurementAccuracy=n.accuracy)}async handleCreate(e,t){if(this.draw)switch(e.type){case"cursor-update":this.handleDrawCursorUpdateEvents(e);break;case"vertex-add":await this.handleDrawVertexAddEvents(e,t);break;case"draw-complete":await this.displayHeightResults(),this.resetPixels()}}resetPixels(){this.heightMeasurementPixels=[],this.measurementAngle=null,this.tempDistance=null}handleDrawCursorUpdateEvents(e){const{mode:t,activeViewer:i,currentBestFeature:r}=this.viewModel,{tempDistance:a,measurementAngle:s}=this,n=this.heightMeasurementPixels,h=i?.imageSize;if(!e.vertices||!h||!r)return;const c=v(e.vertices.at(-1),t,h);if(n.length<1||!c||!a||!s||"none"===t)return;const o=M(n[0],c,s);if(!o?.length)return;this.heightMeasurementPixels.push(o),"panoramic"===t?this.createPolylineGraphicPano():this.createPolylineGraphic();const l=f(r.attributes.location.spatialReference),m=y(this.heightMeasurementPixels,a,l);m&&(this.viewModel.heightMeasurementResult=m)}async handleDrawVertexAddEvents(e,t){const{currentBestFeature:i,activeViewer:r,mode:a}=this.viewModel,s=this.heightMeasurementPixels;if(!i||!r||!e.vertices?.length||"none"===a)return;const n=r?.imageSize;if(!s.length&&n){const i=v(e.vertices.at(-1),a,n);this.heightMeasurementPixels.push(i);const r=await this.calculateHeightMeasurementInfo(i,a,t);if(!r?.measurementAngle||!r?.tempDistance)return;this.measurementAngle=r.measurementAngle,this.tempDistance=r.tempDistance}}};e([r()],G.prototype,"heightMeasurementPixels",void 0),e([r()],G.prototype,"measurementAngle",void 0),e([r()],G.prototype,"tempDistance",void 0),G=e([a("esri.widgets.OrientedImageryViewer.adapters.draw.HeightMeasurementAdapter")],G);const D=G;export{D as default};