thematic-earth
Version:
HTML-based, whole-Earth thematic maps using locally hosted data layers
2 lines • 4.2 kB
JavaScript
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */
import RangeRestrictedRule from'../tess/range-restricted-rule.class.js';import TessAssignedValue from'../tess/tess-assigned-value.class.js';import CanvasParams from'../tess/canvas-params.class.js';import expect from'../dev/expect.js';export default class TessManager{constructor(){this.rangeRestrictedRules=new Map,this.createNewRule('min','max')}ruleExists(e,a){var t=assembleRangeRestrictedKey(e,a);return this.rangeRestrictedRules.has(t)}createNewRule(e,a){var t=assembleRangeRestrictedKey(e,a),r=new RangeRestrictedRule(e,a);return this.rangeRestrictedRules.set(t,r),r}getRule(e,a){var t=assembleRangeRestrictedKey(e,a);return this.rangeRestrictedRules.get(t)}theAnyMapScaleRule(){var e=assembleRangeRestrictedKey('min','max');return this.rangeRestrictedRules.get(e)}computeStyle(e,a,t,r,s,l,i,n){var c=new CanvasParams;this.theAnyMapScaleRule().selectorDeclarationsToCanvasParams(c,e,t,r,s,l,i,n);for(let m of this.rangeRestrictedRules.values())'min'==m.minScale&&'max'==m.maxScale||('min'==m.minScale&&a<=m.maxScale||a>=m.minScale&&'max'==m.maxScale||a>=m.minScale&&a<=m.maxScale)&&m.selectorDeclarationsToCanvasParams(c,e,t,r,s,l,i,n);return c.determineAllScalingCoefficients(a),c.determineAllDisplayThresholds(a),c}overlayCanvasParams(e,a,t){expect(e,'CanvasParams'),expect(a,'String'),expect(t,'String'),this.theAnyMapScaleRule().overlayCanvasParams(e,a,t)}runCourtesyValidator(e,a,t,r,s,l){for(let i of this.rangeRestrictedRules.values())i.runCourtesyValidator(e,a,t,r,s,l)}getAllOverridesForFeature(e,a,t,r){expect(e,'Map'),expect(a,'Number'),expect(t,['GeneralFeature','GreatCircleFeature','HemisphereFeature','LabelFeature','LineFeature','PointFeature','PolygonFeature']),expect(r,'Layer');var s=t.featureType,l=r.tessClassname,i=r.tessIdentifier,n=t.isSelected,c=t.featureName,m=t.kvPairs,u=Array.from(this.rangeRestrictedRules.values());for(let t=u.length-1;t>=0;t--){var o=u[t];'min'==o.minScale&&'max'==o.maxScale||('min'==o.minScale&&a<=o.maxScale||a>=o.minScale&&'max'==o.maxScale||a>=o.minScale&&a<=o.maxScale)&&o.getAllOverridesForFeature(e,s,l,i,n,c,m)}this.theAnyMapScaleRule().getAllOverridesForFeature(e,s,l,i,n,c,m)}getAllRangeRestrictionsOfFeature(e,a,t){expect(e,'Number'),expect(a,['GeneralFeature','GreatCircleFeature','HemisphereFeature','LabelFeature','LineFeature','PointFeature','PolygonFeature']),expect(t,'Layer');var r=a.featureType,s=t.tessClassname,l=t.tessIdentifier,i=a.isSelected,n=a.featureName,c=a.kvPairs,m=[];for(let a of this.rangeRestrictedRules.values())('min'==a.minScale&&'max'==a.maxScale||'min'==a.minScale&&e<=a.maxScale||e>=a.minScale&&'max'==a.maxScale||e>=a.minScale&&e<=a.maxScale)&&1==a.getAllRangeRestrictionsOfFeature(r,s,l,i,n,c)&&m.push(a);return m}getAllSelectorsOfFeature(e,a,t){expect(e,'Number'),expect(a,['GeneralFeature','GreatCircleFeature','HemisphereFeature','LabelFeature','LineFeature','PointFeature','PolygonFeature']),expect(t,'Layer'),expect(e,'Number'),expect(a,['GeneralFeature','GreatCircleFeature','HemisphereFeature','LabelFeature','LineFeature','PointFeature','PolygonFeature']),expect(t,'Layer');var r=a.featureType,s=t.tessClassname,l=t.tessIdentifier,i=a.isSelected,n=a.featureName,c=a.kvPairs,m=new Set;for(let a of this.rangeRestrictedRules.values())('min'==a.minScale&&'max'==a.maxScale||'min'==a.minScale&&e<=a.maxScale||e>=a.minScale&&'max'==a.maxScale||e>=a.minScale&&e<=a.maxScale)&&a.getAllSelectorsOfFeature(m,r,s,l,i,n,c);return Array.from(m)}exportTess(e,a,t,r){expect(e,'Array'),expect(a,'Boolean'),expect(t,'String'),expect(r,'Boolean');var s=[];for(let[n,c]of this.rangeRestrictedRules.entries()){var l='min'!=c.minScale||'max'!=c.maxScale?1:0,i=c.exportTess(l,e,a,t,r);''!=i.trim()&&('min'==c.minScale&&'max'==c.maxScale?s.push(i):'min'!=c.minScale&&'max'!=c.maxScale?(s.push(`@scale from(${c.minScale}) to(${c.maxScale}) {`),s.push(i),s.push('}')):'min'!=c.minScale?(s.push(`@scale from(${c.minScale}) {`),s.push(i),s.push('}')):'max'!=c.maxScale&&(s.push(`@scale to(${c.maxScale}) {`),s.push(i),s.push('}')))}return s.join('\n')}}function assembleRangeRestrictedKey(e,a){return`${e}:${a}`}