thematic-earth
Version:
HTML-based, whole-Earth thematic maps using locally hosted data layers
2 lines • 2.53 kB
JavaScript
/* Copyright (c) 2023 Read Write Tools. Legal use subject to the Thematic Earth Software License Agreement. */
const degreesToRadians=Math.PI/180;export default class OrthographicProjection{constructor(t,i,a,s,h){this.thematicEarthElement=t,this.signal=this.thematicEarthElement.signal,this.earth=i,this.latitude0=a,this.longitude0=s,this.phi0=a*degreesToRadians,this.lambda0=s*degreesToRadians,this.radius=h,this.allPointsNeedProjection=!0,this.cos_phi0=Math.cos(this.phi0),this.sin_phi0=Math.sin(this.phi0),Object.seal(this)}reflectValues(){this.signal.broadcast('ortho/tangentLatitude',this.latitude0),this.signal.broadcast('ortho/tangentLongitude',this.longitude0)}setTangentLatitude(t){var i=parseFloat(t);Number.isNaN(i)||(this.latitude0=i,this.phi0=this.latitude0*degreesToRadians,this.allPointsNeedProjection=!0,this.cos_phi0=Math.cos(this.phi0),this.sin_phi0=Math.sin(this.phi0),this.signal.broadcast('ortho/tangentLatitude',this.latitude0))}setTangentLongitude(t){var i=parseFloat(t);Number.isNaN(i)||(this.longitude0=i,this.lambda0=this.longitude0*degreesToRadians,this.allPointsNeedProjection=!0,this.signal.broadcast('ortho/tangentLongitude',this.longitude0))}toEastingNorthing(t){t.easting=this.radius*Math.cos(t.phi)*Math.sin(t.lambda-this.lambda0),t.northing=-1*this.radius*(this.cos_phi0*Math.sin(t.phi)-this.sin_phi0*Math.cos(t.phi)*Math.cos(t.lambda-this.lambda0));var i=this.sin_phi0*Math.sin(t.phi)+this.cos_phi0*Math.cos(t.phi)*Math.cos(t.lambda-this.lambda0);t.isOnNearSide=i>=0}toNightEastingNorthing(t,i){var a=Math.cos(this.phi0),s=Math.sin(this.phi0),h=this.lambda0+i;t.easting=this.radius*Math.cos(t.apparentPhi)*Math.sin(t.apparentLambda-h),t.northing=-1*this.radius*(a*Math.sin(t.apparentPhi)-s*Math.cos(t.apparentPhi)*Math.cos(t.apparentLambda-h));var n=s*Math.sin(t.apparentPhi)+a*Math.cos(t.apparentPhi)*Math.cos(t.apparentLambda-h);t.isOnNearSide=n>=0}inverseProjection(t){var i=t.easting,a=-1*t.northing;if(0==i&&0==a)return t.isOnEarth=!0,t.phi=0,t.latitude=0,t.lambda=0,void(t.longitude=0);var s=i*i,h=a*a,n=Math.sqrt(s+h);if(n>this.radius)return t.isOnEarth=!1,t.phi=null,t.latitude=null,t.lambda=null,void(t.longitude=null);t.isOnEarth=!0;var e=Math.asin(n/this.radius),o=Math.sin(e),d=Math.cos(e),r=a*o*this.cos_phi0;t.phi=Math.asin(d*this.sin_phi0+r/n),t.latitude=t.phi/degreesToRadians;r=i*o;var l=n*this.cos_phi0*d-a*this.sin_phi0*o;t.lambda=this.lambda0+Math.atan2(r,l),t.longitude=t.lambda/degreesToRadians,t.longitude>180&&(t.longitude-=360),t.longitude<-180&&(t.longitude+=360)}}