UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) 7.24 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import t from"../../../core/Error.js";import{memoize as e}from"../../../core/memoize.js";import{fromJSON as s}from"../jsonUtils.js";import{interpolateCubicBezier as n}from"./bezierCurveUtils.js";import{deriveCircleFromCircularArc as i}from"./circularArcUtils.js";import{isCurvedGeometry as r,hasUnsupportedCurve as a,getCurves as o,getEndpoint as c,isCoordinate as h,isBezierCurve as u,isCircularArc as p,isEllipticArc4 as l,isEllipticArc7 as m,cloneCurve as d}from"./curveUtils.js";import{deriveCircleFromEllipticArc4 as f}from"./ellipticArc4Utils.js";import{deriveEllipse as S,interpolateEllipse as v}from"./ellipticArc7Utils.js";import{interpolateSegment as E,pointToSegmentDistance2 as g,distance2 as x}from"./mathUtils.js";const M={maxSegmentLength:0,maxDeviation:0,maxSegmentsPerCurve:12e3,minSegmentsPerCurve:1},P=100,k=1e-6,C=[0,0];function _(t){return{maxSegmentLength:t.maxSegmentLength??M.maxSegmentLength,maxDeviation:t.maxDeviation??M.maxDeviation,maxSegmentsPerCurve:t.maxSegmentsPerCurve??M.maxSegmentsPerCurve,minSegmentsPerCurve:Math.max(t.minSegmentsPerCurve??M.minSegmentsPerCurve,1)}}class y{constructor(t,e){this.curveStart=t,this.curveEnd=e,this.tStart=0,this.tEnd=0,this.tEndStack=[],this.arcEndStack=[]}get stackSize(){return this.tEndStack.length}initialize(t,e){this.tStart=0,this.arcStart=t,this.tEndStack.push(1),this.arcEndStack.push(e)}splitAt(t){this.tEndStack.push(this.tEnd),this.arcEndStack.push(this.arcEnd),this.tEndStack.push(t),this.arcEndStack.push(this.interpolate(t))}splitInHalf(){return this.splitAt((this.tStart+this.tEnd)/2)}pop(){this.tEnd=this.tEndStack.pop(),this.arcEnd=this.arcEndStack.pop()}next(){this.tStart=this.tEnd,this.arcStart=this.arcEnd}densify(t,{maxDeviation:e,maxSegmentLength:s,maxSegmentsPerCurve:n,minSegmentsPerCurve:i}){const r=s*s,a=e*e,o=1/n,c=this.interpolate(0),h=this.interpolate(1);x(this.curveStart,c)>k&&t.push(c),this.initialize(c,h);const u=1/i;for(let p=i-1;p>0;p--){const t=p*u;this.pop(),this.splitAt(t)}for(;this.stackSize>0;)this.pop(),this.tStart===this.tEnd||this.tEnd-this.tStart<o||(0===r||!isFinite(r)||x(this.arcStart,this.arcEnd)<r)&&(0===a||!isFinite(a)||this.getDeviation2()<a)?(t.push(this.arcEnd),this.next()):this.splitInHalf();return x(this.curveEnd,h)>k&&t.push([...this.curveEnd]),t}}class R extends y{constructor(t,e){const[s,n,i]=e.b;super(t,s),this._controlPointsStack=[],this._curveControlPoints=[n,i],this._arcControlPoints=[n,i],this._controlPointsStack.push(this._arcControlPoints)}splitAt(t){const{arcStart:e,arcEnd:s,tStart:n,tEnd:i}=this,[r,a]=this._arcControlPoints,o=(t-n)/(i-n),c=E([],e,r,o),h=E(C,r,a,o),u=E([],a,s,o),p=E([],c,h,o),l=E([],h,u,o),m=E([],p,l,o);this.tEndStack.push(this.tEnd),this.arcEndStack.push(this.arcEnd),this._controlPointsStack.push([l,u]),this.tEndStack.push(t),this.arcEndStack.push(m),this._arcControlPoints[0]=c,this._arcControlPoints[1]=p,this._controlPointsStack.push(this._arcControlPoints)}pop(){super.pop(),this._arcControlPoints=this._controlPointsStack.pop()}interpolate(t){const{curveStart:e,curveEnd:s}=this,[i,r]=this._curveControlPoints;return n(e,i,r,s,t)}getDeviation2(){const{arcStart:t,arcEnd:e}=this,[s,n]=this._arcControlPoints;return Math.max(g(s,t,e),g(n,t,e))}}class w extends y{constructor(t,e){const[s]=e.a;super(t,s),this._derivedEllipse=S(t,e)}pop(){super.pop(),this._tMid=(this.tStart+this.tEnd)/2,this._arcMid=this.interpolate(this._tMid)}splitInHalf(){this.tEndStack.push(this.tEnd),this.arcEndStack.push(this.arcEnd),this.tEndStack.push(this._tMid),this.arcEndStack.push(this._arcMid)}interpolate(t){return v(this._derivedEllipse,t)}getDeviation2(){return g(this._arcMid,this.arcStart,this.arcEnd)}}function b(t,e,s,{cx:n,cy:i,radius:r,thetaStart:a,thetaEnd:o,isInvalid:c},{maxDeviation:h,maxSegmentLength:u,maxSegmentsPerCurve:p,minSegmentsPerCurve:l}){if(c)return t.push([...s]),t;const m=2*r,d=[n+r*Math.cos(a),i+r*Math.sin(a)],f=[n+r*Math.cos(o),i+r*Math.sin(o)];x(e,d)>k&&t.push(d);const S=Math.abs(o-a),v=u>0&&u<m?2*Math.asin(u/m):S,E=h>0&&h<=r?2*Math.acos(1-h/r):S,g=Math.min(v,E),M=Math.min(p,Math.max(l,Math.ceil(Math.abs(S/g)))),P=1/M;for(let x=1;x<M;x++){const e=x*P,s=a*(1-e)+o*e;t.push([n+r*Math.cos(s),i+r*Math.sin(s)])}return t.push(f),x(s,f)>k&&t.push([...s]),t}function j(t,e,s,n){return new R(e,s).densify(t,n)}function Z(t,e,s,n){const r=i(e,s),[a]=s.c;return b(t,e,a,r,n)}function D(t,e,s,n){const i=f(e,s),[r]=s.a;return b(t,e,r,i,n)}function z(t,e,s,n){const[i,r,a,o,c,h,u]=s.a;return 0===h||0===u?(t.push([...i]),t):new w(e,s).densify(t,n)}function A(t,e,s,n){return h(s)?(t.push([...s]),t):u(s)?j(t,e,s,n):p(s)?Z(t,e,s,n):l(s)?D(t,e,s,n):z(t,e,s,n)}function L(t,e={}){if(!r(t))return t;const s=_(e),n=o(t),i=[];for(const r of n){const t=[];for(let e=0;e<r.length-1;e++){const n=e+1,i=[...c(r[e])];0===e&&t.push(i);A(t,i,r[n],s)}i.push(t)}return"curvePaths"in t?{...void 0!==t.hasZ?{hasZ:t.hasZ}:{},...void 0!==t.hasM?{hasM:t.hasM}:{},paths:i,spatialReference:t.spatialReference}:{...void 0!==t.hasZ?{hasZ:t.hasZ}:{},...void 0!==t.hasM?{hasM:t.hasM}:{},rings:i,spatialReference:t.spatialReference}}const U=e(t=>({maxDeviation:0,maxSegmentLength:t*P,maxSegmentsPerCurve:12e3,minSegmentsPerCurve:1}));function T(t,e,s){if(!r(t))return t;const n=new Set(e),i=_(s),a=o(t),f=[];let S=!1;for(const r of a){const t=[];for(let e=0;e<r.length-1;e++){const s=e+1,a=[...c(r[e])];0===e&&t.push(a);const o=r[s];h(o)?t.push([...o]):u(o)&&!n.has("cubic-bezier")?j(t,a,o,i):p(o)&&!n.has("circular-arc")?Z(t,a,o,i):l(o)&&!n.has("elliptic-arc")?D(t,a,o,i):m(o)&&!n.has("elliptic-arc")?z(t,a,o,i):(t.push(d(o)),S=!0)}f.push(t)}return"curvePaths"in t?{...void 0!==t.hasZ?{hasZ:t.hasZ}:{},...void 0!==t.hasM?{hasM:t.hasM}:{},spatialReference:t.spatialReference,...S?{curvePaths:f}:{paths:f}}:{hasZ:t.hasZ,hasM:t.hasM,spatialReference:t.spatialReference,...S?{curveRings:f}:{rings:f}}}async function I(t,e,n){const i=new Set(e);return await J(t,i,n),t.map(t=>{if(!t||!r(t))return t;const n=t.spatialReference.xyTolerance;if(null==n)return t;const i=U(n);return s(T(t,e,i))})}async function J(e,s,n){let i=null;for(const o of e)if(o&&r(o)&&null==o.spatialReference.xyTolerance&&a(o,s)){const e=o.spatialReference;if(!e)throw new t("geometry:missing-spatial-reference","Geometry contains an unsupported curve type, but it cannot be densified because it has no spatial reference.");const s=N(e);if(n.has(s))o.spatialReference=n.get(s);else{i||(i=await import("../../operators/support/apiConverter.js"));const r=i.fromSpatialReference(e),a=r?.getTolerance();if(null==a)throw new t("geometry:missing-tolerance","Geometry contains an unsupported curve type, but it cannot be densified because the tolerance of its spatial reference is unknown. Set the `xyTolerance` property of the spatial reference.");const c=o.spatialReference.clone();c.read({xyTolerance:a}),o.spatialReference=c,n.set(s,c)}}}function N(t){if(null!=t.wkid)return`${t.wkid}`;if(null!=t.wkt)return t.wkt;const e="toJSON"in t&&"function"==typeof t.toJSON?t.toJSON():t;return JSON.stringify(e)}export{L as densifyCurvedGeometry,I as densifyUnsupportedCurves,U as getAutoDensifyOptions,N as getCacheKey,T as selectiveDensifyCurvedGeometryJSON};