UNPKG

earthtrek-core

Version:

Global Nominee NASA Space Apps Challenge 2017 Buenos Aires - Global Finalist (Best Use of Data) NASA Space Apps Challenge 2017 - 1D, 2D, 3D, Go! Challenge

94 lines (74 loc) 3.37 kB
'use strict'; var Cesium = require('./cesium'); var gibs = gibs || {}; gibs.GeographicTilingScheme = function (options) { var self = new Cesium.GeographicTilingScheme(options); var Math = Cesium.Math; var tilePixels = 512; var rectangle = Cesium.Rectangle.MAX_VALUE; // Resolution: radians per pixel var levels = [{ width: 2, height: 1, resolution: 0.009817477042468103 }, { width: 3, height: 2, resolution: 0.004908738521234052 }, { width: 5, height: 3, resolution: 0.002454369260617026 }, { width: 10, height: 5, resolution: 0.001227184630308513 }, { width: 20, height: 10, resolution: 0.0006135923151542565 }, { width: 40, height: 20, resolution: 0.00030679615757712823 }, { width: 80, height: 40, resolution: 0.00015339807878856412 }, { width: 160, height: 80, resolution: 0.00007669903939428206 }, { width: 320, height: 160, resolution: 0.00003834951969714103 }, { width: 640, height: 320, resolution: 0.000019175 /* { width: 1280, height: 640, resolution: 0.000009587 }, { width: 2560, height: 1280, resolution: 0.000004794 }, { width: 5120, height: 2560, resolution: 0.000002397 }*/ }]; self.getNumberOfXTilesAtLevel = function (level) { return levels[level].width; }; self.getNumberOfYTilesAtLevel = function (level) { return levels[level].height; }; self.tileXYToRectangle = function (x, y, level, result) { var xTiles = levels[level].width; var yTiles = levels[level].height; var resolution = levels[level].resolution; var xTileWidth = resolution * tilePixels; var west = x * xTileWidth + rectangle.west; var east = (x + 1) * xTileWidth + rectangle.west; var yTileHeight = resolution * tilePixels; var north = rectangle.north - y * yTileHeight; var south = rectangle.north - (y + 1) * yTileHeight; if (!result) { result = new Cesium.Rectangle(0, 0, 0, 0); } result.west = west; result.south = south; result.east = east; result.north = north; return result; }; self.positionToTileXY = function (position, level, result) { if (!Cesium.Rectangle.contains(rectangle, position)) { return undefined; } if (levels[level] == undefined) { return undefined; } var xTiles = levels[level].width; var yTiles = levels[level].height; var resolution = levels[level].resolution; var xTileWidth = resolution * tilePixels; var yTileHeight = resolution * tilePixels; var longitude = position.longitude; if (rectangle.east < rectangle.west) { longitude += Math.TWO_PI; } var xTileCoordinate = (longitude - rectangle.west) / xTileWidth | 0; if (xTileCoordinate >= xTiles) { xTileCoordinate = xTiles - 1; } var latitude = position.latitude; var yTileCoordinate = (rectangle.north - latitude) / yTileHeight | 0; if (yTileCoordinate > yTiles) { yTileCoordinate = yTiles - 1; } if (!result) { result = new Cesium.Cartesian2(0, 0); } result.x = xTileCoordinate; result.y = yTileCoordinate; return result; }; return self; }; module.exports = gibs;