UNPKG

thematic-earth

Version:

HTML-based, whole-Earth thematic maps using locally hosted data layers

2 lines 4.15 kB
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */ import BaseSpatialFile from'../catalog/base-spatial-file.class.js';import LineFeature from'../features/line-feature.class.js';import ProjectedPoint from'../projection/projected-point.class.js';import expect from'../dev/expect.js';export default class Graticule extends BaseSpatialFile{constructor(e,r,t,a){if(super(e),r=Number(r),t=Number(t),this.parallelFrequency=Number.isNaN(r)?'none':r,this.meridianFrequency=Number.isNaN(t)?'none':t,this.drawToPoles=void 0!==a&&a,this.parallels=[],this.meridians=[],'none'!=this.parallelFrequency&&(this.parallelFrequency<=0||this.parallelFrequency>30)&&(this.parallelFrequency=10),'none'!=this.meridianFrequency&&(this.meridianFrequency<=0||this.meridianFrequency>30)&&(this.meridianFrequency=10),'none'!=this.parallelFrequency)for(var i=-90+this.parallelFrequency;i<90;i+=this.parallelFrequency){var s=new LineFeature,l=Math.abs(i),n=i>0?' N':i<0?' S':'';s.featureName=`Parallel ${l}${n}`,s.kvPairs.name=s.featureName;for(var o=-180;o<=180;o++)s.addPoint(new ProjectedPoint(i,o));this.parallels.push(s),this.addFeatureToLookupMap(s)}if('none'!=this.meridianFrequency)for(o=-180;o<180;o+=this.meridianFrequency){s=new LineFeature,l=Math.abs(o);var p=o>0?' E':o<0?' W':'';if(s.featureName=`Meridian ${l}${p}`,s.kvPairs.name=s.featureName,1==this.drawToPoles)for(i=-90;i<=90;i++)s.addPoint(new ProjectedPoint(i,o));else for(i=-90+t;i<90;i++)s.addPoint(new ProjectedPoint(i,o));this.meridians.push(s),this.addFeatureToLookupMap(s)}this.localPointsNeedGeoCoords=!0,this.localPointsNeedProjection=!0,this.localPointsNeedTransformation=!0,this.localPointsNeedPlacement=!0,this.thematicEarthElement.signal.broadcast('catalog/spatialFileAdded',{spatialFileType:'graticule',parallelFrequency:r,meridianFrequency:t,drawToPoles:a}),Object.seal(this)}recomputeStyles(e,r,t,a){expect(e,'RenderClock'),expect(r,'Visualizer'),expect(t,'Layer'),expect(a,'Number'),super.recomputeStyles(e,r,t,(()=>{for(var i=0;i<this.parallels.length;i++)this.parallels[i].computeFeatureStyle(e,r,t.tessClassname,t.tessIdentifier,i,a);for(i=0;i<this.meridians.length;i++)this.meridians[i].computeFeatureStyle(e,r,t.tessClassname,t.tessIdentifier,i,a)}))}runCourtesyValidator(e,r,t){expect(e,'Visualizer'),expect(r,'Layer'),expect(t,'Number'),super.runCourtesyValidator((()=>{for(var a=0;a<this.parallels.length;a++)this.parallels[a].runCourtesyValidator(e,r.tessClassname,r.tessIdentifier,a,t);for(a=0;a<this.meridians.length;a++)this.meridians[a].runCourtesyValidator(e,r.tessClassname,r.tessIdentifier,a,t)}))}rotation(e,r){expect(e,'RenderClock'),expect(r,'GeocentricCoordinates'),super.rotation(e,r,(()=>{for(var t=0;t<this.parallels.length;t++)this.parallels[t].toGeoCoords(e,r);for(t=0;t<this.meridians.length;t++)this.meridians[t].toGeoCoords(e,r)}))}projection(e,r){expect(e,'RenderClock'),expect(r,'OrthographicProjection'),super.projection(e,r,(()=>{for(var t=0;t<this.parallels.length;t++)this.parallels[t].toPlane(e,r);for(t=0;t<this.meridians.length;t++)this.meridians[t].toPlane(e,r)}))}transformation(e,r){expect(e,'RenderClock'),expect(r,'CartesianTransformation'),super.transformation(e,r,(()=>{for(var t=0;t<this.parallels.length;t++)this.parallels[t].toPixels(e,r);for(t=0;t<this.meridians.length;t++)this.meridians[t].toPixels(e,r)}))}placement(e,r){expect(e,'RenderClock'),expect(r,'Viewport'),super.placement(e,r,(()=>{for(var t=0;t<this.parallels.length;t++)this.parallels[t].toViewportCanvas(e,r);for(t=0;t<this.meridians.length;t++)this.meridians[t].toViewportCanvas(e,r)}))}drawLayer(e,r,t){expect(e,'RenderClock'),expect(r,'Earth'),expect(t,'Layer'),super.drawLayer(e,(()=>{for(var a=0;a<this.parallels.length;a++)this.parallels[a].drawFeature(e,r,t);for(a=0;a<this.meridians.length;a++)this.meridians[a].drawFeature(e,r,t)}))}discoverFeatures(e,r,t){for(var a=0;a<this.parallels.length;a++){var i=this.parallels[a];if(i.featureIsVisible(t)&&i.isPointerOnLine(e,r))return i}for(a=0;a<this.meridians.length;a++){var s=this.meridians[a];if(s.featureIsVisible(t)&&s.isPointerOnLine(e,r))return s}return null}}