404 lines
11 KiB
JavaScript
404 lines
11 KiB
JavaScript
goog.provide('ol.ext.vectortile');
|
|
/** @typedef {function(*)} */
|
|
ol.ext.vectortile;
|
|
(function() {
|
|
var exports = {};
|
|
var module = {exports: exports};
|
|
var define;
|
|
/**
|
|
* @fileoverview
|
|
* @suppress {accessControls, ambiguousFunctionDecl, checkDebuggerStatement, checkRegExp, checkTypes, checkVars, const, constantProperty, deprecated, duplicate, es5Strict, fileoverviewTags, missingProperties, nonStandardJsDocs, strictModuleDepCheck, suspiciousCode, undefinedNames, undefinedVars, unknownDefines, uselessCode, visibility}
|
|
*/
|
|
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.vectortile = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|
module.exports.VectorTile = require('./lib/vectortile.js');
|
|
module.exports.VectorTileFeature = require('./lib/vectortilefeature.js');
|
|
module.exports.VectorTileLayer = require('./lib/vectortilelayer.js');
|
|
|
|
},{"./lib/vectortile.js":2,"./lib/vectortilefeature.js":3,"./lib/vectortilelayer.js":4}],2:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var VectorTileLayer = require('./vectortilelayer');
|
|
|
|
module.exports = VectorTile;
|
|
|
|
function VectorTile(pbf, end) {
|
|
this.layers = pbf.readFields(readTile, {}, end);
|
|
}
|
|
|
|
function readTile(tag, layers, pbf) {
|
|
if (tag === 3) {
|
|
var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos);
|
|
if (layer.length) layers[layer.name] = layer;
|
|
}
|
|
}
|
|
|
|
|
|
},{"./vectortilelayer":4}],3:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var Point = require('point-geometry');
|
|
|
|
module.exports = VectorTileFeature;
|
|
|
|
function VectorTileFeature(pbf, end, extent, keys, values) {
|
|
// Public
|
|
this.properties = {};
|
|
this.extent = extent;
|
|
this.type = 0;
|
|
|
|
// Private
|
|
this._pbf = pbf;
|
|
this._geometry = -1;
|
|
this._keys = keys;
|
|
this._values = values;
|
|
|
|
pbf.readFields(readFeature, this, end);
|
|
}
|
|
|
|
function readFeature(tag, feature, pbf) {
|
|
if (tag == 1) feature._id = pbf.readVarint();
|
|
else if (tag == 2) readTag(pbf, feature);
|
|
else if (tag == 3) feature.type = pbf.readVarint();
|
|
else if (tag == 4) feature._geometry = pbf.pos;
|
|
}
|
|
|
|
function readTag(pbf, feature) {
|
|
var end = pbf.readVarint() + pbf.pos;
|
|
|
|
while (pbf.pos < end) {
|
|
var key = feature._keys[pbf.readVarint()],
|
|
value = feature._values[pbf.readVarint()];
|
|
feature.properties[key] = value;
|
|
}
|
|
}
|
|
|
|
VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
|
|
|
|
VectorTileFeature.prototype.loadGeometry = function() {
|
|
var pbf = this._pbf;
|
|
pbf.pos = this._geometry;
|
|
|
|
var end = pbf.readVarint() + pbf.pos,
|
|
cmd = 1,
|
|
length = 0,
|
|
x = 0,
|
|
y = 0,
|
|
lines = [],
|
|
line;
|
|
|
|
while (pbf.pos < end) {
|
|
if (!length) {
|
|
var cmdLen = pbf.readVarint();
|
|
cmd = cmdLen & 0x7;
|
|
length = cmdLen >> 3;
|
|
}
|
|
|
|
length--;
|
|
|
|
if (cmd === 1 || cmd === 2) {
|
|
x += pbf.readSVarint();
|
|
y += pbf.readSVarint();
|
|
|
|
if (cmd === 1) { // moveTo
|
|
if (line) lines.push(line);
|
|
line = [];
|
|
}
|
|
|
|
line.push(new Point(x, y));
|
|
|
|
} else if (cmd === 7) {
|
|
|
|
// Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
|
|
if (line) {
|
|
line.push(line[0].clone()); // closePolygon
|
|
}
|
|
|
|
} else {
|
|
throw new Error('unknown command ' + cmd);
|
|
}
|
|
}
|
|
|
|
if (line) lines.push(line);
|
|
|
|
return lines;
|
|
};
|
|
|
|
VectorTileFeature.prototype.bbox = function() {
|
|
var pbf = this._pbf;
|
|
pbf.pos = this._geometry;
|
|
|
|
var end = pbf.readVarint() + pbf.pos,
|
|
cmd = 1,
|
|
length = 0,
|
|
x = 0,
|
|
y = 0,
|
|
x1 = Infinity,
|
|
x2 = -Infinity,
|
|
y1 = Infinity,
|
|
y2 = -Infinity;
|
|
|
|
while (pbf.pos < end) {
|
|
if (!length) {
|
|
var cmdLen = pbf.readVarint();
|
|
cmd = cmdLen & 0x7;
|
|
length = cmdLen >> 3;
|
|
}
|
|
|
|
length--;
|
|
|
|
if (cmd === 1 || cmd === 2) {
|
|
x += pbf.readSVarint();
|
|
y += pbf.readSVarint();
|
|
if (x < x1) x1 = x;
|
|
if (x > x2) x2 = x;
|
|
if (y < y1) y1 = y;
|
|
if (y > y2) y2 = y;
|
|
|
|
} else if (cmd !== 7) {
|
|
throw new Error('unknown command ' + cmd);
|
|
}
|
|
}
|
|
|
|
return [x1, y1, x2, y2];
|
|
};
|
|
|
|
VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
|
|
var size = this.extent * Math.pow(2, z),
|
|
x0 = this.extent * x,
|
|
y0 = this.extent * y,
|
|
coords = this.loadGeometry(),
|
|
type = VectorTileFeature.types[this.type];
|
|
|
|
for (var i = 0; i < coords.length; i++) {
|
|
var line = coords[i];
|
|
for (var j = 0; j < line.length; j++) {
|
|
var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
|
|
line[j] = [
|
|
(p.x + x0) * 360 / size - 180,
|
|
360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
|
|
];
|
|
}
|
|
}
|
|
|
|
if (type === 'Point' && coords.length === 1) {
|
|
coords = coords[0][0];
|
|
} else if (type === 'Point') {
|
|
coords = coords[0];
|
|
type = 'MultiPoint';
|
|
} else if (type === 'LineString' && coords.length === 1) {
|
|
coords = coords[0];
|
|
} else if (type === 'LineString') {
|
|
type = 'MultiLineString';
|
|
}
|
|
|
|
return {
|
|
type: "Feature",
|
|
geometry: {
|
|
type: type,
|
|
coordinates: coords
|
|
},
|
|
properties: this.properties
|
|
};
|
|
};
|
|
|
|
},{"point-geometry":5}],4:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
var VectorTileFeature = require('./vectortilefeature.js');
|
|
|
|
module.exports = VectorTileLayer;
|
|
|
|
function VectorTileLayer(pbf, end) {
|
|
// Public
|
|
this.version = 1;
|
|
this.name = null;
|
|
this.extent = 4096;
|
|
this.length = 0;
|
|
|
|
// Private
|
|
this._pbf = pbf;
|
|
this._keys = [];
|
|
this._values = [];
|
|
this._features = [];
|
|
|
|
pbf.readFields(readLayer, this, end);
|
|
|
|
this.length = this._features.length;
|
|
}
|
|
|
|
function readLayer(tag, layer, pbf) {
|
|
if (tag === 15) layer.version = pbf.readVarint();
|
|
else if (tag === 1) layer.name = pbf.readString();
|
|
else if (tag === 5) layer.extent = pbf.readVarint();
|
|
else if (tag === 2) layer._features.push(pbf.pos);
|
|
else if (tag === 3) layer._keys.push(pbf.readString());
|
|
else if (tag === 4) layer._values.push(readValueMessage(pbf));
|
|
}
|
|
|
|
function readValueMessage(pbf) {
|
|
var value = null,
|
|
end = pbf.readVarint() + pbf.pos;
|
|
|
|
while (pbf.pos < end) {
|
|
var tag = pbf.readVarint() >> 3;
|
|
|
|
value = tag === 1 ? pbf.readString() :
|
|
tag === 2 ? pbf.readFloat() :
|
|
tag === 3 ? pbf.readDouble() :
|
|
tag === 4 ? pbf.readVarint64() :
|
|
tag === 5 ? pbf.readVarint() :
|
|
tag === 6 ? pbf.readSVarint() :
|
|
tag === 7 ? pbf.readBoolean() : null;
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
// return feature `i` from this layer as a `VectorTileFeature`
|
|
VectorTileLayer.prototype.feature = function(i) {
|
|
if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
|
|
|
|
this._pbf.pos = this._features[i];
|
|
|
|
var end = this._pbf.readVarint() + this._pbf.pos;
|
|
return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values);
|
|
};
|
|
|
|
},{"./vectortilefeature.js":3}],5:[function(require,module,exports){
|
|
'use strict';
|
|
|
|
module.exports = Point;
|
|
|
|
function Point(x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
|
|
Point.prototype = {
|
|
clone: function() { return new Point(this.x, this.y); },
|
|
|
|
add: function(p) { return this.clone()._add(p); },
|
|
sub: function(p) { return this.clone()._sub(p); },
|
|
mult: function(k) { return this.clone()._mult(k); },
|
|
div: function(k) { return this.clone()._div(k); },
|
|
rotate: function(a) { return this.clone()._rotate(a); },
|
|
matMult: function(m) { return this.clone()._matMult(m); },
|
|
unit: function() { return this.clone()._unit(); },
|
|
perp: function() { return this.clone()._perp(); },
|
|
round: function() { return this.clone()._round(); },
|
|
|
|
mag: function() {
|
|
return Math.sqrt(this.x * this.x + this.y * this.y);
|
|
},
|
|
|
|
equals: function(p) {
|
|
return this.x === p.x &&
|
|
this.y === p.y;
|
|
},
|
|
|
|
dist: function(p) {
|
|
return Math.sqrt(this.distSqr(p));
|
|
},
|
|
|
|
distSqr: function(p) {
|
|
var dx = p.x - this.x,
|
|
dy = p.y - this.y;
|
|
return dx * dx + dy * dy;
|
|
},
|
|
|
|
angle: function() {
|
|
return Math.atan2(this.y, this.x);
|
|
},
|
|
|
|
angleTo: function(b) {
|
|
return Math.atan2(this.y - b.y, this.x - b.x);
|
|
},
|
|
|
|
angleWith: function(b) {
|
|
return this.angleWithSep(b.x, b.y);
|
|
},
|
|
|
|
// Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ.
|
|
angleWithSep: function(x, y) {
|
|
return Math.atan2(
|
|
this.x * y - this.y * x,
|
|
this.x * x + this.y * y);
|
|
},
|
|
|
|
_matMult: function(m) {
|
|
var x = m[0] * this.x + m[1] * this.y,
|
|
y = m[2] * this.x + m[3] * this.y;
|
|
this.x = x;
|
|
this.y = y;
|
|
return this;
|
|
},
|
|
|
|
_add: function(p) {
|
|
this.x += p.x;
|
|
this.y += p.y;
|
|
return this;
|
|
},
|
|
|
|
_sub: function(p) {
|
|
this.x -= p.x;
|
|
this.y -= p.y;
|
|
return this;
|
|
},
|
|
|
|
_mult: function(k) {
|
|
this.x *= k;
|
|
this.y *= k;
|
|
return this;
|
|
},
|
|
|
|
_div: function(k) {
|
|
this.x /= k;
|
|
this.y /= k;
|
|
return this;
|
|
},
|
|
|
|
_unit: function() {
|
|
this._div(this.mag());
|
|
return this;
|
|
},
|
|
|
|
_perp: function() {
|
|
var y = this.y;
|
|
this.y = this.x;
|
|
this.x = -y;
|
|
return this;
|
|
},
|
|
|
|
_rotate: function(angle) {
|
|
var cos = Math.cos(angle),
|
|
sin = Math.sin(angle),
|
|
x = cos * this.x - sin * this.y,
|
|
y = sin * this.x + cos * this.y;
|
|
this.x = x;
|
|
this.y = y;
|
|
return this;
|
|
},
|
|
|
|
_round: function() {
|
|
this.x = Math.round(this.x);
|
|
this.y = Math.round(this.y);
|
|
return this;
|
|
}
|
|
};
|
|
|
|
// constructs Point from an array if necessary
|
|
Point.convert = function (a) {
|
|
if (a instanceof Point) {
|
|
return a;
|
|
}
|
|
if (Array.isArray(a)) {
|
|
return new Point(a[0], a[1]);
|
|
}
|
|
return a;
|
|
};
|
|
|
|
},{}]},{},[1])(1)
|
|
});
|
|
ol.ext.vectortile = module.exports;
|
|
})();
|