修改Globe。

This commit is contained in:
tengge1 2019-03-25 19:51:23 +08:00
parent 429ccd30fb
commit 22fbd5d5ef
7 changed files with 230 additions and 272 deletions

View File

@ -1,11 +1,7 @@
/**
* 地球
*/
ZeroGIS.Globe = function (canvas, args) {
if (!(canvas instanceof HTMLCanvasElement)) {
throw "invalid canvas: not HTMLCanvasElement";
}
args = args || {};
function Globe(canvas) {
ZeroGIS.globe = this;
this.MAX_LEVEL = 15; //最大的渲染级别15
this.CURRENT_LEVEL = -1; //当前渲染等级
@ -18,166 +14,169 @@ ZeroGIS.Globe = function (canvas, args) {
var vs_content = ZeroGIS.ShaderContent.SIMPLE_SHADER.VS_CONTENT;
var fs_content = ZeroGIS.ShaderContent.SIMPLE_SHADER.FS_CONTENT;
this.renderer = ZeroGIS.renderer = new ZeroGIS.WebGLRenderer(canvas, vs_content, fs_content);
this.scene = new ZeroGIS.Scene();
var radio = canvas.width / canvas.height;
this.camera = new ZeroGIS.PerspectiveCamera(30, radio, 1.0, 20000000.0);
this.renderer.bindScene(this.scene);
this.renderer.bindCamera(this.camera);
this.setLevel(0);
this.renderer.setIfAutoRefresh(true);
ZeroGIS.Event.initLayout();
};
ZeroGIS.Globe.prototype = {
constructor: ZeroGIS.Globe,
Globe.prototype.setTiledLayer = function (tiledLayer) {
if (!(tiledLayer instanceof ZeroGIS.TiledLayer)) {
throw "invalid tiledLayer: not World.TiledLayer";
}
setTiledLayer: function (tiledLayer) {
if (!(tiledLayer instanceof ZeroGIS.TiledLayer)) {
throw "invalid tiledLayer: not World.TiledLayer";
clearTimeout(this.idTimeOut);
//在更换切片图层的类型时清空缓存的图片
ZeroGIS.Image.clear();
if (this.tiledLayer) {
var b = this.scene.remove(this.tiledLayer);
if (!b) {
console.error("this.scene.remove(this.tiledLayer)失败");
}
this.scene.tiledLayer = null;
}
this.tiledLayer = tiledLayer;
this.scene.add(this.tiledLayer);
//添加第0级的子图层
var subLayer0 = new ZeroGIS.SubTiledLayer({
level: 0
});
this.tiledLayer.add(subLayer0);
clearTimeout(this.idTimeOut);
//在更换切片图层的类型时清空缓存的图片
ZeroGIS.Image.clear();
if (this.tiledLayer) {
var b = this.scene.remove(this.tiledLayer);
if (!b) {
console.error("this.scene.remove(this.tiledLayer)失败");
}
this.scene.tiledLayer = null;
//要对level为1的图层进行特殊处理在创建level为1时就创建其中的全部的四个tile
var subLayer1 = new ZeroGIS.SubTiledLayer({
level: 1
});
this.tiledLayer.add(subLayer1);
ZeroGIS.canvas.style.cursor = "wait";
for (var m = 0; m <= 1; m++) {
for (var n = 0; n <= 1; n++) {
var args = {
level: 1,
row: m,
column: n,
url: ""
};
args.url = this.tiledLayer.getImageUrl(args.level, args.row, args.column);
var tile = new ZeroGIS.Tile(args);
subLayer1.add(tile);
}
this.tiledLayer = tiledLayer;
this.scene.add(this.tiledLayer);
//添加第0级的子图层
var subLayer0 = new ZeroGIS.SubTiledLayer({
level: 0
}
ZeroGIS.canvas.style.cursor = "default";
this.tick();
};
Globe.prototype.setLevel = function (level) {
if (!ZeroGIS.Utils.isInteger(level)) {
throw "invalid level";
}
if (level < 0) {
return;
}
level = level > this.MAX_LEVEL ? this.MAX_LEVEL : level; //超过最大的渲染级别就不渲染
if (level != this.CURRENT_LEVEL) {
if (this.camera instanceof ZeroGIS.PerspectiveCamera) {
//要先执行camera.setLevel,然后再刷新
this.camera.setLevel(level);
this.refresh();
}
}
};
/**
* 返回当前的各种矩阵信息:视点矩阵投影矩阵两者乘积以及前三者的逆矩阵
* @returns {{View: null, _View: null, Proj: null, _Proj: null, ProjView: null, _View_Proj: null}}
* @private
*/
Globe.prototype._getMatrixInfo = function () {
var options = {
View: null, //视点矩阵
_View: null, //视点矩阵的逆矩阵
Proj: null, //投影矩阵
_Proj: null, //投影矩阵的逆矩阵
ProjView: null, //投影矩阵与视点矩阵的乘积
_View_Proj: null //视点逆矩阵与投影逆矩阵的乘积
};
options.View = this.getViewMatrix();
options._View = options.View.getInverseMatrix();
options.Proj = this.projMatrix;
options._Proj = options.Proj.getInverseMatrix();
options.ProjView = options.Proj.multiplyMatrix(options.View);
options._View_Proj = options.ProjView.getInverseMatrix();
return options;
};
Globe.prototype.tick = function () {
var globe = ZeroGIS.globe;
if (globe) {
globe.refresh();
this.idTimeOut = setTimeout(globe.tick, globe.REFRESH_INTERVAL);
}
};
Globe.prototype.refresh = function () {
if (!this.tiledLayer || !this.scene || !this.camera) {
return;
}
var level = this.CURRENT_LEVEL + 3;
this.tiledLayer.updateSubLayerCount(level);
var projView = this.camera.getProjViewMatrix();
var options = {
projView: projView,
threshold: 1
};
options.threshold = Math.min(90 / this.camera.pitch, 1.5);
//最大级别的level所对应的可见TileGrids
var lastLevelTileGrids = this.camera.getVisibleTilesByLevel(level, options);
var levelsTileGrids = []; //level-2
var parentTileGrids = lastLevelTileGrids;
var i;
for (i = level; i >= 2; i--) {
levelsTileGrids.push(parentTileGrids); //此行代码表示第i层级的可见切片
parentTileGrids = ZeroGIS.Utils.map(parentTileGrids, function (item) {
return item.getParent();
});
this.tiledLayer.add(subLayer0);
parentTileGrids = ZeroGIS.Utils.filterRepeatArray(parentTileGrids);
}
levelsTileGrids.reverse(); //2-level
for (i = 2; i <= level; i++) {
var subLevel = i;
var subLayer = this.tiledLayer.children[subLevel];
subLayer.updateTiles(levelsTileGrids[0], true);
levelsTileGrids.splice(0, 1);
}
if (ZeroGIS.TERRAIN_ENABLED) {
this.requestElevationsAndCheckTerrain();
}
};
//要对level为1的图层进行特殊处理在创建level为1时就创建其中的全部的四个tile
var subLayer1 = new ZeroGIS.SubTiledLayer({
level: 1
});
this.tiledLayer.add(subLayer1);
ZeroGIS.canvas.style.cursor = "wait";
for (var m = 0; m <= 1; m++) {
for (var n = 0; n <= 1; n++) {
var args = {
level: 1,
row: m,
column: n,
url: ""
};
args.url = this.tiledLayer.getImageUrl(args.level, args.row, args.column);
var tile = new ZeroGIS.Tile(args);
subLayer1.add(tile);
}
}
ZeroGIS.canvas.style.cursor = "default";
this.tick();
},
//请求更新高程数据并检测Terrain
Globe.prototype.requestElevationsAndCheckTerrain = function () {
var level = this.tiledLayer.children.length - 1;
//当level>7时请求更新高程数据
//请求的数据与第7级的切片大小相同
//if(level > ZeroGIS.ELEVATION_LEVEL){
setLevel: function (level) {
if (!ZeroGIS.Utils.isInteger(level)) {
throw "invalid level";
}
if (level < 0) {
return;
}
level = level > this.MAX_LEVEL ? this.MAX_LEVEL : level; //超过最大的渲染级别就不渲染
if (level != this.CURRENT_LEVEL) {
if (this.camera instanceof ZeroGIS.PerspectiveCamera) {
//要先执行camera.setLevel,然后再刷新
this.camera.setLevel(level);
this.refresh();
}
}
},
/**
* 返回当前的各种矩阵信息:视点矩阵投影矩阵两者乘积以及前三者的逆矩阵
* @returns {{View: null, _View: null, Proj: null, _Proj: null, ProjView: null, _View_Proj: null}}
* @private
*/
_getMatrixInfo: function () {
var options = {
View: null, //视点矩阵
_View: null, //视点矩阵的逆矩阵
Proj: null, //投影矩阵
_Proj: null, //投影矩阵的逆矩阵
ProjView: null, //投影矩阵与视点矩阵的乘积
_View_Proj: null //视点逆矩阵与投影逆矩阵的乘积
};
options.View = this.getViewMatrix();
options._View = options.View.getInverseMatrix();
options.Proj = this.projMatrix;
options._Proj = options.Proj.getInverseMatrix();
options.ProjView = options.Proj.multiplyMatrix(options.View);
options._View_Proj = options.ProjView.getInverseMatrix();
return options;
},
tick: function () {
var globe = ZeroGIS.globe;
if (globe) {
globe.refresh();
this.idTimeOut = setTimeout(globe.tick, globe.REFRESH_INTERVAL);
}
},
refresh: function () {
if (!this.tiledLayer || !this.scene || !this.camera) {
return;
}
var level = this.CURRENT_LEVEL + 3;
this.tiledLayer.updateSubLayerCount(level);
var projView = this.camera.getProjViewMatrix();
var options = {
projView: projView,
threshold: 1
};
options.threshold = Math.min(90 / this.camera.pitch, 1.5);
//最大级别的level所对应的可见TileGrids
var lastLevelTileGrids = this.camera.getVisibleTilesByLevel(level, options);
var levelsTileGrids = []; //level-2
var parentTileGrids = lastLevelTileGrids;
var i;
for (i = level; i >= 2; i--) {
levelsTileGrids.push(parentTileGrids); //此行代码表示第i层级的可见切片
parentTileGrids = ZeroGIS.Utils.map(parentTileGrids, function (item) {
return item.getParent();
});
parentTileGrids = ZeroGIS.Utils.filterRepeatArray(parentTileGrids);
}
levelsTileGrids.reverse(); //2-level
for (i = 2; i <= level; i++) {
var subLevel = i;
var subLayer = this.tiledLayer.children[subLevel];
subLayer.updateTiles(levelsTileGrids[0], true);
levelsTileGrids.splice(0, 1);
}
if (ZeroGIS.TERRAIN_ENABLED) {
this.requestElevationsAndCheckTerrain();
}
},
//请求更新高程数据并检测Terrain
requestElevationsAndCheckTerrain: function () {
var level = this.tiledLayer.children.length - 1;
//当level>7时请求更新高程数据
//请求的数据与第7级的切片大小相同
//if(level > ZeroGIS.ELEVATION_LEVEL){
//达到TERRAIN_LEVEL级别时考虑三维请求
if (level >= ZeroGIS.TERRAIN_LEVEL) {
for (var i = ZeroGIS.ELEVATION_LEVEL + 1; i <= level; i++) {
var subLayer = this.tiledLayer.children[i];
subLayer.requestElevations();
//检查SubTiledLayer下的子图层是否符合转换成TerrainTile的条件如果适合就自动以三维地形图显示
if (i >= ZeroGIS.TERRAIN_LEVEL) {
subLayer.checkTerrain();
}
//达到TERRAIN_LEVEL级别时考虑三维请求
if (level >= ZeroGIS.TERRAIN_LEVEL) {
for (var i = ZeroGIS.ELEVATION_LEVEL + 1; i <= level; i++) {
var subLayer = this.tiledLayer.children[i];
subLayer.requestElevations();
//检查SubTiledLayer下的子图层是否符合转换成TerrainTile的条件如果适合就自动以三维地形图显示
if (i >= ZeroGIS.TERRAIN_LEVEL) {
subLayer.checkTerrain();
}
}
}
};
export default GLobe;

View File

@ -15,4 +15,6 @@ var ZeroGIS = {
TERRAIN_ENABLED: false, //是否启用三维地形
TERRAIN_PITCH: 80, //开始显示三维地形的pich
proxy: ""
};
};
export default ZeroGIS;

View File

@ -0,0 +1,9 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('ZeroGIS.js'), require('Enum.js'), require('Utils.js'), require('Vertice.js'), require('Vector.js'), require('Matrix.js'), require('Image.js'), require('Elevation.js'), require('Object3D/Object3D.js'), require('Object3D/ShaderContent.js'), require('Object3D/WebGLRenderer.js'), require('Object3D/Line.js'), require('Object3D/PerspectiveCamera.js'), require('Object3D/Object3DComponents.js'), require('Object3D/Scene.js'), require('Object3D/TextureMaterial.js'), require('Object3D/TileMaterial.js'), require('Object3D/Tile.js'), require('Object3D/TileGrid.js'), require('MathUtils.js'), require('Event.js'), require('Globe.js'), require('TiledLayer/TiledLayer.js'), require('TiledLayer/SubTiledLayer.js'), require('TiledLayer/GoogleTiledLayer.js'), require('TiledLayer/BingTiledLayer.js'), require('TiledLayer/OsmTiledLayer.js'), require('TiledLayer/SosoTiledLayer.js'), require('TiledLayer/TiandituTiledLayer.js'), require('TiledLayer/NokiaTiledLayer.js'), require('TiledLayer/ArcGISTiledLayer.js'), require('TiledLayer/AutonaviTiledLayer.js'), require('TiledLayer/BlendTiledLayer.js')) :
typeof define === 'function' && define.amd ? define(['ZeroGIS.js', 'Enum.js', 'Utils.js', 'Vertice.js', 'Vector.js', 'Matrix.js', 'Image.js', 'Elevation.js', 'Object3D/Object3D.js', 'Object3D/ShaderContent.js', 'Object3D/WebGLRenderer.js', 'Object3D/Line.js', 'Object3D/PerspectiveCamera.js', 'Object3D/Object3DComponents.js', 'Object3D/Scene.js', 'Object3D/TextureMaterial.js', 'Object3D/TileMaterial.js', 'Object3D/Tile.js', 'Object3D/TileGrid.js', 'MathUtils.js', 'Event.js', 'Globe.js', 'TiledLayer/TiledLayer.js', 'TiledLayer/SubTiledLayer.js', 'TiledLayer/GoogleTiledLayer.js', 'TiledLayer/BingTiledLayer.js', 'TiledLayer/OsmTiledLayer.js', 'TiledLayer/SosoTiledLayer.js', 'TiledLayer/TiandituTiledLayer.js', 'TiledLayer/NokiaTiledLayer.js', 'TiledLayer/ArcGISTiledLayer.js', 'TiledLayer/AutonaviTiledLayer.js', 'TiledLayer/BlendTiledLayer.js'], factory) :
(factory());
}(this, (function () { 'use strict';
})));

View File

@ -1,58 +1,36 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8" />
<title>ZeroGIS</title>
<link href="css/ZeroGIS.css" rel="stylesheet" />
<script src="ZeroGIS.js"></script>
<script src="Enum.js"></script>
<script src="Utils.js"></script>
<script src="Vertice.js"></script>
<script src="Vector.js"></script>
<script src="Matrix.js"></script>
<script src="Image.js"></script>
<script src="Elevation.js"></script>
<script src="Object3D/Object3D.js"></script>
<script src="Object3D/ShaderContent.js"></script>
<script src="Object3D/WebGLRenderer.js"></script>
<script src="Object3D/Line.js"></script>
<script src="Object3D/PerspectiveCamera.js"></script>
<script src="Object3D/Object3DComponents.js"></script>
<script src="Object3D/Scene.js"></script>
<script src="Object3D/TextureMaterial.js"></script>
<script src="Object3D/TileMaterial.js"></script>
<script src="Object3D/Tile.js"></script>
<script src="Object3D/TileGrid.js"></script>
<script src="MathUtils.js"></script>
<script src="Event.js"></script>
<script src="Globe.js"></script>
<script src="TiledLayer/TiledLayer.js"></script>
<script src="TiledLayer/SubTiledLayer.js"></script>
<script src="TiledLayer/GoogleTiledLayer.js"></script>
<script src="TiledLayer/BingTiledLayer.js"></script>
<script src="TiledLayer/OsmTiledLayer.js"></script>
<script src="TiledLayer/SosoTiledLayer.js"></script>
<script src="TiledLayer/TiandituTiledLayer.js"></script>
<script src="TiledLayer/NokiaTiledLayer.js"></script>
<script src="TiledLayer/ArcGISTiledLayer.js"></script>
<script src="TiledLayer/AutonaviTiledLayer.js"></script>
<script src="TiledLayer/BlendTiledLayer.js"></script>
<style>
html,
body,
#container {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
<script src="build/gis2.js"></script>
<script src="index.js"></script>
<script>
var globe;
function start() {
var canvas = document.getElementById('container');
globe = new ZeroGIS.Globe(canvas);
globe.setTiledLayer(new ZeroGIS.GoogleTiledLayer());
}
</script>
</head>
<body onselectstart="return false;" ondragstart="return false;" oncontextmenu="return false;">
<select id="mapSelector">
<option value="google">谷歌地图</option>
<option value="bing">必应地图</option>
<option value="osm">OpenStreetMap</option>
<option value="soso">SOSO地图</option>
<option value="tianditu">天地图</option>
</select>
<body onload="start()" onselectstart="return false;" ondragstart="return false;" oncontextmenu="return false;">
<canvas id="container" width="1000" height="1000" style="cursor:default;"></canvas>
</body>
</html>

View File

@ -1,76 +1,33 @@
// import 'ZeroGIS.js';
// import 'Enum.js';
// import 'Utils.js';
// import 'Vertice.js';
// import 'Vector.js';
// import 'Matrix.js';
// import 'Image.js';
// import 'Elevation.js';
// import 'Object3D/Object3D.js';
// import 'Object3D/ShaderContent.js';
// import 'Object3D/WebGLRenderer.js';
// import 'Object3D/Line.js';
// import 'Object3D/PerspectiveCamera.js';
// import 'Object3D/Object3DComponents.js';
// import 'Object3D/Scene.js';
// import 'Object3D/TextureMaterial.js';
// import 'Object3D/TileMaterial.js';
// import 'Object3D/Tile.js';
// import 'Object3D/TileGrid.js';
// import 'MathUtils.js';
// import 'Event.js';
// import 'Globe.js';
// import 'TiledLayer/TiledLayer.js';
// import 'TiledLayer/SubTiledLayer.js';
// import 'TiledLayer/GoogleTiledLayer.js';
// import 'TiledLayer/BingTiledLayer.js';
// import 'TiledLayer/OsmTiledLayer.js';
// import 'TiledLayer/SosoTiledLayer.js';
// import 'TiledLayer/TiandituTiledLayer.js';
// import 'TiledLayer/NokiaTiledLayer.js';
// import 'TiledLayer/ArcGISTiledLayer.js';
// import 'TiledLayer/AutonaviTiledLayer.js';
// import 'TiledLayer/BlendTiledLayer.js';
var globe;
function start() {
var canvas = document.getElementById("container");
globe = new ZeroGIS.Globe(canvas);
var selector = document.getElementById("mapSelector");
selector.onchange = changeTiledLayer;
changeTiledLayer();
}
function changeTiledLayer() {
var mapSelector = document.getElementById("mapSelector");
mapSelector.blur();
var newTiledLayer = null;
var args = null;
var value = mapSelector.value;
switch (value) {
case "google":
newTiledLayer = new ZeroGIS.GoogleTiledLayer();
break;
case "bing":
newTiledLayer = new ZeroGIS.BingTiledLayer();
break;
case "osm":
newTiledLayer = new ZeroGIS.OsmTiledLayer();
break;
case "soso":
newTiledLayer = new ZeroGIS.SosoTiledLayer();
break;
case "tianditu":
newTiledLayer = new ZeroGIS.TiandituTiledLayer();
break;
default:
break;
}
if (newTiledLayer) {
globe.setTiledLayer(newTiledLayer);
}
}
window.onload = start;
import 'ZeroGIS.js';
import 'Enum.js';
import 'Utils.js';
import 'Vertice.js';
import 'Vector.js';
import 'Matrix.js';
import 'Image.js';
import 'Elevation.js';
import 'Object3D/Object3D.js';
import 'Object3D/ShaderContent.js';
import 'Object3D/WebGLRenderer.js';
import 'Object3D/Line.js';
import 'Object3D/PerspectiveCamera.js';
import 'Object3D/Object3DComponents.js';
import 'Object3D/Scene.js';
import 'Object3D/TextureMaterial.js';
import 'Object3D/TileMaterial.js';
import 'Object3D/Tile.js';
import 'Object3D/TileGrid.js';
import 'MathUtils.js';
import 'Event.js';
import 'Globe.js';
import 'TiledLayer/TiledLayer.js';
import 'TiledLayer/SubTiledLayer.js';
import 'TiledLayer/GoogleTiledLayer.js';
import 'TiledLayer/BingTiledLayer.js';
import 'TiledLayer/OsmTiledLayer.js';
import 'TiledLayer/SosoTiledLayer.js';
import 'TiledLayer/TiandituTiledLayer.js';
import 'TiledLayer/NokiaTiledLayer.js';
import 'TiledLayer/ArcGISTiledLayer.js';
import 'TiledLayer/AutonaviTiledLayer.js';
import 'TiledLayer/BlendTiledLayer.js';

View File

@ -0,0 +1,12 @@
export default {
input: 'ShadowEditor.Web/src/gis2/index.js',
output: {
indent: '\t',
format: 'umd',
name: 'ZeroGIS',
file: 'ShadowEditor.Web/src/gis2/build/gis2.js'
},
treeshake: true,
external: [],
plugins: []
};

View File

@ -14,7 +14,8 @@
"build": "rollup -c ShadowEditor.Web/rollup.config.js",
"build-docs": "gitbook build docs-dev",
"test": "rollup -c ShadowEditor.Web/test/unit/rollup.config.js",
"clear": "npm prune"
"clear": "npm prune",
"earth": "rollup -c ShadowEditor.Web/src/gis2/rollup.config.js"
},
"repository": {
"type": "git",