UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 4.12 kB
import{isNone as e,isSome as t}from"../../../../../core/maybe.js";import{pt2px as i}from"../../../../../core/screenUtils.js";import{FILTER_FLAG_0 as o,EFFECT_FLAG_0 as r}from"../definitions.js";import{CollisionBitsetGrid as n,NONE as s,HAS_COLLISION as l,OUTSIDE_EXTENT as a}from"./CollisionGrid.js";import{getSizeForValueSimple as d}from"./visualVariableSimpleUtils.js";const c=254,u=255,f=0;function b(e,i){const o=[];e.forEachTile((e=>o.push(e))),o.sort(((e,t)=>e.instanceId-t.instanceId)),o.forEach((e=>{t(e.labelMetrics)&&e.isReady&&i(e,e.labelMetrics.getCursor())}))}function y(e){return e.layer&&("feature"===e.layer.type||"csv"===e.layer.type||"geojson"===e.layer.type||"ogc-feature"===e.layer.type||"stream"===e.layer.type||"subtype-group"===e.layer.type||"wfs"===e.layer.type)}function p(e){return t=>i(d(t,e))}function m(e){const t=null!=e&&"visualVariables"in e&&e.visualVariables;if(!t)return null;for(const i of t)if("size"===i.type)return p(i);return null}function h(e){for(const t of e){const e="featureReduction"in t&&t.featureReduction&&"labelingInfo"in t.featureReduction?t.featureReduction:void 0,i=[...t.labelingInfo||[],...e?.labelingInfo||[]];if(!t.labelsVisible||!i.length)continue;if(i.some((e=>"none"===e.deconflictionStrategy)))return!0}return!1}function M(t,i){if(!y(i))return;const o="subtype-group"===i.layer.type?i.layer.sublayers.items:[i.layer],r=i.layer.geometryType,n=!h(o),s={};if("subtype-group"!==i.layer.type){if("heatmap"===i.tileRenderer?.type)return;const e=m(i.layer.renderer);s[0]=e}const l=i.tileRenderer;if(e(l))return;const a=i.layer.visible&&!i.suspended;t.push({tileRenderer:l,vvEvaluators:s,deconflictionEnabled:n,geometryType:r,visible:a})}class g{run(e,t,i){const o=[];for(let r=e.length-1;r>=0;r--){M(o,e[r])}this._transformMetrics(o),this._runCollision(o,t,i)}_runCollision(e,t,i){const[o,r]=t.state.size,s=new n(o,r,t.pixelRatio);for(const{tileRenderer:n,deconflictionEnabled:l,visible:a}of e){const e=n.featuresView.attributeView;l?a?(this._prepare(n),this._collideVisible(s,n,i),this._collideInvisible(s,n)):b(n,((t,i)=>{for(;i.nextId();)e.setLabelMinZoom(i.id,u)})):b(n,((t,i)=>{for(;i.nextId();)e.setLabelMinZoom(i.id,f),a&&s.insertMetrics(i)}))}}_isFiltered(t,i,n){const s=i.getFilterFlags(t),l=!n.hasFilter||!!(s&o),a=e(n.featureEffect)||n.featureEffect.excludedLabelsVisible||!!(s&r);return!(l&&a)}_prepare(e){const t=e.featuresView.attributeView,i=new Set;b(e,((o,r)=>{for(;r.nextId();){if(i.has(r.id))continue;if(i.add(r.id),this._isFiltered(r.id,t,e.layerView)){t.setLabelMinZoom(r.id,c);continue}t.getLabelMinZoom(r.id)!==f?t.setLabelMinZoom(r.id,u):t.setLabelMinZoom(r.id,f)}}))}_collideVisible(e,t,i){const o=t.featuresView.attributeView,r=new Set;b(t,((t,n)=>{for(;n.nextId();)if(!r.has(n.id))if(t.key.level===i){if(0===o.getLabelMinZoom(n.id)){switch(e.insertMetrics(n)){case a:break;case l:o.setLabelMinZoom(n.id,c),r.add(n.id);break;case s:o.setLabelMinZoom(n.id,f),r.add(n.id)}}}else o.setLabelMinZoom(n.id,c)}))}_collideInvisible(e,t){const i=t.featuresView.attributeView,o=new Set;b(t,((t,r)=>{for(;r.nextId();)if(!o.has(r.id)&&i.getLabelMinZoom(r.id)===u){switch(e.insertMetrics(r)){case a:break;case l:i.setLabelMinZoom(r.id,u),o.add(r.id);break;case s:i.setLabelMinZoom(r.id,f),o.add(r.id)}}}))}_transformMetrics(e){for(const{tileRenderer:i,geometryType:o,vvEvaluators:r}of e)b(i,((e,n)=>{const s=i.featuresView.attributeView,l=e.transforms.labelMat2d;l[4]=Math.round(l[4]),l[5]=Math.round(l[5]);const a="polyline"===o;for(;n.next();){const e=n.boundsCount,i=n.anchorX,o=n.anchorY;let d=n.size;const c=r[0];if(t(c)){const e=c(s.getVVSize(n.id));d=isNaN(e)||null==e||e===1/0?d:e}const u=n.directionX*(d/2),f=n.directionY*(d/2);for(let t=0;t<e;t++){let e=i,r=n.anchorY;if(a){let i=e+n.boundsX(t)+u,o=r+n.boundsY(t)+f;i=l[0]*i+l[2]*o+l[4],o=l[1]*i+l[3]*o+l[5],n.setBoundsComputedAnchorX(t,Math.floor(i)),n.setBoundsComputedAnchorY(t,Math.floor(o))}else{e=l[0]*i+l[2]*o+l[4],r=l[1]*i+l[3]*o+l[5];const s=e+n.boundsX(t)+u,a=r+n.boundsY(t)+f;n.setBoundsComputedAnchorX(t,s),n.setBoundsComputedAnchorY(t,a)}}}}))}}export{g as CollisionEngine};