unitUtils.js 7.9 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.25/esri/copyright.txt for details.
  4. */
  5. import"./has.js";import{strict as e}from"./jsonMap.js";import{isSome as s,unwrapOr as t,isNone as r}from"./maybe.js";import{getReferenceEllipsoid as i}from"../geometry/projectionEllipsoid.js";import{earth as n,mars as a,moon as u}from"../geometry/support/Ellipsoid.js";import{isEarth as c,isWKIDFromMars as o,isWKIDFromMoon as l}from"../geometry/support/spatialReferenceUtils.js";import m from"../geometry/support/WKIDUnitConversion.js";const f=39.37,d=n.radius*Math.PI/200,U=/UNIT\[([^\]]+)\]\]$/i,q=m,h=/UNIT\[([^\]]+)\]/i,B=new Set([4261,4305,4807,4810,4811,4812,4816,4819,4821,4901,4902,37225,104139,104140]),p=e()({meter:"meters",foot:"feet",foot_us:"us-feet",foot_clarke:"clarke-feet",yard_clarke:"clarke-yards",link_clarke:"clarke-links",yard_sears:"sears-yards",foot_sears:"sears-feet",chain_sears:"sears-chains",chain_benoit_1895_b:"benoit-1895-b-chains",yard_indian:"indian-yards",yard_indian_1937:"indian-1937-yards",foot_gold_coast:"gold-coast-feet",chain_sears_1922_truncated:"sears-1922-truncated-chains","50_kilometers":"50-kilometers","150_kilometers":"150-kilometers"}),k=e=>e*e,b=e=>e*e*e,y={length:{baseUnit:"meters",units:{millimeters:{inBaseUnits:.001},centimeters:{inBaseUnits:.01},decimeters:{inBaseUnits:.1},meters:{inBaseUnits:1},kilometers:{inBaseUnits:1e3},inches:{inBaseUnits:.0254},feet:{inBaseUnits:.3048},yards:{inBaseUnits:.9144},miles:{inBaseUnits:1609.344},"nautical-miles":{inBaseUnits:1852},"us-feet":{inBaseUnits:1200/3937}}},area:{baseUnit:"square-meters",units:{"square-millimeters":{inBaseUnits:k(.001)},"square-centimeters":{inBaseUnits:k(.01)},"square-decimeters":{inBaseUnits:k(.1)},"square-meters":{inBaseUnits:1},"square-kilometers":{inBaseUnits:k(1e3)},"square-inches":{inBaseUnits:k(.0254)},"square-feet":{inBaseUnits:k(.3048)},"square-yards":{inBaseUnits:k(.9144)},"square-miles":{inBaseUnits:k(1609.344)},"square-us-feet":{inBaseUnits:k(1200/3937)},acres:{inBaseUnits:.0015625*k(1609.344)},ares:{inBaseUnits:100},hectares:{inBaseUnits:1e4}}},volume:{baseUnit:"liters",units:{liters:{inBaseUnits:1},"cubic-millimeters":{inBaseUnits:1e3*b(.001)},"cubic-centimeters":{inBaseUnits:1e3*b(.01)},"cubic-decimeters":{inBaseUnits:1e3*b(.1)},"cubic-meters":{inBaseUnits:1e3},"cubic-kilometers":{inBaseUnits:1e3*b(1e3)},"cubic-inches":{inBaseUnits:1e3*b(.0254)},"cubic-feet":{inBaseUnits:1e3*b(.3048)},"cubic-yards":{inBaseUnits:1e3*b(.9144)},"cubic-miles":{inBaseUnits:1e3*b(1609.344)}}},angle:{baseUnit:"radians",units:{radians:{inBaseUnits:1},degrees:{inBaseUnits:Math.PI/180}}}},_=(()=>{const e={};for(const s in y)for(const t in y[s].units)e[t]=s;return e})();function M(e,s,t){return e*y[t].units[s].inBaseUnits}function g(e,s,t){return e/y[t].units[s].inBaseUnits}const w=["metric","imperial","square-inches","square-feet","square-yards","square-miles","square-us-feet","square-meters","square-kilometers","acres","ares","hectares"],S=["metric","imperial","inches","feet","yards","miles","nautical-miles","us-feet","meters","kilometers"],I=new Map([["meters","square-meters"],["feet","square-feet"],["us-feet","square-us-feet"]]);function j(e){return"imperial"===e||"metric"===e}function P(e){const s=_[e];if(!s)throw new Error("unknown type");return s}function C(e){return y[e].baseUnit}function D(e){return C(P(e))}function x(e,s=null){return s=s||P(e),y[s].baseUnit===e}function E(e,s,t){if(s===t)return e;const r=P(s);if(r!==P(t))throw new Error("incompatible units");const i=x(s,r)?e:M(e,s,r);return x(t,r)?i:g(i,t,r)}function N(e,s,t){switch(t){case"metric":return O(e,s);case"imperial":return K(e,s);default:return t}}function v(e,s,t){switch(t){case"metric":return J(e,s);case"imperial":return R(e,s);default:return t}}function F(e,s,t){switch(t){case"metric":return A(e,s);case"imperial":return T(e,s);default:return t}}function O(e,s){const t=E(e,s,"meters");return Math.abs(t)<3e3?"meters":"kilometers"}function J(e,s){const t=E(e,s,"meters");return Math.abs(t)<1e5?"meters":"kilometers"}function K(e,s){const t=E(e,s,"feet");return Math.abs(t)<1e3?"feet":"miles"}function R(e,s){const t=E(e,s,"feet");return Math.abs(t)<1e5?"feet":"miles"}function A(e,s){const t=E(e,s,"square-meters");return Math.abs(t)<3e6?"square-meters":"square-kilometers"}function T(e,s){const t=E(e,s,"square-feet");return Math.abs(t)<1e6?"square-feet":"square-miles"}function Y(e,s,t){return E(e,s,"meters")/(t*Math.PI/180)}function G(e){return p.fromJSON(e.toLowerCase())||null}function H(e){return p.toJSON(e)||null}function L(e){if(s(e)&&!c(e))return 1;const t=$(e);return t>1e5?1:t}function W(e){return $(e)>=i(e).metersPerDegree?"meters":X(e)}function $(e,s=n.metersPerDegree){return t(z(e,!0),s)}function z(e,t=!1){const r=s(e)?e.wkid:null,i=s(e)?e.wkt:null;let n=null;if(r){if(o(r))return a.metersPerDegree;if(l(r))return u.metersPerDegree;n=q.values[q[r]],!n&&t&&B.has(r)&&(n=d)}else i&&(re(i)?n=Q(U.exec(i),n):te(i)&&(n=Q(h.exec(i),n)));return n}function Q(e,s){return e&&e[1]?V(e[1]):s}function V(e){return parseFloat(e.split(",")[1])}function X(e){const t=s(e)?e.wkid:null,r=s(e)?e.wkt:null;let i=null;if(t)i=q.units[q[t]];else if(r){const e=re(r)?U:te(r)?h:null;if(e){const s=e.exec(r);s&&s[1]&&(i=ne(s[1]))}}return s(i)?G(i):null}function Z(e){const s=X(e);return r(s)||!S.includes(s)?null:s}function ee(e){const s=W(e);return r(s)||!S.includes(s)?null:s}function se(e){const s=X(e);return r(s)?null:I.get(s)}function te(e){return/^GEOCCS/i.test(e)}function re(e){return/^PROJCS/i.test(e)}const ie=1e-7;function ne(e){const s=/[\\"\\']{1}([^\\"\\']+)/.exec(e);let t=s&&s[1];if(!t||!q.units.includes(t)){const s=V(e);t=null;const r=q.values;for(let e=0;e<r.length;++e)if(Math.abs(s-r[e])<ie){t=q.units[e];break}}return t}function ae(e){const s=X(e);if(r(s))return null;switch(s){case"feet":case"us-feet":case"clarke-feet":case"clarke-yards":case"clarke-links":case"sears-yards":case"sears-feet":case"sears-chains":case"benoit-1895-b-chains":case"indian-yards":case"indian-1937-yards":case"gold-coast-feet":case"sears-1922-truncated-chains":return"imperial";case"50-kilometers":case"150-kilometers":case"meters":return"metric"}return null}function ue(e){const s="metric";if(r(e))return s;const i=e.map,n=i&&"portalItem"in i?i.portalItem?.portal:null;if(n){switch(n?.user?.units??n.units){case s:return s;case"english":return"imperial"}}return t(ae(e.spatialReference),s)}const ce={esriAcres:"acres",esriAres:"ares",esriHectares:"hectares",esriSquareCentimeters:"square-centimeters",esriSquareDecimeters:"square-decimeters",esriSquareFeet:"square-feet",esriSquareInches:"square-inches",esriSquareKilometers:"square-kilometers",esriSquareMeters:"square-meters",esriSquareMiles:"square-miles",esriSquareMillimeters:"square-millimeters",esriSquareUsFeet:"square-us-feet",esriSquareYards:"square-yards"},oe={esriCentimeters:"centimeters",esriDecimeters:"decimeters",esriFeet:"feet",esriInches:"inches",esriKilometers:"kilometers",esriMeters:"meters",esriMiles:"miles",esriMillimeters:"millimeters",esriNauticalMiles:"nautical-miles",esriYards:"yards"},le=e()(ce),me=e()(oe),fe=e()({...ce,...oe});export{se as areaUnitFromSpatialReference,le as areaUnitsJSONMap,D as baseUnitForUnit,C as baseUnitForUnitType,E as convertUnit,ue as getDefaultUnitForView,ae as getDefaultUnitSystem,z as getMetersPerUnit,$ as getMetersPerUnitForSR,L as getMetersPerVerticalUnitForSR,X as getUnitString,W as getVerticalUnitStringForSR,f as inchesPerMeter,x as isBaseUnit,j as isMeasurementSystem,Y as lengthToDegrees,Z as lengthUnitFromSpatialReference,me as lengthUnitsJSONMap,w as measurementAreaUnits,S as measurementLengthUnits,F as preferredAreaUnit,T as preferredImperialAreaUnit,K as preferredImperialLengthUnit,R as preferredImperialVerticalLengthUnit,N as preferredLengthUnit,A as preferredMetricAreaUnit,O as preferredMetricLengthUnit,J as preferredMetricVerticalLengthUnit,v as preferredVerticalLengthUnit,G as unitFromRESTJSON,H as unitToRESTJSON,P as unitType,fe as unitsJSONMap,ee as verticalLengthUnitFromSpatialReference};