geoserver-terrain-1saglayici
Version:
352 lines (325 loc) • 20 kB
JavaScript
;
var v = window.Cesium;
function G(e, r) {
let t = Math.max(e.west, r.west),
i = Math.min(e.east, r.east),
a = Math.max(e.south, r.south),
n = Math.min(e.north, r.north), l;
return i <= t || a >= n ? l = null : l = new v.Rectangle(t, a, i, n), l;
}
var D = [
{ name: "CRS:84", ellipsoid: v.Ellipsoid.WGS84, firstAxeIsLatitude: !1, tilingScheme: v.GeographicTilingScheme, supportedCRS: "urn:ogc:def:crs:OGC:2:84" },
{ name: "EPSG:4326", ellipsoid: v.Ellipsoid.WGS84, firstAxeIsLatitude: !0, tilingScheme: v.GeographicTilingScheme, supportedCRS: "urn:ogc:def:crs:EPSG::4326" },
{ name: "EPSG:3857", ellipsoid: v.Ellipsoid.WGS84, firstAxeIsLatitude: !1, tilingScheme: v.WebMercatorTilingScheme, supportedCRS: "urn:ogc:def:crs:EPSG::3857" },
{ name: "OSGEO:41001", ellipsoid: v.Ellipsoid.WGS84, firstAxeIsLatitude: !1, tilingScheme: v.WebMercatorTilingScheme, supportedCRS: "urn:ogc:def:crs:EPSG::3857" }
];
var H = [
{ format: "image/png", extension: "png" },
{ format: "image/jpeg", extension: "jpg" },
{ format: "image/jpeg", extension: "jpeg" },
{ format: "image/gif", extension: "gif" },
{ format: "image/png; mode=8bit", extension: "png" }
];
var X = [
{
format: "image/bil",
postProcessArray: function (e, r, t, i, a) {
let n = null, l = new DataView(e), g = new ArrayBuffer(r.height * r.width * 2), f = new DataView(g);
if (g.byteLength === e.byteLength) {
let d, p = 0, x = 0;
for (let y = 0; y < g.byteLength; y += 2)
if (d = l.getInt16(y, !1) - a, d > i && d < t) f.setInt16(y, d, !0), x += d, p++;
else {
let I = p === 0 ? 1 : x / p;
f.setInt16(y, I, !0);
}
n = new Int16Array(g);
}
return n;
}
}
];
var k = {
service: "WMS", maxLevel: 11, heightMapWidth: 65, heightMapHeight: 65, offset: 0, highest: 12000, lowest: -500, hasStyledImage: !1
},
O = {
heightScale: 1, heightOffset: 0, elementsPerHeight: 1, stride: 1, elementMultiplier: 256, isBigEndian: !1, lowestEncodedHeight: 0, highestEncodedHeight: 10000
};
function W(e, r) {
r.heightMapWidth = e.heightMapWidth, r.heightMapHeight = e.heightMapHeight, r.ready = !1, r.maximumLevel = e.maxLevel, r.levelZeroMaximumGeometricError = void 0, r.offset = e.offset, r.highest = e.highest, r.lowest = e.lowest, r.hasStyledImage = e.hasStyledImage || typeof e.styleName == "string";
}
function V(e, r, t, i) {
return i.postProcessArray(e, t, r.highest, r.lowest, r.offset);
}
function Y(e, r, t, i) {
let a = v.getImagePixels(e, t.width, t.height),
n = new Int16Array(a.length / 4),
l = 0, g = 0;
for (let f = 0; f < a.length; f += 4) {
let d = a[f], p = a[f + 1], x = a[f + 2] > 128, y = (d << 8 | p) - r.offset - 32768;
y > r.lowest && y < r.highest && (x || i) ? (n[f / 4] = y, g += y, l++) : n[f / 4] = l === 0 ? 0 : g / l;
}
return n;
}
var Z = window.Cesium, { fetchXML: Q } = Z.Resource;
async function K(e) {
let r;
if (e.url) e.xml = await Q({ url: e.url + "/gwc/service/tms/1.0.0" }), r = await j(e);
else if (e.xml) r = await j(e);
else throw new Error("either description.url or description.xml are required.");
return r;
}
async function j(e) {
let r = e.xml;
if (!(r instanceof XMLDocument)) throw new Error("xml must be a XMLDocument");
let t;
if (r.querySelector("TileMapService") !== null) {
if (!e.layerName) throw new Error("layerName is required.");
let i = Array.from(r.querySelectorAll("TileMap[title='" + e.layerName + "']")).map(a => {
let n = a.getAttribute("href");
return e.proxy && (n = e.proxy.getURL(n)), Q({ url: n }).then(l => (e.xml = l, z(e)));
});
t = await Promise.race(i);
} else t = z(e);
return t;
}
function z(e) {
let r = e.xml, t = {};
W(e, t);
let i = e.maxLevel, a = e.proxy, n = r.querySelector("SRS").textContent, l = D.find(m => m.name === n);
l && (t.tilingScheme = new l.tilingScheme({ ellipsoid: l.ellipsoid }));
let g = r.querySelector("TileFormat"), f = H.find(m => m.extension == g.getAttribute("extension"));
f && (t.formatImage = f, t.imageSize = { width: parseInt(g.getAttribute("width"), 10), height: parseInt(g.getAttribute("height"), 10) });
let d = Array.from(r.querySelectorAll("TileSets>TileSet")), p = [];
if (t.formatImage && (p = d.map(function (m) {
let o = m.getAttribute("href") + "/{x}/{tmsY}." + t.formatImage.extension;
a && (o = a.getURL(o));
let u = parseInt(m.getAttribute("order"));
return { url: o, level: u };
}), p.sort((m, o) => m.level - o.level)), p.length === 0 || !t.formatImage || !t.tilingScheme) throw new Error("no tilesets, no formatImage and no formatArray");
t.URLtemplateImage = function (m, o, u) {
let b = "";
return u < p.length && (b = p[u].url), b;
};
let x = r.querySelector("BoundingBox"), y = parseFloat(x.getAttribute("miny")), I = parseFloat(x.getAttribute("maxy")), L = parseFloat(x.getAttribute("minx")), c = parseFloat(x.getAttribute("maxx")), S = new Z.Rectangle(L, y, c, I);
return t.getTileDataAvailable = function (m, o, u) {
let b = t.tilingScheme.tileXYToNativeRectangle(m, o, u);
return G(S, b) !== null && u < i && u < p.length;
}, t.ready = !0, t;
}
var _ = window.Cesium, { fetchXML: ae } = _.Resource;
async function $(e) {
let r;
if (e.url) {
let t = e.url, i = t.lastIndexOf("?");
i > -1 && (t = t.substring(0, i));
let a = t + "/ows?SERVICE=WMS&REQUEST=GetCapabilities&tiled=true";
console.log(a), e.proxy && (a = e.proxy.getURL(a)), e.xml = await ae({ url: a }), r = J(e);
} else if (e.xml) r = J(e);
else throw new Error("either description.url or description.xml are required.");
return r;
}
function J(e) {
if (!(e.xml instanceof XMLDocument)) throw new Error("xml must be a XMLDocument");
if (!e.layerName) throw new Error("description.layerName is required.");
let r = e.xml, t = {}, i = e.layerName, a = e.maxLevel, n = null, l = { width: 65, height: 65 }, g;
W(e, t), t.formatImage = e.formatImage, t.formatArray = e.formatArray, t.tilingScheme = void 0;
let f, d, p = e.styleName, x = r.querySelector("[version]");
x !== null && (n = x.getAttribute("version"), d = /^1\.[3-9]\./.test(n));
let y = r.querySelector("Request>GetMap OnlineResource").getAttribute("xlink:href"), I = y.indexOf("?");
I > -1 && (y = y.substring(0, I)), e.proxy && (y = e.proxy.getURL(y));
let L = Array.from(r.querySelectorAll("Request>GetMap>Format")).map(m => m.textContent);
for (let m = 0; m < L.length; m++) t.formatImage || (t.formatImage = H.find(o => o.format === L[m])), t.formatArray || (t.formatArray = X.find(o => o.format === L[m]));
t.formatArray && typeof t.formatArray.format == "string" && typeof t.formatArray.postProcessArray == "function" ? t.formatArray.terrainDataStructure = Object.assign({}, O) : delete t.formatArray, (!t.formatImage || typeof t.formatImage.format != "string") && (t.formatImage = void 0);
let c = r.querySelectorAll("Layer[queryable='1'],Layer[queryable='true']"), S = null;
for (let m = 0; m < c.length && S === null; m++)
if (c[m].querySelector("Name").textContent === i) {
S = c[m];
let o = S.getAttribute("fixedHeight"), u = S.getAttribute("fixedWidth");
o !== null && (o = parseInt(o, 10), t.heightMapHeight = o > 0 && o < t.heightMapHeight ? o : t.heightMapHeight, l.height = o > 0 ? o : l.height), u !== null && (u = parseInt(u, 10), t.heightMapWidth = u > 0 && u < t.heightMapWidth ? u : t.heightMapWidth, l.width = u > 0 ? u : l.width);
}
if (S !== null && n !== null) {
let m = !1;
for (let b = 0; b < D.length && !m; b++) {
let s = D[b], R = s.name, h = S.querySelector("BoundingBox[SRS='" + R + "'],BoundingBox[CRS='" + R + "']");
if (h !== null) {
g = R, f = s.firstAxeIsLatitude, t.tilingScheme = new s.tilingScheme({ ellipsoid: s.ellipsoid });
let A, F, w, T;
f && d ? (A = parseFloat(h.getAttribute("miny")), F = parseFloat(h.getAttribute("maxy")), w = parseFloat(h.getAttribute("minx")), T = parseFloat(h.getAttribute("maxx"))) : (A = parseFloat(h.getAttribute("minx")), F = parseFloat(h.getAttribute("maxx")), w = parseFloat(h.getAttribute("miny")), T = parseFloat(h.getAttribute("maxy")));
let M = new _.Rectangle(A, w, F, T);
t.getTileDataAvailable = function (C, E, q) {
let U = !1, ie = t.tilingScheme.tileXYToNativeRectangle(C, E, q);
return q < a && (U = G(M, ie) !== null), U;
}, m = !0;
}
}
if (p) {
let b = S.querySelectorAll("Style>Name"), s = !1;
for (let R = 0; R < b.length && !s; R++) p === b[R].textContent && (s = !0);
s || (p = null);
}
let o = r.querySelectorAll("VendorSpecificCapabilities>TileSet"), u = !1;
for (let b = 0; b < o.length && !u; b++) {
let s = o[b].querySelector("BoundingBox[SRS='" + g + "'],BoundingBox[CRS='" + g + "']") !== null;
o[b].querySelector("Layers").textContent === i && s && (l.width = parseInt(o[b].querySelector("Width").textContent, 10), l.height = parseInt(o[b].querySelector("Height").textContent, 10), u = !0);
}
t.ready = m && (t.formatImage || t.formatArray) && n !== null;
}
if (t.ready) {
let m = y + "?SERVICE=WMS&REQUEST=GetMap&layers=" + i + "&version=" + n + "&bbox=";
if (d && f ? m += "{south},{west},{north},{east}" : m += "{west},{south},{east},{north}", m += "&crs=" + g + "&srs=" + g, t.formatImage) {
let o = m + "&format=" + t.formatImage.format + "&width=" + l.width + "&height=" + l.height;
p && (o += "&styles=" + p + "&style=" + p), t.URLtemplateImage = () => o, t.imageSize = l;
}
if (t.formatArray) {
let o = m + "&format=" + t.formatArray.format + "&width=" + t.heightMapWidth + "&height=" + t.heightMapHeight;
t.URLtemplateArray = () => o;
}
}
return t;
}
var ne = window.Cesium, { fetchXML: oe } = ne.Resource;
async function te(e) {
let r;
if (e.url) {
let t = e.url, i = t.lastIndexOf("?");
i > -1 && (t = t.substring(0, i));
let a = t + "/gwc/service/wmts?REQUEST=GetCapabilities";
e.proxy && (a = e.proxy.getURL(a)), e.xml = await oe({ url: a }), r = ee(e);
} else if (e.xml) r = ee(e);
else throw new Error("either description.url or description.xml are required.");
return r;
}
function ee(e) {
let r = e.xml;
if (!(r instanceof XMLDocument)) throw new Error("xml must be a XMLDocument");
let t = {}, i = e.layerName;
W(e, t);
let a = e.maxLevel, n = e.proxy, l = e.styleName, g = null, f = [], d = null, p = null, x = null;
Array.from(r.querySelectorAll('Operation[name="GetTile"] HTTP Get')).map(c => ({ node: c, type: c.querySelector("Value").textContent })).forEach(c => {
c.type === "RESTful" && p === null && (p = c.node.getAttribute("xlink:href"), n && (p = n.getURL(p))), c.type === "KVP" && d === null && (d = c.node.getAttribute("xlink:href"), n && (d = n.getURL(d)));
});
let y = r.querySelectorAll("Contents>Layer>Identifier"), I = null;
for (let c = 0; c < y.length && I === null; c++) i === y[c].textContent && (I = y[c].parentNode);
if (I !== null) {
let c, S;
Array.from(I.querySelectorAll("Style")).forEach(o => {
let u = o.querySelector("Identifier").textContent;
o.getAttribute("isDefault") != null && (c = u), u === l && (S = u);
}), (!l || l !== S) && (l = c || "");
let m = Array.from(I.querySelectorAll("Format"));
for (let o = 0; o < H.length && x === null; o++) m.filter(b => b.textContent === H[o].format).length > 0 && (x = H[o]);
f = Array.from(I.querySelectorAll("TileMatrixSetLink"));
}
let L = Array.from(r.querySelectorAll("TileMatrixSet>Identifier"));
for (let c = 0; c < f.length && !t.ready; c++) {
let S = f[c], m = S.querySelector("TileMatrixSet").textContent, o = null, u = null;
for (let s = 0; s < L.length && o === null; s++) L[s].textContent === m && (o = L[s].parentNode);
let b = o.querySelector("SupportedCRS").textContent;
for (let s = 0; s < D.length && u === null; s++) D[s].supportedCRS === b && (u = D[s]);
if (u !== null) {
let s = Array.from(o.querySelectorAll("TileMatrix")).map(function (h) {
let A = h.querySelector("Identifier").textContent, F = parseInt(h.querySelector("MatrixWidth").textContent, 10), w = parseInt(h.querySelector("MatrixHeight").textContent, 10), T = parseInt(h.querySelector("TileWidth").textContent, 10), M = parseInt(h.querySelector("TileHeight").textContent, 10), C = parseFloat(h.querySelector("ScaleDenominator").textContent);
return { id: A, maxWidth: F, maxHeight: w, scaleDenominator: C, complete: !1, tileWidth: T, tileHeight: M };
}).sort((h, A) => A.scaleDenominator - h.scaleDenominator), R = Array.from(S.querySelectorAll("TileMatrixSetLimits>TileMatrixLimits")).map(h => ({ id: h.querySelector("TileMatrix").textContent, bbox: { minTileRow: parseInt(h.querySelector("MinTileRow").textContent, 10), maxTileRow: parseInt(h.querySelector("MaxTileRow").textContent, 10), minTileCol: parseInt(h.querySelector("MinTileCol").textContent, 10), maxTileCol: parseInt(h.querySelector("MaxTileCol").textContent, 10) } }));
if (s.forEach(h => {
R.forEach(A => {
h.id === A.id && (h.bbox = A.bbox, h.complete = !0);
});
}), s.length > 0) {
t.tilingScheme = new u.tilingScheme({ ellipsoid: u.ellipsoid, numberOfLevelZeroTilesX: s[0].maxWidth, numberOfLevelZeroTilesY: s[0].maxHeight });
let h = I.querySelector("ResourceURL[format='" + x.format + "']");
if (h !== null ? g = h.getAttribute("template").replace("{TileRow}", "{y}").replace("{TileCol}", "{x}").replace("{style}", l).replace("{Style}", l).replace("{TileMatrixSet}", m).replace("{layer}", i).replace("{infoFormatExtension}", x.extension) : d !== null && (g = d + "service=WMTS&request=GetTile&version=1.0.0&layer=" + i + "&style=" + l + "&format=" + x.format + "&TileMatrixSet=" + m + "&TileMatrix={TileMatrix}&TileRow={y}&TileCol={x}"), g !== null) {
t.getTileDataAvailable = (w, T, M) => {
let C = !1;
if (M < a && M < s.length) {
let E = s[M], q = E.bbox;
E.complete ? C = T <= q.maxTileRow && T >= q.minTileRow && w <= q.maxTileCol && w >= q.minTileCol : C = w < E.maxWidth && T < E.maxHeight;
}
return C;
}, t.URLtemplateImage = function (w, T, M) {
let C = "";
if (t.getTileDataAvailable(w, T, M)) {
let E = s[M];
C = g.replace("{TileMatrix}", E.id);
}
return C;
};
let A = { width: s[0].tileWidth, height: s[0].tileHeight };
s.filter(w => w.tileWidth != A.width || w.tileHeight != A.height).length === 0 && (t.imageSize = A), t.ready = !0;
}
}
}
}
return t;
}
var P = window.Cesium, { fetchArrayBuffer: Le, fetchImage: De } = P.Resource, N = class {
errorEvent = new P.Event;
credit;
tilingScheme;
ready = !1;
hasVertexNormals = !1;
readyPromise;
hasWaterMask;
heightMapHeight;
heightMapWidth;
availability;
constructor(r, t = "") {
this.credit = new P.Credit(t), this.tilingScheme = r.tilingScheme, this.getTileDataAvailable = r.getTileDataAvailable, this.hasWaterMask = !1, this.heightMapHeight = r.heightMapHeight, this.heightMapWidth = r.heightMapWidth, this.availability = new P.TileAvailability(this.tilingScheme, r.maximumLevel), this.getLevelMaximumGeometricError = i => r.levelZeroMaximumGeometricError / (1 << i), this.requestTileGeometry = async (i, a, n) => {
let l, g = await r.GeometryCallback(i, a, n), f = le(i, a, n, r);
return new P.HeightmapTerrainData({ buffer: g, width: r.heightMapWidth, height: r.heightMapHeight, childTileMask: f });
}, this.ready = r.ready, this.readyPromise = new Promise(i => !0);
}
requestTileGeometry(r, t, i, a) {
throw new Error("Method not implemented.");
}
getLevelMaximumGeometricError(r) {
throw new Error("Method not implemented.");
}
getTileDataAvailable(r, t, i) {
throw new Error("Method not implemented.");
}
};
function le(e, r, t, i) {
let a = 0, n = t + 1;
return a |= i.getTileDataAvailable(2 * e, 2 * r, n) ? 1 : 0, a |= i.getTileDataAvailable(2 * e + 1, 2 * r, n) ? 2 : 0, a |= i.getTileDataAvailable(2 * e, 2 * r + 1, n) ? 4 : 0, a |= i.getTileDataAvailable(2 * e + 1, 2 * r + 1, n) ? 8 : 0, a;
}
var B = window.Cesium, { fetchArrayBuffer: me, fetchImage: se } = B.Resource;
async function ue(e) {
e = Object.assign(k, e);
let r;
switch (e.service) {
case "TMS": r = K(e); break;
case "WMTS": r = te(e); break;
default: r = $(e);
}
let t = await r;
return he(t), e.service === "WMTS" ? new N(t) : new B.CustomHeightmapTerrainProvider({ height: t.heightMapHeight, width: t.heightMapWidth, tilingScheme: t.tilingScheme, callback: t.GeometryCallback });
}
window.Cesium.GeoserverTerrainProvider = ue;
function he(e) {
e.levelZeroMaximumGeometricError = B.TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(e.tilingScheme.ellipsoid, e.heightMapWidth, e.tilingScheme.getNumberOfXTilesAtLevel(0)), e.URLtemplateImage && (e.getBufferImage = async (r, t, i) => {
let a = null;
if (!isNaN(r + t + i)) {
let n = re(e.URLtemplateImage(r, t, i), r, t, i, e), l = { highest: e.highest, lowest: e.lowest, offset: e.offset };
a = await se({ url: n }).then(f => Y(f, l, { width: e.heightMapWidth, height: e.heightMapHeight }, e.hasStyledImage)).catch(() => new Int16Array(e.heightMapWidth * e.heightMapHeight));
}
return a;
}), e.URLtemplateArray && (e.getBufferArray = async (r, t, i) => {
let a = null;
if (!isNaN(r + t + i)) {
let n = re(e.URLtemplateArray(r, t, i), r, t, i, e), l = { highest: e.highest, lowest: e.lowest, offset: e.offset };
a = await me({ url: n }).then(f => V(f, l, { width: e.heightMapWidth, height: e.heightMapHeight }, e.formatArray)).catch(() => new Int16Array(e.heightMapWidth * e.heightMapHeight));
}
return a;
}), e.GeometryCallback = async (r, t, i) => {
let a;
return e.getBufferArray ? a = await e.getBufferArray(r, t, i) : e.getBufferImage && (a = await e.getBufferImage(r, t, i)), a;
};
}
function re(e, r, t, i, a) {
let n = a.tilingScheme.tileXYToNativeRectangle(r, t, i), l = (n.east - n.west) / (a.heightMapWidth - 1), g = (n.north - n.south) / (a.heightMapHeight - 1);
n.west -= l * .5, n.east += l * .5, n.south -= g * .5, n.north += g * .5;
let d = a.tilingScheme.getNumberOfYTilesAtLevel(i) - t - 1;
return e.replace("{south}", n.south.toString()).replace("{north}", n.north.toString()).replace("{west}", n.west.toString()).replace("{east}", n.east.toString()).replace("{x}", r.toString()).replace("{y}", t.toString()).replace("{tmsY}", d.toString());
}