UNPKG

thematic-earth

Version:

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

2 lines 4.59 kB
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */ import BaseFeature from'./base-feature.class.js';import*as st from'../spherical-earth/spherical-trigonometry.js';import*as LineGraphics from'../graphics/line-graphics.js';import*as EuclideanGeometry from'../spherical-earth/euclidean-geometry.js';import BoundingBox from'../graphics/bounding-box.class.js';import LabelCurve from'../labels/label-curve.class.js';import FT from'../enum/feature-type.enum.js';import RS from'../enum/rendering-state.enum.js';import expect from'../dev/expect.js';export default class LineFeature extends BaseFeature{constructor(){super(),this.lineSegment=[],this.mouseEpsilon=1}get featureType(){return FT.LINE}addPoint(e){expect(e,'ProjectedPoint'),this.lineSegment.push(e)}computeFeatureStyle(e,n,t,a,i,s){if(expect(e,'RenderClock'),expect(n,'Visualizer'),expect(t,'String'),expect(a,'String'),expect(i,'Number'),expect(s,'Number'),0==this.featureIsOnNearSide(e.renderingState))return;if(0==this.featureIsOnCanvas(e.renderingState))return;let r=n.computeStyle('line',t,a,this.isSelected,this.featureName,this.kvPairs,i);expect(r,'CanvasParams'),this.setCanvasParamsPerLayerId(s,r);let l=Number(r['stroke-width']);isNaN(l)||(this.mouseEpsilon=Math.max(this.mouseEpsilon,l))}runCourtesyValidator(e,n,t,a,i){e.runCourtesyValidator(FT.LINE,n,t,this.featureName,this.kvPairs,a)}toGeoCoords(e,n){for(var t=0;t<this.lineSegment.length;t++)n.toPhiLambda(this.lineSegment[t])}toPlane(e,n){expect(e,'RenderClock'),expect(n,'OrthographicProjection'),this.pointsOnNearSide=0,this.pointsOnFarSide=0;for(var t=0;t<this.lineSegment.length;t++){let a=this.lineSegment[t];if(n.toEastingNorthing(a),a.isOnNearSide)this.pointsOnNearSide++;else if(this.pointsOnFarSide++,e.renderingState==RS.SKETCHING)return}}toPixels(e,n){if(expect(e,'RenderClock'),expect(n,'CartesianTransformation'),0!=this.featureIsOnNearSide(e.renderingState))for(var t=0;t<this.lineSegment.length;t++)n.toEarthXY(this.lineSegment[t],!0,!0,!0)}toViewportCanvas(e,n){if(expect(e,'RenderClock'),expect(n,'Viewport'),0!=this.featureIsOnNearSide(e.renderingState)){this.pointsOnCanvas=0,this.pointsOffCanvas=0;for(var t=0;t<this.lineSegment.length;t++){let e=this.lineSegment[t];n.toCanvasXY(e),e.isOnNearSide&&(e.isOnCanvas?this.pointsOnCanvas++:this.pointsOffCanvas++)}}}drawFeature(e,n,t){if(expect(e,'RenderClock'),expect(n,'Earth'),expect(t,'Layer'),0==this.featureIsOnNearSide(e.renderingState))return;if(0==this.featureIsOnCanvas(e.renderingState))return;let a=this.getCanvasParamsPerLayerId(t.layerId);if(0!=this.hasSomethingToDraw(a)&&0!=a.displayStrokes()){var i=n.canvas.getContext('2d'),s=n.patternCache;LineGraphics.draw(i,s,a,this.lineSegment),e.renderingState==RS.PAINTING&&t.isLabelable()&&a.displayLabels()&&a.wantsLabel()&&''!=a.getLabelText(this.kvPairs)&&n.addToLabelEngineQueue(t.layerId,t.spatialId,this.featureId,FT.LINE)}}isPointerOnLine(e,n){if(this.lineSegment.length<=1)return!1;let t=this.lineSegment[0];for(let a=1;a<this.lineSegment.length;a++){let i=this.lineSegment[a];if(t.isOnNearSide&&i.isOnNearSide){let a=this.distance(t.canvasX,t.canvasY,i.canvasX,i.canvasY),s=this.distance(t.canvasX,t.canvasY,e,n),r=this.distance(i.canvasX,i.canvasY,e,n);if(Math.abs(a-(s+r))<this.mouseEpsilon)return!0}t=i}return!1}distance(e,n,t,a){return Math.sqrt(Math.pow(e-t,2)+Math.pow(n-a,2))}roughAndReadyPoint(){var e=Math.floor(this.lineSegment.length/2);return this.lineSegment[e]}getFeatureBoundingBox(){var e={minX:null,maxX:null,minY:null,maxY:null};for(let t=0;t<this.lineSegment.length;t++){var n=this.lineSegment[t];n.isOnCanvas&&(null==e.minX?(e.minX=n.canvasX,e.maxX=n.canvasX,e.minY=n.canvasY,e.maxY=n.canvasY):(e.minX=Math.min(e.minX,n.canvasX),e.maxX=Math.max(e.maxX,n.canvasX),e.minY=Math.min(e.minY,n.canvasY),e.maxY=Math.max(e.maxY,n.canvasY)))}return null==e.minX?new BoundingBox(0,0,0,0):new BoundingBox(e.minX,e.maxX,e.minY,e.maxY)}getPossibleLabelCurves(e){expect(e,'Number');var n=1.5*e,t=n/3,a=2*n/3,i=[],s=null,r=null,l=null,o=null,u=null,h=null,m=0;for(let e=0;e<this.lineSegment.length;e++){var c=this.lineSegment[e];if(c.isOnCanvas)if(null==s)s=c.canvasX,r=c.canvasY;else{var p=this.lineSegment[e-1];(m+=EuclideanGeometry.pointToPointDistance(p.canvasX,p.canvasY,c.canvasX,c.canvasY))>n&&null!=l&&null!=u?(i.push(new LabelCurve(s,r,l,o,u,h,c.canvasX,c.canvasY,m)),s=null,r=null,l=null,o=null,u=null,h=null,m=0):m>a&&null!=l&&null==u?(u=c.canvasX,h=c.canvasY):m>t&&null==l&&(l=c.canvasX,o=c.canvasY)}else s=null,r=null,l=null,o=null,u=null,h=null,m=0}return i}}