UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.84 kB
import{isNone as e,isSome as o}from"../../../../core/maybe.js";import r from"../../../../renderers/PointCloudClassBreaksRenderer.js";import t from"../../../../renderers/PointCloudStretchRenderer.js";import l from"../../../../renderers/PointCloudUniqueValueRenderer.js";import{createGeometryIndexFromSchema as n,createTypedView as s,readBinaryAttribute as i}from"./I3SBinaryReader.js";import{decodeXYZ as u}from"./LEPCC.js";function f(e,o,n,s){const{rendererJSON:i,isRGBRenderer:u}=e;let f=null,c=null;if(o&&u)f=o;else if(o&&"pointCloudUniqueValueRenderer"===i?.type){c=l.fromJSON(i);const e=c.colorUniqueValueInfos;f=new Uint8Array(3*s);const r=b(c.fieldTransformType);for(let t=0;t<s;t++){const l=(r?r(o[t]):o[t])+"";for(let o=0;o<e.length;o++)if(e[o].values.includes(l)){f[3*t]=e[o].color.r,f[3*t+1]=e[o].color.g,f[3*t+2]=e[o].color.b;break}}}else if(o&&"pointCloudStretchRenderer"===i?.type){c=t.fromJSON(i);const e=c.stops;f=new Uint8Array(3*s);const r=b(c.fieldTransformType);for(let t=0;t<s;t++){const l=r?r(o[t]):o[t],n=e.length-1;if(l<e[0].value)f[3*t]=e[0].color.r,f[3*t+1]=e[0].color.g,f[3*t+2]=e[0].color.b;else if(l>=e[n].value)f[3*t]=e[n].color.r,f[3*t+1]=e[n].color.g,f[3*t+2]=e[n].color.b;else for(let o=1;o<e.length;o++)if(l<e[o].value){const r=(l-e[o-1].value)/(e[o].value-e[o-1].value);f[3*t]=e[o].color.r*r+e[o-1].color.r*(1-r),f[3*t+1]=e[o].color.g*r+e[o-1].color.g*(1-r),f[3*t+2]=e[o].color.b*r+e[o-1].color.b*(1-r);break}}}else if(o&&"pointCloudClassBreaksRenderer"===i?.type){c=r.fromJSON(i);const e=c.colorClassBreakInfos;f=new Uint8Array(3*s);const t=b(c.fieldTransformType);for(let r=0;r<s;r++){const l=t?t(o[r]):o[r];for(let o=0;o<e.length;o++)if(l>=e[o].minValue&&l<=e[o].maxValue){f[3*r]=e[o].color.r,f[3*r+1]=e[o].color.g,f[3*r+2]=e[o].color.b;break}}}else{f=new Uint8Array(3*s);for(let e=0;e<f.length;e++)f[e]=255}if(n&&c&&c.colorModulation){const e=c.colorModulation.minValue,o=c.colorModulation.maxValue,r=.3;for(let t=0;t<s;t++){const l=n[t],s=l>=o?1:l<=e?r:r+(1-r)*(l-e)/(o-e);f[3*t]=s*f[3*t],f[3*t+1]=s*f[3*t+1],f[3*t+2]=s*f[3*t+2]}}return f}function c(o,r){if(null==o.encoding||""===o.encoding){const t=n(r,o);if(e(t.vertexAttributes.position))return;const l=s(r,t.vertexAttributes.position),i=t.header.fields,u=[i.offsetX,i.offsetY,i.offsetZ],f=[i.scaleX,i.scaleY,i.scaleZ],c=l.length/3,a=new Float64Array(3*c);for(let e=0;e<c;e++)a[3*e]=l[3*e]*f[0]+u[0],a[3*e+1]=l[3*e+1]*f[1]+u[1],a[3*e+2]=l[3*e+2]*f[2]+u[2];return a}if("lepcc-xyz"===o.encoding)return u(r).result}function a(e,r,t){return o(e)&&e.attributeInfo.useElevation?r?d(r,t):null:o(e)&&e.attributeInfo.storageInfo?i(e.attributeInfo.storageInfo,e.buffer,t):null}function d(e,o){const r=new Float64Array(o);for(let t=0;t<o;t++)r[t]=e[3*t+2];return r}function m(e,o,r,t,l){const n=e.length/3;let s=0;for(let i=0;i<n;i++){let n=!0;for(let e=0;e<t.length&&n;e++){const{filterJSON:o}=t[e],r=l[e].values[i];switch(o.type){case"pointCloudValueFilter":{const e="exclude"===o.mode;o.values.includes(r)===e&&(n=!1);break}case"pointCloudBitfieldFilter":{const e=p(o.requiredSetBits),t=p(o.requiredClearBits);(r&e)===e&&0==(r&t)||(n=!1);break}case"pointCloudReturnFilter":{const e=15&r,t=r>>>4&15,l=t>1,s=1===e,i=e===t;let u=!1;for(const r of o.includedReturns)if("last"===r&&i||"firstOfMany"===r&&s&&l||"lastOfMany"===r&&i&&l||"single"===r&&!l){u=!0;break}u||(n=!1);break}}}n&&(r[s]=i,e[3*s]=e[3*i],e[3*s+1]=e[3*i+1],e[3*s+2]=e[3*i+2],o[3*s]=o[3*i],o[3*s+1]=o[3*i+1],o[3*s+2]=o[3*i+2],s++)}return s}function b(e){return null==e||"none"===e?null:"low-four-bit"===e?e=>15&e:"high-four-bit"===e?e=>(240&e)>>4:"absolute-value"===e?e=>Math.abs(e):"modulo-ten"===e?e=>e%10:null}function p(e){let o=0;for(const r of e||[])o|=1<<r;return o}export{d as elevationFromPositions,f as evaluateRenderer,m as filterInPlace,a as getAttributeValues,c as readGeometry};