sceneview.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>场景浏览</title>
  6. <!-- <script src="/build/grant.js"></script> -->
  7. <script src="http://localhost:4001/build/grant.js"></script>
  8. </head>
  9. <body>
  10. <style>
  11. html,
  12. body {
  13. font-size: 14px;
  14. margin: 0;
  15. padding: 0;
  16. }
  17. #map {
  18. width: 100vw;
  19. height: 100vh;
  20. }
  21. </style>
  22. <div id="map"></div>
  23. </body>
  24. <script type="text/javascript">
  25. window.onload = function () {
  26. var url = sessionStorage.getItem('mapViewUrl');
  27. if (url) {
  28. var type = getType(url);
  29. initMap({
  30. servicetype: type,
  31. mapingurl: url
  32. })
  33. } else {
  34. var obj = JSON.parse(JSON.stringify(location.href));
  35. var arr = obj.split("?")
  36. if (arr.length && arr[1]) {
  37. var url = arr[1];
  38. var type = getType(url);
  39. initMap({
  40. servicetype: type,
  41. mapingurl: url
  42. })
  43. }
  44. }
  45. }
  46. function getType(url) {
  47. return url.indexOf('realspace') > -1 ? 'SuperMap_realspace' : 'SuperMap';
  48. }
  49. function initMap(obj) {
  50. var viewer = new Cesium.Viewer('map', {
  51. animation: false,
  52. timeline: false,
  53. shadows: true,
  54. infoBox: false,
  55. geocoder: false,
  56. homeButton: false,
  57. navigation: true
  58. });
  59. var scene = viewer.scene;
  60. var widget = viewer.cesiumWidget;
  61. try {
  62. //场景
  63. switch (obj.servicetype) {
  64. case "SuperMap_realspace": {
  65. var url = obj.mapingurl.split('realspace')[0] + 'realspace'
  66. //添加S3M图层服务
  67. var promise = scene.open(url);
  68. //***为场景名称
  69. //定位到场景
  70. Cesium.loadJson(url + '/scenes.json').then(function (scenes) {
  71. var sname = scenes[0].name;
  72. Cesium.loadJson(url + '/scenes/' + sname + '.json').then(function (jsonData) {
  73. var cameraPosition = jsonData.camera;
  74. var tilt = Cesium.Math.toRadians(cameraPosition.tilt - 90);
  75. Cesium.when(promise, function (layer) {
  76. //设置相机位置、视角,便于观察场景
  77. var dest = new Cesium.Cartesian3.fromDegrees(cameraPosition.longitude, cameraPosition.latitude, cameraPosition.altitude);
  78. var ori = { heading: cameraPosition.heading, pitch: tilt, roll: 0 };
  79. scene.camera.setView({
  80. destination: dest,
  81. orientation: ori
  82. });
  83. });
  84. });
  85. });
  86. break;
  87. }
  88. case "SuperMap_terrain": {
  89. var url = obj.mapingurl + "/config";
  90. var config = sendRequestWithResponse(url, "GET");
  91. viewer.terrainProvider = new Cesium.CesiumTerrainProvider({
  92. url: obj.mapingurl,
  93. isSct: true
  94. });
  95. var left = parseFloat(config.substring(config.indexOf("<sml:Left>") + "<sml:Left>".length, config.indexOf("</sml:Left>")));
  96. var right = parseFloat(config.substring(config.indexOf("<sml:Right>") + "<sml:Right>".length, config.indexOf("</sml:Right>")));
  97. var top = parseFloat(config.substring(config.indexOf("<sml:Top>") + "<sml:Top>".length, config.indexOf("</sml:Top>")));
  98. var bottom = parseFloat(config.substring(config.indexOf("<sml:Bottom>") + "<sml:Bottom>".length, config.indexOf("</sml:Bottom>")));
  99. var x = (left + right) / 2;
  100. var y = (top + bottom) / 2;
  101. var z = parseFloat(config.substring(config.indexOf("<sml:MaxHeight>") + "<sml:MaxHeight>".length, config.indexOf("</sml:MaxHeight>"))) || 2000;
  102. scene.camera.setView({
  103. destination: new Cesium.Cartesian3.fromDegrees(x, y, z)
  104. });
  105. break;
  106. }
  107. case "SuperMap_s3m": {
  108. var url = obj.mapingurl + "/config";
  109. var config = sendRequestWithResponse(url, "GET");
  110. scene.addS3MTilesLayerByScp(url, { name: 1 });
  111. if (config.indexOf("<sml:OSGFiles>") != -1) {//s3m
  112. var x = parseFloat(config.substring(config.indexOf("<sml:X>") + 7, config.indexOf("</sml:X>")));
  113. var y = parseFloat(config.substring(config.indexOf("<sml:Y>") + 7, config.indexOf("</sml:Y>")));
  114. var z = parseFloat(config.substring(config.indexOf("<sml:Z>") + 7, config.indexOf("</sml:Z>")));
  115. if (Math.abs(z - 0.0) < 0.000001) {
  116. z = 2000;
  117. }
  118. scene.camera.setView({
  119. destination: new Cesium.Cartesian3.fromDegrees(x, y, z)
  120. });
  121. } else {//s3mb
  122. var configJSON = JSON.parse(config);
  123. var x = configJSON.position.x;
  124. var y = configJSON.position.y;
  125. var z = configJSON.position.z;
  126. if (Math.abs(z - 0.0) < 0.000001) {
  127. z = 2000;
  128. }
  129. scene.camera.setView({
  130. destination: new Cesium.Cartesian3.fromDegrees(x, y, z)
  131. });
  132. }
  133. break;
  134. }
  135. case "ArcGISRestMap": {
  136. var config = JSON.parse(sendRequestWithResponse(obj.mapingurl + "?f=pjson", "GET"));
  137. var fullExtent = config.fullExtent
  138. var provider = new Cesium.ArcGisMapServerImageryProvider({
  139. url: obj.mapingurl //'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
  140. });
  141. fullExtentToGeographicSR(fullExtent)
  142. viewer.imageryLayers.addImageryProvider(provider);
  143. viewer.camera.setView({
  144. destination: Cesium.Rectangle.fromDegrees(fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax)
  145. })
  146. break;
  147. }
  148. case "ArcGISTiledMap": {
  149. var config = JSON.parse(sendRequestWithResponse(obj.mapingurl + "?f=pjson", "GET"));
  150. var fullExtent = config.fullExtent
  151. fullExtentToGeographicSR(fullExtent)
  152. var provider = new Cesium.CGCS2000MapServerImageryProvider({
  153. //token,
  154. suggest: config.spatialReference.wkid === 4490 ? true : undefined,//4490坐标系,按照suggest切片方案切的瓦片,需要设置该参数
  155. url: obj.mapingurl //'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
  156. })
  157. viewer.imageryLayers.addImageryProvider(provider);
  158. viewer.camera.setView({
  159. destination: Cesium.Rectangle.fromDegrees(fullExtent.xmin, fullExtent.ymin, fullExtent.xmax, fullExtent.ymax)
  160. })
  161. break;
  162. }
  163. case "SuperMap": {
  164. var provider = new Cesium.SuperMapImageryProvider({
  165. url: obj.mapingurl
  166. });
  167. var imagery = viewer.imageryLayers.addImageryProvider(provider);
  168. viewer.zoomTo(imagery);
  169. }
  170. default:
  171. break;
  172. }
  173. } catch (e) {
  174. if (widget._showRenderLoopErrors) {
  175. var title = '渲染时发生错误,已停止渲染。';
  176. widget.showErrorPanel(title, undefined, e);
  177. }
  178. }
  179. }
  180. </script>
  181. </html>