UNPKG

@mapgis/geojson-vt

Version:

Slice GeoJSON data into vector tiles efficiently

2 lines (1 loc) 11.1 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("proj4")):"function"==typeof define&&define.amd?define(["proj4"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).geojsonvt=e(t.proj4)}(this,(function(t){"use strict";function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t),i=function(t,e,i,r,o){if(this.bounds=i,this.width=r,this.height=o,!e)throw new Error("自定义参考系必须指定参数系信息def");if(!n.default)throw new Error("proj4对象不存在,自定义投影必须引入proj4对象");var a=this._isProj4Obj(t);this._proj=a?t:this._projFromCodeDef(t,e)};function r(t,e,n,i,r,o){var a=r-n,l=o-i;if(0!==a||0!==l){var s=((t-n)*a+(e-i)*l)/(a*a+l*l);s>1?(n=r,i=o):s>0&&(n+=a*s,i+=l*s)}return(a=t-n)*a+(l=e-i)*l}function o(t,e,n,i){var r={id:null==t?null:t,type:e,geometry:n,tags:i,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};if("Point"===e||"MultiPoint"===e||"LineString"===e)a(r,n);else if("Polygon"===e)a(r,n[0]);else if("MultiLineString"===e)for(var o=0,l=n;o<l.length;o+=1){a(r,l[o])}else if("MultiPolygon"===e)for(var s=0,u=n;s<u.length;s+=1){a(r,u[s][0])}return r}function a(t,e){for(var n=0;n<e.length;n+=3)t.minX=Math.min(t.minX,e[n]),t.minY=Math.min(t.minY,e[n+1]),t.maxX=Math.max(t.maxX,e[n]),t.maxY=Math.max(t.maxY,e[n+1])}function l(t,e,n,r){if(e.geometry){var a,h=n.crs,m=n.projectionParams;if(m&&m.def){var g=m.code,p=m.def,d=m.bounds,c=m.width,v=m.height;a=new i(g,p,d,c,v)}var x=e.geometry.coordinates,y=e.geometry.type,M=Math.pow(n.tolerance/((1<<n.maxZoom)*n.extent),2),P=[],w=e.id;if(n.promoteId?w=e.properties[n.promoteId]:n.generateId&&(w=r||0),"Point"===y)s(x,P,h,a);else if("MultiPoint"===y)for(var S=0,b=x;S<b.length;S+=1){s(b[S],P,h,a)}else if("LineString"===y)u(x,P,M,!1,h,a);else if("MultiLineString"===y){if(n.lineMetrics){for(var j=0,Y=x;j<Y.length;j+=1){u(Y[j],P=[],M,!1,h,a),t.push(o(w,"LineString",P,e.properties))}return}f(x,P,M,!1,h,a)}else if("Polygon"===y)f(x,P,M,!0,h,a);else{if("MultiPolygon"!==y){if("GeometryCollection"===y){for(var X=0,L=e.geometry.geometries;X<L.length;X+=1){l(t,{id:w,geometry:L[X],properties:e.properties},n,r)}return}throw new Error("Input data is not a valid GeoJSON object.")}for(var z=0,E=x;z<E.length;z+=1){var Z=[];f(E[z],Z,M,!0,h,a),P.push(Z)}}t.push(o(w,y,P,e.properties))}}function s(t,e,n,i){var r=h(t,n,i);e.push(r[0],r[1],0)}function u(t,e,n,i,o,a){for(var l,s,u=0,f=0;f<t.length;f++){var m=h(t[f],o,a),g=m[0],p=m[1];e.push(g,p,0),f>0&&(u+=i?(l*p-g*s)/2:Math.sqrt(Math.pow(g-l,2)+Math.pow(p-s,2))),l=g,s=p}var d=e.length-3;e[2]=1,function t(e,n,i,o){for(var a,l=o,s=i-n>>1,u=i-n,f=e[n],h=e[n+1],m=e[i],g=e[i+1],p=n+3;p<i;p+=3){var d=r(e[p],e[p+1],f,h,m,g);if(d>l)a=p,l=d;else if(d===l){var c=Math.abs(p-s);c<u&&(a=p,u=c)}}l>o&&(a-n>3&&t(e,n,a,o),e[a+2]=l,i-a>3&&t(e,a,i,o))}(e,0,d,n),e[d+2]=1,e.size=Math.abs(u),e.start=0,e.end=e.size}function f(t,e,n,i,r,o){for(var a=0;a<t.length;a++){var l=[];u(t[a],l,n,i,r,o),e.push(l)}}function h(t,e,n){var i=t[0],r=t[1],o=[];if(n)o=n.project([i,r]);else if("EPSG:3857"===e){var a=t[0],l=t[1],s=a/360+.5,u=Math.sin(l*Math.PI/180);o=[s,.5-.25*Math.log((1+u)/(1-u))/Math.PI]}else{if("EPSG:4326"!==e)throw new Error("未预定义投影转换方法");o=[t[0]/360+.5,(90-t[1])/360]}return o}function m(t,e,n,i,r,a,l,s){if(i/=e,a>=(n/=e)&&l<i)return t;if(l<n||a>=i)return null;for(var u=[],f=0,h=t;f<h.length;f+=1){var m=h[f],d=m.geometry,v=m.type,x=0===r?m.minX:m.minY,y=0===r?m.maxX:m.maxY;if(x>=n&&y<i)u.push(m);else if(!(y<n||x>=i)){var M=[];if("Point"===v||"MultiPoint"===v)g(d,M,n,i,r);else if("LineString"===v)p(d,M,n,i,r,!1,s.lineMetrics);else if("MultiLineString"===v)c(d,M,n,i,r,!1);else if("Polygon"===v)c(d,M,n,i,r,!0);else if("MultiPolygon"===v)for(var P=0,w=d;P<w.length;P+=1){var S=[];c(w[P],S,n,i,r,!0),S.length&&M.push(S)}if(M.length){if(s.lineMetrics&&"LineString"===v){for(var b=0,j=M;b<j.length;b+=1){var Y=j[b];u.push(o(m.id,v,Y,m.tags))}continue}"LineString"!==v&&"MultiLineString"!==v||(1===M.length?(v="LineString",M=M[0]):v="MultiLineString"),"Point"!==v&&"MultiPoint"!==v||(v=3===M.length?"Point":"MultiPoint"),u.push(o(m.id,v,M,m.tags))}}}return u.length?u:null}function g(t,e,n,i,r){for(var o=0;o<t.length;o+=3){var a=t[o+r];a>=n&&a<=i&&v(e,t[o],t[o+1],t[o+2])}}function p(t,e,n,i,r,o,a){for(var l,s,u=d(t),f=0===r?x:y,h=t.start,m=0;m<t.length-3;m+=3){var g=t[m],p=t[m+1],c=t[m+2],M=t[m+3],P=t[m+4],w=0===r?g:p,S=0===r?M:P,b=!1;a&&(l=Math.sqrt(Math.pow(g-M,2)+Math.pow(p-P,2))),w<n?S>n&&(s=f(u,g,p,M,P,n),a&&(u.start=h+l*s)):w>i?S<i&&(s=f(u,g,p,M,P,i),a&&(u.start=h+l*s)):v(u,g,p,c),S<n&&w>=n&&(s=f(u,g,p,M,P,n),b=!0),S>i&&w<=i&&(s=f(u,g,p,M,P,i),b=!0),!o&&b&&(a&&(u.end=h+l*s),e.push(u),u=d(t)),a&&(h+=l)}var j=t.length-3,Y=t[j],X=t[j+1],L=t[j+2],z=0===r?Y:X;z>=n&&z<=i&&v(u,Y,X,L),j=u.length-3,o&&j>=3&&(u[j]!==u[0]||u[j+1]!==u[1])&&v(u,u[0],u[1],u[2]),u.length&&e.push(u)}function d(t){var e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function c(t,e,n,i,r,o){for(var a=0,l=t;a<l.length;a+=1){p(l[a],e,n,i,r,o,!1)}}function v(t,e,n,i){t.push(e,n,i)}function x(t,e,n,i,r,o){var a=(o-e)/(i-e);return v(t,o,n+(r-n)*a,1),a}function y(t,e,n,i,r,o){var a=(o-n)/(r-n);return v(t,e+(i-e)*a,o,1),a}function M(t,e){if(t.transformed)return t;for(var n=1<<t.z,i=t.x,r=t.y,o=0,a=t.features;o<a.length;o+=1){var l=a[o],s=l.geometry,u=l.type;if(l.geometry=[],1===u)for(var f=0;f<s.length;f+=2)l.geometry.push(P(s[f],s[f+1],e,n,i,r));else for(var h=0;h<s.length;h++){for(var m=[],g=0;g<s[h].length;g+=2)m.push(P(s[h][g],s[h][g+1],e,n,i,r));l.geometry.push(m)}}return t.transformed=!0,t}function P(t,e,n,i,r,o){return[Math.round(n*(t*i-r)),Math.round(n*(e*i-o))]}function w(t,e,n,i,r){for(var o=e===r.maxZoom?0:r.tolerance/((1<<e)*r.extent),a={features:[],numPoints:0,numSimplified:0,numFeatures:t.length,source:null,x:n,y:i,z:e,transformed:!1,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0},l=0,s=t;l<s.length;l+=1){S(a,s[l],o,r)}return a}function S(t,e,n,i){var r=e.geometry,o=e.type,a=[];if(t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),"Point"===o||"MultiPoint"===o)for(var l=0;l<r.length;l+=3)a.push(r[l],r[l+1]),t.numPoints++,t.numSimplified++;else if("LineString"===o)b(a,r,t,n,!1,!1);else if("MultiLineString"===o||"Polygon"===o)for(var s=0;s<r.length;s++)b(a,r[s],t,n,"Polygon"===o,0===s);else if("MultiPolygon"===o)for(var u=0;u<r.length;u++)for(var f=r[u],h=0;h<f.length;h++)b(a,f[h],t,n,!0,0===h);if(a.length){var m=e.tags||null;if("LineString"===o&&i.lineMetrics){for(var g in m={},e.tags)m[g]=e.tags[g];m.mapbox_clip_start=r.start/r.size,m.mapbox_clip_end=r.end/r.size}var p={geometry:a,type:"Polygon"===o||"MultiPolygon"===o?3:"LineString"===o||"MultiLineString"===o?2:1,tags:m};null!==e.id&&(p.id=e.id),t.features.push(p)}}function b(t,e,n,i,r,o){var a=i*i;if(i>0&&e.size<(r?a:i))n.numPoints+=e.length/3;else{for(var l=[],s=0;s<e.length;s+=3)(0===i||e[s+2]>a)&&(n.numSimplified++,l.push(e[s],e[s+1])),n.numPoints++;r&&function(t,e){for(var n=0,i=0,r=t.length,o=r-2;i<r;o=i,i+=2)n+=(t[i]-t[o])*(t[i+1]+t[o+1]);if(n>0===e)for(var a=0,l=t.length;a<l/2;a+=2){var s=t[a],u=t[a+1];t[a]=t[l-2-a],t[a+1]=t[l-1-a],t[l-2-a]=s,t[l-1-a]=u}}(l,o),t.push(l)}}i.prototype.project=function(t){var e,n;Array.isArray(t)?(e=t[0],n=t[1]):(e=t.lng,n=t.lat);var i=this._proj.forward([e,n]),r=this.bounds;return[(i[0]-r[0])/this.width,(r[3]-i[1])/this.height]},i.prototype.unproject=function(t){var e,n;return Array.isArray(t)?(e=t[0],n=t[1]):(e=t.x,n=t.y),this._proj.inverse([e,n])},i.prototype._projFromCodeDef=function(t,e){if(e)n.default.defs(t,e);else if(void 0===n.default.defs[t]){var i=t.split(":");if(i.length>3&&(t=i[i.length-3]+":"+i[i.length-1]),void 0===n.default.defs[t])throw new Error("No projection definition for code "+t)}return n.default(t)},i.prototype._isProj4Obj=function(t){return void 0!==t.inverse&&void 0!==t.forward};var j={crs:"EPSG:3857",maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,debug:0,isWrapData:!1},Y=function(t,e){var n=(e=this.options=function(t,e){for(var n in e)t[n]=e[n];return t}(Object.create(j),e)).debug;if(n&&console.time("preprocess data"),e.maxZoom<0||e.maxZoom>24)throw new Error("maxZoom should be in the 0-24 range");if(e.promoteId&&e.generateId)throw new Error("promoteId and generateId cannot be used together.");var i=function(t,e){var n=[];if("FeatureCollection"===t.type)for(var i=0;i<t.features.length;i++)l(n,t.features[i],e,i);else"Feature"===t.type?l(n,t,e):l(n,{geometry:t},e);return n}(t,e);this.features=i,this.tiles={},this.tileCoords=[],n&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",e.indexMaxZoom,e.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0)};function X(t,e,n){return e.toString(36)+n.toString(36)+t.toString(36)}return Y.prototype.splitTile=function(t,e,n,i,r,o,a){for(var l=[t,e,n,i],s=this.options,u=s.debug;l.length;){i=l.pop(),n=l.pop(),e=l.pop(),t=l.pop();var f=1<<e,h=X(e,n,i),g=this.tiles[h];if(!g&&(u>1&&console.time("creation"),g=this.tiles[h]=w(t,e,n,i,s),this.tileCoords.push({z:e,x:n,y:i}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,n,i,g.numFeatures,g.numPoints,g.numSimplified),console.timeEnd("creation"));var p="z"+e;this.stats[p]=(this.stats[p]||0)+1,this.total++}if(g.source=t,null==r){if(e===s.indexMaxZoom||g.numPoints<=s.indexMaxPoints)continue}else{if(e===s.maxZoom||e===r)continue;if(null!=r){var d=r-e;if(n!==o>>d||i!==a>>d)continue}}if(g.source=null,0!==t.length){u>1&&console.time("clipping");var c=.5*s.buffer/s.extent,v=.5-c,x=.5+c,y=1+c,M=null,P=null,S=null,b=null,j=m(t,f,n-c,n+x,0,g.minX,g.maxX,s),Y=m(t,f,n+v,n+y,0,g.minX,g.maxX,s);t=null,j&&(M=m(j,f,i-c,i+x,1,g.minY,g.maxY,s),P=m(j,f,i+v,i+y,1,g.minY,g.maxY,s),j=null),Y&&(S=m(Y,f,i-c,i+x,1,g.minY,g.maxY,s),b=m(Y,f,i+v,i+y,1,g.minY,g.maxY,s),Y=null),u>1&&console.timeEnd("clipping"),l.push(M||[],e+1,2*n,2*i),l.push(P||[],e+1,2*n,2*i+1),l.push(S||[],e+1,2*n+1,2*i),l.push(b||[],e+1,2*n+1,2*i+1)}}},Y.prototype._createZeroTile=function(t,e,n){var i,r=.5*n.buffer/n.extent,o=X(0,t,e),a=1*t,l=1*(t+1),s=1*e,u=1*(e+1),f=m(this.features,1,a-r,l+r,0,-1/0,1/0,n);if(f){var h=m(f,1,s-r,u+r,1,-1/0,1/0,n);h&&(this.tiles[o]=M(w(h,0,t,e,n),n.extent),this.tiles[o].source=h,i=this.tiles[o])}return i},Y.prototype.getTile=function(t,e,n){t=+t,e=+e,n=+n;var i=this.options,r=i.extent,o=i.debug;if(t<0||t>24)return null;var a=X(t,e,n);if(this.tiles[a])return M(this.tiles[a],r);if(0===t)return this._createZeroTile(e,n,i);o>1&&console.log("drilling down to z%d-%d-%d",t,e,n);for(var l,s=t,u=e,f=n;!l&&s>0;){var h=X(--s,u>>=1,f>>=1);l=this.tiles[h],0!==s||l||(l=this._createZeroTile(u,f,i))}return l&&l.source?(o>1&&(console.log("found parent tile z%d-%d-%d",s,u,f),console.time("drilling down")),this.splitTile(l.source,s,u,f,t,e,n),o>1&&console.timeEnd("drilling down"),this.tiles[a]?M(this.tiles[a],r):null):null},function(t,e){return new Y(t,e)}}));