UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 5.46 kB
import e from"../../../../core/pbf.js";import{isAborted as t}from"../../../../core/promiseUtils.js";import{loadLibtess as r}from"../../../../geometry/libtess.js";import{TileClipper as s,SimpleBuilder as i}from"../../../../geometry/support/TileClipper.js";import o from"./Feature.js";import{TriangleIndexBuffer as n}from"./IndexMemoryBuffer.js";import c from"./SourceLayerData.js";import{FillVertexBuffer as l,OutlineVertexBuffer as a,LineVertexBuffer as u,CircleVertexBuffer as f,SymbolVertexBuffer as p}from"./VertexMemoryBuffer.js";import h from"./buckets/CircleBucket.js";import m from"./buckets/FillBucket.js";import _ from"./buckets/LineBucket.js";import y from"./buckets/SymbolBucket.js";import{StyleLayerType as d}from"./style/StyleDefinition.js";import{TileStatus as k}from"../../tiling/enums.js";const T=8,g=14,w=5;class B{constructor(t,r,o,n,c){if(this._pbfTiles={},this._tileClippers={},this._client=o,this._tile=r,c){this._styleLayerUIDs=new Set;for(const e of c)this._styleLayerUIDs.add(e)}this._styleRepository=n,this._layers=this._styleRepository?.layers??[];const[l,a,u]=r.tileKey.split("/").map(parseFloat);this._level=l;const f=T+Math.max((this._level-g)*w,0);for(const p of Object.keys(t)){const r=t[p];this._pbfTiles[p]=new e(new Uint8Array(r.protobuff),new DataView(r.protobuff));if(r.refKey){const[e]=r.refKey.split("/").map(parseFloat),t=l-e;if(t>0){const e=(1<<t)-1,r=a&e,i=u&e;this._tileClippers[p]=new s(t,r,i,8,f)}}this._tileClippers[p]||(this._tileClippers[p]=new i)}}_canParseStyleLayer(e){return!this._styleLayerUIDs||this._styleLayerUIDs.has(e)}async parse(e){const t=r(),s=this._initialize(e),{returnedBuckets:i}=s;this._processLayers(s),this._linkReferences(s),this._filterFeatures(s);const o=[],n=new Set,c=(e,t)=>{n.has(e)||(o.push({name:e,repeat:t}),n.add(e))},l={};for(const r of i)r.getResources(r.tileClipper,c,l);if(this._tile.status===k.INVALID)return[];const a=this._fetchResources(o,l,e);return Promise.all([...a,t]).then((()=>this._processFeatures(s.returnedBuckets)))}_initialize(e){return{signal:e&&e.signal,sourceNameToTileData:this._parseTileData(this._pbfTiles),layers:this._layers,zoom:this._level,sourceNameToTileClipper:this._tileClippers,sourceNameToUniqueSourceLayerBuckets:{},sourceNameToUniqueSourceLayers:{},returnedBuckets:[],layerIdToBucket:{},referencerUIDToReferencedId:new Map}}_processLayers(e){const{sourceNameToTileData:t,layers:r,zoom:s,sourceNameToTileClipper:i,sourceNameToUniqueSourceLayerBuckets:o,sourceNameToUniqueSourceLayers:n,returnedBuckets:c,layerIdToBucket:l,referencerUIDToReferencedId:a}=e;for(let u=r.length-1;u>=0;u--){const e=r[u];if(!this._canParseStyleLayer(e.uid)||e.minzoom&&s<Math.floor(e.minzoom)||e.maxzoom&&s>=e.maxzoom||e.type===d.BACKGROUND)continue;if(!t[e.source]||!i[e.source])continue;const f=t[e.source],p=i[e.source],h=e.sourceLayer,m=f[h];if(m){let t=n[e.source];if(t||(t=n[e.source]=new Set),t.add(e.sourceLayer),e.refLayerId)a.set(e.uid,e.refLayerId);else{const t=this._createBucket(e);if(t){t.layerUIDs=[e.uid],t.layerExtent=m.extent,t.tileClipper=p;let r=o[e.source];r||(r=o[e.source]={});let s=r[h];s||(s=r[h]=[]),s.push(t),c.push(t),l[e.id]=t}}}}}_linkReferences(e){const{layerIdToBucket:t,referencerUIDToReferencedId:r}=e;r.forEach(((e,r)=>{t[e]&&t[e].layerUIDs.push(r)}))}_filterFeatures(e){const{signal:r,sourceNameToTileData:s,sourceNameToUniqueSourceLayerBuckets:i,sourceNameToUniqueSourceLayers:n}=e,c=10*this._level,l=10*(this._level+1),a=[],u=[];for(const t of Object.keys(n)){n[t].forEach((e=>{a.push(e),u.push(t)}))}for(let f=0;f<a.length;f++){const e=u[f],n=a[f];if(!s[e]||!i[e])continue;const p=s[e][n],h=i[e][n];if(!h||0===h.length)continue;if(t(r))return;const m=p.getData();for(;m.nextTag(2);){const e=m.getMessage(),t=new o(e,p);e.release();const r=t.values;if(r){const e=r._minzoom;if(e&&e>=l)continue;const t=r._maxzoom;if(t&&t<=c)continue}for(const s of h)s.pushFeature(t)}}}_fetchResources(e,t,r){const s=[],i=this._tile.getWorkerTileHandler();let o,n;e.length>0&&(o=i.fetchSprites(e,this._client,r),s.push(o));for(const c in t){const e=t[c];e.size>0&&(n=i.fetchGlyphs(this._tile.tileKey,c,e,this._client,r),s.push(n))}return s}_processFeatures(e){const t=e.filter((e=>e.hasFeatures()||this._canParseStyleLayer(e.layer.uid)));for(const r of t)r.processFeatures(r.tileClipper);return t}_parseTileData(e){const t={};for(const r of Object.keys(e)){const s=e[r],i={};for(;s.next();)switch(s.tag()){case 3:{const e=s.getMessage(),t=new c(e);e.release(),i[t.name]=t;break}default:s.skip()}t[r]=i}return t}_createBucket(e){switch(e.type){case d.BACKGROUND:return null;case d.FILL:return this._createFillBucket(e);case d.LINE:return this._createLineBucket(e);case d.CIRCLE:return this._createCircleBucket(e);case d.SYMBOL:return this._createSymbolBucket(e)}}_createFillBucket(e){return new m(e,this._level,this._tile.getWorkerTileHandler().getSpriteItems(),new l(e.fillMaterial.getStride()),new n,new a(e.outlineMaterial.getStride()),new n)}_createLineBucket(e){return new _(e,this._level,this._tile.getWorkerTileHandler().getSpriteItems(),new u(e.lineMaterial.getStride()),new n)}_createCircleBucket(e){return new h(e,this._level,this._tile.getWorkerTileHandler().getSpriteItems(),new f(e.circleMaterial.getStride()),new n)}_createSymbolBucket(e){const t=this._tile;return new y(e,this._level,new p(e.iconMaterial.getStride()),new n,new p(e.textMaterial.getStride()),new n,t.placementEngine,t.getWorkerTileHandler())}}export{B as default};