@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.7 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import has from"../../../../../core/has.js";import{effectFlag0 as e,filterFlag0 as t,labelPlacementOffsetPadding as o}from"../definitions.js";import{VVBinding as n}from"../enums.js";import{CollisionBitsetGrid as i,none as s,hasCollision as l,outsideExtent as r}from"./CollisionGrid.js";const a=254,c=255,f=0;function d(e,t){const o=e.children.slice();o.sort(((e,t)=>e.tileAge-t.tileAge)),o.forEach((e=>{null!=e.labelMetrics&&e.isReady&&t(e,e.labelMetrics)}))}function u(e,t){return(!e.minScale||e.minScale>=t)&&(!e.maxScale||e.maxScale<=t)}class b{run(e,t,o,n){const i=[];for(let s=e.length-1;s>=0;s--){const t=e[s];t.labelingCollisionInfos?.length&&i.push(...t.labelingCollisionInfos)}has("esri-2d-update-debug")&&i.length&&console.debug("CollisionEngine.run"),this._transformMetrics(i),this._runCollision(i,t,o,n);for(const s of i)s.container.requestRender()}_runCollision(e,t,o,n){const[s,l]=t.state.size,r=new i(s,l,t.pixelRatio);for(const{container:i,deconflictionEnabled:b,visible:m}of e){const e=i.attributeView;b?m?(this._prepare(i),this._collideVisible(r,i,o,n),this._collideInvisible(r,i)):d(i,((t,o)=>{for(const n of o)e.setLabelMinZoom(n.entityTexel,c)})):d(i,((t,n)=>{for(const i of n)u(i,o)?(e.setLabelMinZoom(i.entityTexel,f),m&&r.insertMetrics(i)):e.setLabelMinZoom(i.entityTexel,a)}))}}_isFiltered(o,n,i){const s=n.getFilterFlags(o),l=s&t,r=null==i.featureEffect||i.featureEffect.excludedLabelsVisible||s&e;return!(l&&r)}_prepare(e){const t=e.attributeView,o=new Set;d(e,((n,i)=>{for(const s of i){const n=s.entityTexel;if(o.has(n))continue;if(o.add(n),this._isFiltered(n,t,e.layerView)){t.setLabelMinZoom(n,a);continue}t.getLabelMinZoom(n)!==f?t.setLabelMinZoom(n,c):t.setLabelMinZoom(n,f)}}))}_collideVisible(e,t,o,n){const i=t.attributeView,c=new Set;d(t,((t,d)=>{for(let b=0;b<d.length;b++){const m=d[b].entityTexel;if(c.has(m))continue;if(t.key.level!==n){i.setLabelMinZoom(m,a),c.add(m);continue}if(!u(d[b],o)){i.setLabelMinZoom(m,a),c.add(m);continue}if(0!==i.getLabelMinZoom(m)){c.add(m);continue}let h=!1,M=!0;const g=b;let y=b;for(;y<d.length;y++){const t=d[y];if(t.entityTexel!==m)break;if(h)continue;switch(e.hasCollision(t)){case r:break;case l:h=!0,M=!1;break;case s:M=!1}}if(!h)for(let t=g;t<y;t++)e.insertMetrics(d[t]);b=y-1,M||(c.add(m),i.setLabelMinZoom(m,h?a:f))}}))}_collideInvisible(e,t){const o=t.attributeView,n=new Set;d(t,((t,i)=>{for(let a=0;a<i.length;a++){const t=i[a].entityTexel;if(n.has(t))continue;if(o.getLabelMinZoom(t)!==c){n.add(t);continue}let d=!1,u=!0;const b=a;let m=a;for(;m<i.length;m++){const o=i[m];if(o.entityTexel!==t)break;if(d)continue;switch(e.hasCollision(o)){case r:break;case l:d=!0,u=!1;break;case s:u=!1}}if(!d)for(let o=b;o<m;o++)e.insertMetrics(i[o]);a=m-1,u||(n.add(t),o.setLabelMinZoom(t,d?c:f))}}))}_transformMetrics(e){for(const{container:t,geometryType:i,vvEvaluators:s}of e)d(t,((e,l)=>{const r=t.attributeView,a=e.transforms.labelMat2d;a[4]=Math.round(a[4]),a[5]=Math.round(a[5]);const c="polyline"===i;for(const t of l){const{entityTexel:e,anchorX:i,anchorY:l}=t;let f=t.referenceBounds?.size??0;const d=s[0];if(null!=d){const t=d(r.getVisualVariableData(e,n.SIZE));f=isNaN(t)||null==t||t===1/0?f:t}const u=o+f/2,b=t.directionX*u,m=t.directionY*u;for(const o of t.bounds){let e=i,t=l;if(c){const n=i+o.x+b,s=l+o.y+m;e=a[0]*n+a[2]*s+a[4],t=a[1]*n+a[3]*s+a[5];const r=e,c=t;o.transformedX=Math.floor(r),o.transformedY=Math.floor(c)}else{e=a[0]*i+a[2]*l+a[4],t=a[1]*i+a[3]*l+a[5];const n=e+o.x+b,s=t+o.y+m;o.transformedX=n,o.transformedY=s}}}}))}}export{b as CollisionEngine};