UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) • 12.2 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import e from"../../Color.js";import{getMetersPerUnitForSR as t}from"../../core/units.js";import{isFunctionRaster as n}from"../../layers/raster/datasets/datasetUtils.js";import a from"../../layers/support/Field.js";import r from"../ClassBreaksRenderer.js";import l from"../FlowRenderer.js";import s from"../RasterColormapRenderer.js";import i from"../RasterShadedReliefRenderer.js";import o from"../RasterStretchRenderer.js";import u from"../UniqueValueRenderer.js";import m from"../VectorFieldRenderer.js";import c from"./AuthoringInfo.js";import f from"./ClassBreakInfo.js";import{convertColorRampToColormap as p,predefinedJsonColorRamps as d}from"./colorRampUtils.js";import{isVectorFieldRendererSupported as b,isColormapRendererSupported as h,isUVRendererSupported as g,isClassBreaksSupported as v,isShadedReliefRendererSupported as y,isFlowRendererSupported as w}from"./rasterRendererChecks.js";import C from"./UniqueValueInfo.js";import x from"../visualVariables/ColorVariable.js";import M from"../visualVariables/SizeVariable.js";import R from"../visualVariables/support/ColorStop.js";import j from"../../rest/support/ClassBreaksDefinition.js";import{createGenerateRendererClassBreaks as V}from"../../rest/support/generateRendererUtils.js";import I from"../../rest/support/MultipartColorRamp.js";import T from"../../symbols/SimpleFillSymbol.js";const S=.25,k=I.fromJSON({type:"multipart",colorRamps:[{algorithm:"esriCIELabAlgorithm",fromColor:[0,0,255],toColor:[0,255,255]},{algorithm:"esriCIELabAlgorithm",fromColor:[0,255,255],toColor:[255,255,0]},{algorithm:"esriCIELabAlgorithm",fromColor:[255,255,0],toColor:[255,0,0]}]}),L=I.fromJSON(d[0]),F=new Set(["scientific","standard-time","vector-uv","vector-magdir","vector-u","vector-v","vector-magnitude","vector-direction"]);function E(e){return e.presetRenderers?.find(({method:t,value:n})=>"raster-function-template"===t?n===e.rasterFunctionName:"variable"===t&&n===e.variableName)}function q(e,t){const{attributeTable:n,colormap:a}=e;if(b(e)){const t=te(e);if(null!=t)return t}if(t?.rasterFunctionColorRamp){const n=A(e,t);return n.colorRamp=t.rasterFunctionColorRamp,n}if(null!=a){const t=X(e);if(null!=t)return t}if(null!=n){const t=_(e);if(null!=t)return t}return A(e,t)}function B(e,t=!1){const n=["raster-stretch"];return h(e,t)&&n.push("raster-colormap"),g(e)&&n.push("unique-value"),v(e,t)&&n.push("class-breaks"),y(e)&&n.push("raster-shaded-relief"),b(e)&&n.push("vector-field"),w(e)&&n.push("flow"),n}function z(e){return n(e)&&"Colormap"===e.rasterFunction.functionName?e.rasterFunction.colorRamp:void 0}function N(e,t,n){const a=["nearest","bilinear","cubic","majority"],r=n?.toLowerCase().replace("bicubic","cubic"),l=a.find(e=>e===r);if("Map"===t)return l??"bilinear";if("standard-time"===e.dataType)return l??"nearest";return"thematic"===e.dataType||e.attributeTable||e.colormap?"nearest"===l||"majority"===l?l:"nearest":l??"bilinear"}function A(e,t){e=U(e,t?.variableName);const{bandCount:n}=e;let{bandIds:a,stretchType:r}=t||{};a?.some(e=>e>=n)&&(a=null);let l=e.statistics,s=e.histograms;n>1?(a=a?.length?a:W(e),l=null==l?null:a?.map(e=>l[e]),s=null==s?null:a?.map(e=>s[e])):a=[0],null==r&&(r=G(e)),t?.includeStatisticsInStretch&&("percent-clip"===r||"histogram-equalization"===r)&&e.statistics?.length&&(r="min-max");let i=!1;switch(r){case"none":i=!1;break;case"percent-clip":i=!s?.length;break;default:i=!l?.length}const{dataType:u}=e,m=1===a?.length&&F.has(u)?k:null,c=new o({stretchType:r,dynamicRangeAdjustment:i,colorRamp:m,outputMin:0,outputMax:255,gamma:1===a?.length?[1]:[1,1,1],useGamma:!1});return"percent-clip"===r?c.maxPercent=c.minPercent=S:"standard-deviation"===r&&(c.numberOfStandardDeviations=2),i||null==e.multidimensionalInfo&&!t?.includeStatisticsInStretch||("percent-clip"===r?c.histograms=s:"min-max"!==r&&"standard-deviation"!==r||(c.customStatistics=l?.map(e=>({...e})))),c}function U(e,t){const{multidimensionalInfo:n}=e;if(!t||!n)return e;const a=n.variables.find(e=>e.name===t);if(!a)return e;if(e=e.clone(),a){const{statistics:t,histograms:n}=a;t?.length&&(e.statistics=t.map(e=>({min:e.min,max:e.max,avg:e.avg,stddev:e.stddev}))),n?.length&&(e.histograms=n)}return e}function W(e){const t=e.bandCount;if(1===t)return null;if(2===t)return[0];const{bandInfos:n}=e;let a;if(n.length===t){const{red:e,green:t,blue:r,nir:l}=O(n);null!=e&&null!=t&&null!=r?a=[e,t,r]:null!=l&&null!=e&&null!=t&&(a=[l,e,t])}return!a&&t>=3&&(a=[0,1,2]),a}function D(e,t){const n=e.bandInfos.map(({name:e})=>e);return t?.length?t.map(e=>n[e]):n}function O(e){const t={};for(let n=0;n<e.length;n++){const a=e[n].name.toLowerCase();"red"===a?t.red=n:"green"===a?t.green=n:"blue"===a?t.blue=n:"nearinfrared"!==a&&"nearinfrared_1"!==a&&"nir"!==a||(t.nir=n)}if(null==t.blue||null==t.green||null==t.red||null==t.nir){const n=P(e);if(t.blue??=J(n,480),t.green??=J(n,550),t.red??=J(n,660),null==t.nir){const a=P(e,800);t.nir=J(a,810)??J(n,810)}}return t}function J(e,t,n=60){let a,r=n;for(const l of e){const e=Math.abs(l.wavelength-t);e<=r&&(r=e,a=l.index)}return a}function P(e,t){return e.map(({name:e,minWavelength:n,maxWavelength:a},r)=>{if(/thermal/i.test(e)||/pan/i.test(e))return null;if(null!=t&&null!=a&&a<t)return null;return{wavelength:null!=n&&null!=a?(n+a)/2:n??a??0,index:r}}).filter(e=>null!=e)}function G(e){let t="percent-clip";const{pixelType:n,dataType:a,histograms:r,statistics:l,multidimensionalInfo:s}=e,i=F.has(a)||"generic"===a&&null!=s;return"u8"!==n||"processed"!==a&&null!=r&&null!=l?"u8"===n||"elevation"===a||i?t="min-max":null!=r?t="percent-clip":null!=l&&(t="min-max"):t="none",t}function _(t,n,a,r){if(!g(t,n))return null;const{attributeTable:l,statistics:s}=t,i=H(l,n),o=Q(l,"red"),m=Q(l,"green"),f=Q(l,"blue"),d=new c,b=[],h=new Set,v=!!(o&&m&&f);if(null!=l)l.features.forEach(t=>{const n=t.attributes[i.name];if(!h.has(t.attributes[i.name])&&null!=n){h.add(n);const a=v&&("single"===o.type||"double"===o.type)&&("single"===m.type||"double"===m.type)&&("single"===f.type||"double"===f.type)&&!l.features.some(e=>e.attributes[o.name]>1||e.attributes[m.name]>1||e.attributes[f.name]>1),r=a?255:1;b.push(new C({value:t.attributes[i.name],label:t.attributes[i.name]+"",symbol:new T({style:"solid",outline:null,color:new e(v?[t.attributes[o.name]*r,t.attributes[m.name]*r,t.attributes[f.name]*r,1]:[0,0,0,0])})}))}});else if(s?.[0])for(let u=s[0].min;u<=s[0].max;u++)b.push(new C({value:u,label:u.toString(),symbol:new T({style:"solid",outline:null,color:new e([0,0,0,0])})}));if(b.sort((e,t)=>e.value&&"string"==typeof e.value.valueOf()?0:e.value>t.value?1:-1),!v){const t=p(L,{numColors:b.length});b.forEach((n,a)=>n.symbol.color=new e(t[a].slice(1,4))),d.colorRamp=L}if(a||r){const t=a||p(r,{numColors:b.length}).map(e=>e.slice(1));b.forEach((n,a)=>n.symbol.color=new e(t[a])),d.colorRamp=r}return new u({field:i.name,uniqueValueInfos:b,authoringInfo:d})}function H(e,t,n){let r;return null!=e?(r=t?e.fields.find(e=>t.toLowerCase()===e.name.toLowerCase()):K(e.fields),r||(n||(r=e.fields.find(e=>"string"===e.type)),r||(r=Q(e,"value")))):r=new a({name:"value"}),r}function K(e){let t;for(let n=0;n<e.length;n++){const a=e[n].name.toLowerCase();if("string"===e[n].type){if(a.startsWith("class")){t=e[n];break}null==t&&(a.endsWith("name")||a.endsWith("type"))&&(t=e[n])}}return t}function Q(e,t){return null==e?null:e.fields.find(e=>e.name.toLowerCase()===t)}function X(e){if(!h(e))return null;let t;const{attributeTable:n,colormap:a}=e;if(null!=n){const e=Q(n,"value"),a=H(n,null,!0);"string"===a.type&&(t={},n.features.forEach(n=>{const r=n.attributes;t[r[e.name]]=a?r[a.name]:r[e.name]}))}return s.createFromColormap(a,t)}function Y(e,n="traditional"){if(!y(e))return null;const{extent:a}=e,r=a.width*t(a.spatialReference);return new i({hillshadeType:n,scalingType:r>5e6?"adjusted":"none"})}function Z(e,t){e=U(e,t?.variableName);const{attributeTable:n}=e;if(!v(e))return null;const a=null!=e.histograms?e.histograms[0]:null,l=null!=t?.numClasses&&isFinite(t?.numClasses)?t.numClasses:5,s=new c({classificationMethod:t?.classificationMethod,colorRamp:t?.colorRamp});let i=t?.field||"value";const o=[],u=[],m=1e3,d=null!=n,b=d&&n.fields.find(e=>"count"===e.name.toLowerCase()),h=d?n.fields.find(e=>e.name.toLowerCase()===i.toLowerCase()):void 0;if(h&&d){i=h.name;const e=n.features.length;let t=0;n.features.forEach(n=>t+=(b?n.attributes[b.name]:50)/e),n.features.forEach(n=>{const a=n.attributes[h.name],r=b?n.attributes[b.name]:50;if(r>0){u.push(r);const n=Math.max(1,Math.round(r/e/t*m));for(let e=0;e<n;e++)o.push(a)}})}else{const{pixelType:t}=e,r=(a.max-a.min)/a.size,l=t.includes("s")||t.includes("u"),s=l&&1===r?Math.floor(a.min+.5):a.min,i=l&&1===r?Math.floor(a.max-.5):a.max,c=a.size;let f,p=0;a.counts.forEach(e=>p+=e/c),a.counts.forEach((e,t)=>{if(e>0){u.push(e);const l=Math.max(1,Math.round(e/c/p*m));f=d?n.features[t].attributes[h.name]:0===t?s:t===c-1?i:a.min+r*(t+.5);for(let e=0;e<l;e++)o.push(f)}})}const g=t?.classificationMethod||"natural-breaks";let y=t?.definedInterval;"defined-interval"!==g||y||(y=$(e,h,l));const w=V({values:o,valueFrequency:u,normalizationTotal:null,definition:new j({classificationMethod:g,breakCount:l,definedInterval:y})});let C=t?.colors;if(!C){const e=t?.colorRamp||k;s.colorRamp=e;const n=p(e,{numColors:w.classBreaks.length,interpolateAlpha:!0});C=n.map(e=>e.slice(1))}const x=w.classBreaks.map((e,t)=>new f({minValue:e.minValue,maxValue:e.maxValue,label:e.label,symbol:new T({color:C[t]})}));return new r({field:i,classBreakInfos:x,authoringInfo:s})}function $(e,t,n){let a=0,r=0;if(null!=e.attributeTable){const n=e.attributeTable;a=r=n.features[0].attributes[t.name],n.features.forEach(e=>{const n=e.attributes[t.name];n<a&&(a=n),n>r&&(r=n)})}else if(null!=e.histograms){const t=e.histograms;a=t[0].min,r=t[0].max}return(r-a)/n}const ee=new Map([["m/s","meter-per-second"],["km/h","kilometer-per-hour"],["knots","knots"],["ft/s","feet-per-second"],["mph","mile-per-hour"]]);function te(e){if(!b(e))return null;let t;if(null!=e.statistics&&e.statistics.length&&("vector-magdir"===e.dataType||"vector-uv"===e.dataType)){const{minMagnitude:n,maxMagnitude:a}=le(e.dataType,e.statistics);t=[new M({field:"Magnitude",minSize:10,maxSize:40,minDataValue:n,maxDataValue:a})]}const n=null!=e.multidimensionalInfo?ee.get(e.multidimensionalInfo.variables[0].unit):void 0,a=new m({visualVariables:t,inputUnit:n,rotationType:"geographic"});return a.visualVariables=[...a.sizeVariables,...a.rotationVariables],a}function ne(e){return{color:e.symbolLayers[0].material?.color,type:"esriSFS",style:"esriSFSSolid"}}function ae(e){if("uniqueValue"===e.type){const t=e.uniqueValueInfos,n=t?.[0].symbol;return n?.symbolLayers?.length&&(e.uniqueValueInfos=t?.map(e=>({value:e.value,label:e.label,symbol:e.symbol?ne(e.symbol):null}))),e}if("classBreaks"===e.type){const t=e.classBreakInfos,n=t[0].symbol;return n?.symbolLayers?.length&&(e.classBreakInfos=t.map(e=>({classMinValue:e.classMinValue,classMaxValue:e.classMaxValue,label:e.label,symbol:e.symbol?ne(e.symbol):null}))),e}return e}function re(t){if(!w(t))return null;let n;if(null!=t.statistics&&t.statistics.length>0&&("vector-magdir"===t.dataType||"vector-uv"===t.dataType)){const{minMagnitude:a,maxMagnitude:r}=le(t.dataType,t.statistics);n=[new x({field:"Magnitude",stops:[new R({value:a,color:new e("#1020c0")}),new R({value:r,color:new e("#c02010")})]})]}return new l({visualVariables:n})}function le(e,t){let n,a;if("vector-magdir"===e)n=t[0].min,a=t[0].max;else{const e=t[0].min,r=t[0].max,l=t[1].min,s=t[1].max;n=0,a=Math.max(Math.abs(e),Math.abs(l),Math.abs(r),Math.abs(s))}return{minMagnitude:n,maxMagnitude:a}}export{Z as createClassBreaksRenderer,X as createColormapRenderer,q as createDefaultRenderer,re as createFlowRenderer,Y as createShadedReliefRenderer,A as createStretchRenderer,_ as createUVRenderer,te as createVectorFieldRenderer,le as estimateMagnitudeRange,D as getBandNames,H as getClassField,W as getDefaultBandCombination,N as getDefaultInterpolation,$ as getDefinedInterval,Q as getField,z as getFunctionColorRamp,B as getSupportedRendererTypes,U as getVariableRasterInfo,O as getWellKnownBandIndexes,E as matchPresetRenderer,ae as normalizeRendererJSON};