itowns 2.36.2 → 2.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CONTRIBUTING.md +30 -17
  2. package/changelog.md +52 -0
  3. package/dist/debug.js +1 -1
  4. package/dist/debug.js.LICENSE.txt +1 -1
  5. package/dist/debug.js.map +1 -1
  6. package/dist/itowns.js +1 -1
  7. package/dist/itowns.js.map +1 -1
  8. package/dist/itowns_widgets.js +2 -0
  9. package/dist/itowns_widgets.js.map +1 -0
  10. package/examples/config.json +25 -6
  11. package/examples/css/widgets.css +248 -0
  12. package/examples/geoid_geoidLayer.html +102 -0
  13. package/examples/images/compass.svg +60 -0
  14. package/examples/images/widget-logo.svg +66 -0
  15. package/examples/itowns-potree.html +252 -0
  16. package/examples/js/GUI/GuiTools.js +17 -0
  17. package/examples/js/Scale.js +1 -0
  18. package/examples/source_file_from_fetched_data.html +90 -0
  19. package/examples/source_file_from_format.html +85 -0
  20. package/examples/source_file_from_methods.html +87 -0
  21. package/examples/source_file_from_parsed_data.html +104 -0
  22. package/examples/source_file_geojson_raster.html +21 -45
  23. package/examples/source_file_gpx_raster.html +28 -36
  24. package/examples/source_file_kml_raster.html +1 -4
  25. package/examples/source_file_shapefile.html +39 -34
  26. package/examples/source_stream_wfs_25d.html +21 -13
  27. package/examples/source_stream_wfs_3d.html +21 -12
  28. package/examples/source_stream_wfs_raster.html +20 -20
  29. package/examples/view_immersive.html +13 -14
  30. package/examples/widgets_minimap.html +122 -0
  31. package/examples/widgets_navigation.html +119 -0
  32. package/lib/Controls/GlobeControls.js +13 -0
  33. package/lib/Controls/PlanarControls.js +1 -1
  34. package/lib/Converter/convertToTile.js +5 -1
  35. package/lib/Core/3DTiles/C3DTBoundingVolume.js +4 -1
  36. package/lib/Core/Deprecated/Undeprecator.js +1 -1
  37. package/lib/Core/Feature.js +3 -4
  38. package/lib/Core/Geographic/Extent.js +1 -1
  39. package/lib/Core/Geographic/GeoidGrid.js +143 -0
  40. package/lib/Core/MainLoop.js +1 -1
  41. package/lib/Core/Math/Ellipsoid.js +1 -1
  42. package/lib/Core/Prefab/Globe/SkyShader.js +3 -1
  43. package/lib/Core/Prefab/Planar/PlanarLayer.js +3 -1
  44. package/lib/Core/Style.js +1 -1
  45. package/lib/Core/TileGeometry.js +3 -1
  46. package/lib/Core/TileMesh.js +11 -17
  47. package/lib/Core/View.js +40 -2
  48. package/lib/Layer/ElevationLayer.js +6 -2
  49. package/lib/Layer/FeatureGeometryLayer.js +3 -1
  50. package/lib/Layer/GeoidLayer.js +131 -0
  51. package/lib/Layer/InfoLayer.js +1 -1
  52. package/lib/Layer/Layer.js +1 -1
  53. package/lib/Layer/LayerUpdateStrategy.js +1 -1
  54. package/lib/Layer/PotreeLayer.js +3 -1
  55. package/lib/Layer/TiledGeometryLayer.js +3 -1
  56. package/lib/Main.js +214 -174
  57. package/lib/MainBundle.js +1 -1
  58. package/lib/Parser/B3dmParser.js +2 -1
  59. package/lib/Parser/GDFParser.js +118 -0
  60. package/lib/Parser/GTXParser.js +92 -0
  61. package/lib/Parser/ISGParser.js +121 -0
  62. package/lib/Parser/LASParser.js +3 -1
  63. package/lib/Parser/XbilParser.js +1 -1
  64. package/lib/Process/3dTilesProcessing.js +2 -2
  65. package/lib/Process/FeatureProcessing.js +3 -1
  66. package/lib/Process/LayeredMaterialNodeProcessing.js +7 -4
  67. package/lib/Provider/URLBuilder.js +1 -1
  68. package/lib/Renderer/LayeredMaterial.js +2 -2
  69. package/lib/Renderer/OBB.js +18 -25
  70. package/lib/Renderer/PointsMaterial.js +5 -6
  71. package/lib/Renderer/RasterTile.js +1 -1
  72. package/lib/Renderer/Shader/ShaderUtils.js +4 -2
  73. package/lib/Source/C3DTilesSource.js +3 -1
  74. package/lib/Source/EntwinePointTileSource.js +3 -1
  75. package/lib/Source/PotreeSource.js +3 -1
  76. package/lib/Source/Source.js +15 -10
  77. package/lib/Source/WMTSSource.js +3 -1
  78. package/lib/ThreeExtended/loaders/GLTFLoader.js +85 -35
  79. package/lib/Utils/CameraUtils.js +11 -1
  80. package/lib/Utils/DEMUtils.js +1 -1
  81. package/lib/Utils/FeaturesUtils.js +8 -4
  82. package/package.json +25 -25
@@ -0,0 +1,2 @@
1
+ "use strict";!function(t,o){"object"==typeof exports&&"object"==typeof module?module.exports=o():"function"==typeof define&&define.amd?define("itowns_widgets",[],o):"object"==typeof exports?exports.itowns_widgets=o():t.itowns_widgets=o()}(self,(function(){return(self.webpackChunk_name_=self.webpackChunk_name_||[]).push([[318],{58702:(t,o,e)=>{e.r(o),e.d(o,{Minimap:()=>g,Navigation:()=>m});var n=e(15671),i=e(43144),a=e(79340),r=e(82963),s=e(61120),c=e(95769);const l=(0,i.Z)((function t(o){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;(0,n.Z)(this,t),this.parentElement=e.parentElement||o.domElement,this.position=e.position||i.position,["top-left","top-right","bottom-left","bottom-right","top","bottom","left","right"].includes(this.position)||(console.warn("'position' optional parameter for 'Widget' constructor is not a valid option. "+"It will be set to '".concat(i.position,"'.")),this.position=i.position),this.domElement=document.createElement("div"),this.parentElement.appendChild(this.domElement),this.domElement.style.width="".concat(e.width||e.size||i.width,"px"),this.domElement.style.height="".concat(e.height||e.size||i.height,"px");var a=this.position.split("-");if(this.domElement.classList.add("".concat(a[0],"-widget")),a[1])this.domElement.classList.add("".concat(a[1],"-widget"));else switch(a[0]){case"top":case"bottom":this.domElement.style.left="calc(50% - ".concat(this.domElement.offsetWidth/2,"px)");break;case"left":case"right":this.domElement.style.top="calc(50% - ".concat(this.domElement.offsetHeight/2,"px)")}e.translate&&(this.domElement.style.transform="translate(".concat(e.translate.x||0,"px, ").concat(e.translate.y||0,"px)"))}));var d={parentElement:document.body,displayCompass:!0,display3DToggle:!0,displayZoomIn:!0,displayZoomOut:!0,animationDuration:500,position:"bottom-left",direction:"column"};const m=function(t){(0,a.Z)(m,t);var o,e,l=(o=m,e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,n=(0,s.Z)(o);if(e){var i=(0,s.Z)(this).constructor;t=Reflect.construct(n,arguments,i)}else t=n.apply(this,arguments);return(0,r.Z)(this,t)});function m(t){var o,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,n.Z)(this,m),["top","bottom","left","right"].includes(e.position)&&(console.warn("'position' optional parameter for 'Navigation' is not a valid option. "+"It will be set to '".concat(d.position,"'.")),e.position=d.position),(o=l.call(this,t,e,d)).direction=e.direction||d.direction,["column","row"].includes(o.direction)||(console.warn("'direction' optional parameter for 'Navigation' constructor is not a valid option. "+"It will be set to '".concat(d.direction,"'.")),o.direction=d.direction),o.animationDuration=void 0===e.animationDuration?d.animationDuration:e.animationDuration,o.domElement.id="widgets-navigation",o.domElement.classList.add("".concat(o.direction,"-widget")),(void 0===e.displayCompass?d.displayCompass:e.displayCompass)&&(o.compass=o.addButton("compass","",(function(){t.controls.lookAtCoordinate({heading:0,tilt:89.5,time:o.animationDuration})}),"widgets"),t.addEventListener(c.b.CAMERA_MOVED,(function(t){o.compass.style.transform="rotate(".concat(-t.heading,"deg)")}))),(void 0===e.display3DToggle?d.display3DToggle:e.display3DToggle)&&(o.switch3dButton=o.addButton("3d-button","3D",(function(){var e;e=t.controls.getTilt()<89?89.5:40,t.controls.lookAtCoordinate({tilt:e,time:o.animationDuration})})),t.addEventListener(c.b.CAMERA_MOVED,(function(t){o.switch3dButton.innerHTML=t.tilt<89?"2D":"3D"}))),(void 0===e.displayZoomIn?d.displayZoomIn:e.displayZoomIn)&&(o.zoomInButton=o.addButton("zoom-in-button",'<span class="widget-zoom-button-logo"></span>',(function(){t.controls.lookAtCoordinate({zoom:Math.min(20,t.controls.getZoom()+1),time:o.animationDuration})}),"zoom-button-bar")),(void 0===e.displayZoomOut?d.displayZoomOut:e.displayZoomOut)&&(o.zoomOutButton=o.addButton("zoom-out-button",'<span id="zoom-out-logo" class="widget-zoom-button-logo"></span>',(function(){t.controls.lookAtCoordinate({zoom:Math.max(3,t.controls.getZoom()-1),time:o.animationDuration})}),"zoom-button-bar")),o}return(0,i.Z)(m,[{key:"addButton",value:function(t){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},n=arguments.length>3?arguments[3]:void 0,i=document.getElementById(n);i||(i=this.addButtonBar(n));var a=document.createElement("button");return a.className="widget-button",a.id=t,a.innerHTML=o,i.appendChild(a),a.addEventListener("click",e),a}},{key:"addButtonBar",value:function(t){var o=document.createElement("div");return o.className="widget-button-bar",t&&(o.id=t),this.domElement.appendChild(o),o}}]),m}(l);var u=e(60145),p=e(49469),f=e(48682),h=e(800);var v={minScale:2e-6,maxScale:2e-9,zoomRatio:1/30,width:150,height:150,position:"bottom-left"};const g=function(t){(0,a.Z)(l,t);var o,e,c=(o=l,e=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}(),function(){var t,n=(0,s.Z)(o);if(e){var i=(0,s.Z)(this).constructor;t=Reflect.construct(n,arguments,i)}else t=n.apply(this,arguments);return(0,r.Z)(this,t)});function l(t,o){var e,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if((0,n.Z)(this,l),!t.isGlobeView)throw new Error("'Minimap' plugin only supports 'GlobeView'. Therefore, the 'view' parameter must be a 'GlobeView'.");if(!o.isColorLayer)throw new Error("'layer' parameter form 'Minimap' constructor should be a 'ColorLayer'.");if((e=c.call(this,t,i,v)).minScale=i.minScale||v.minScale,e.maxScale=i.maxScale||v.maxScale,e.zoomRatio=i.zoomRatio||v.zoomRatio,e.domElement.id="widgets-minimap",i.cursor){var a=document.createElement("div");a.id="cursor-wrapper",e.domElement.appendChild(a),"string"==typeof i.cursor?a.innerHTML=i.cursor:i.cursor instanceof HTMLElement&&a.appendChild(i.cursor)}e.view=new f.Z(e.domElement,o.source.extent,{camera:{type:h.P.ORTHOGRAPHIC},placement:o.source.extent,noControls:!0,maxSubdivisionLevel:t.tileLayer.maxSubdivisionLevel}),e.view.addLayer(o),t.domElement.focus(),e.domElement.addEventListener("pointerdown",(function(t){t.stopPropagation(),t.preventDefault()}));var r=e.view.camera.camera3D,s=e.view.getScale(i.pitch),d=r.zoom*e.maxScale/s,m=r.zoom*e.minScale/s,g=new u.Z(t.referenceCrs),y=new u.Z(e.view.referenceCrs),w=t.controls.getCameraTargetPosition();return t.addFrameRequester(p.Ao.AFTER_RENDER,(function(){var o=t.camera.camera3D.position.distanceTo(w),n=t.getScaleFromDistance(i.pitch,o);r.zoom=e.zoomRatio*m*n/e.minScale,r.zoom=Math.min(Math.max(r.zoom,d),m),r.updateProjectionMatrix(),g.setFromVector3(t.controls.getCameraTargetPosition()),g.as(e.view.referenceCrs,y),r.position.x=y.x,r.position.y=y.y,r.updateMatrixWorld(!0),e.view.notifyChange(r)})),e}return(0,i.Z)(l)}(l)}},t=>(58702,t(t.s=58702))])}));
2
+ //# sourceMappingURL=itowns_widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itowns_widgets.js","mappings":"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","sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/./utils/gui/Widget.js","webpack://[name]/./utils/gui/Navigation.js","webpack://[name]/./utils/gui/Minimap.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"itowns_widgets\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"itowns_widgets\"] = factory();\n\telse\n\t\troot[\"itowns_widgets\"] = factory();\n})(self, function() {\nreturn ","import _createClass from \"@babel/runtime/helpers/createClass\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\n\nvar Widget = /*#__PURE__*/_createClass(function Widget(view) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var defaultOptions = arguments.length > 2 ? arguments[2] : undefined;\n\n _classCallCheck(this, Widget);\n\n this.parentElement = options.parentElement || view.domElement;\n this.position = options.position || defaultOptions.position;\n\n if (!['top-left', 'top-right', 'bottom-left', 'bottom-right', 'top', 'bottom', 'left', 'right'].includes(this.position)) {\n console.warn('\\'position\\' optional parameter for \\'Widget\\' constructor is not a valid option. ' + \"It will be set to '\".concat(defaultOptions.position, \"'.\"));\n this.position = defaultOptions.position;\n } // ---------- CREATE A DomElement WITH id, classes AND style RELEVANT TO THE WIDGET PROPERTIES : ----------\n // Create a div containing minimap widget and add it to its specified parent.\n\n\n this.domElement = document.createElement('div');\n this.parentElement.appendChild(this.domElement); // Size widget according to options.\n\n this.domElement.style.width = \"\".concat(options.width || options.size || defaultOptions.width, \"px\");\n this.domElement.style.height = \"\".concat(options.height || options.size || defaultOptions.height, \"px\"); // Position widget according to options.\n\n var positionArray = this.position.split('-');\n this.domElement.classList.add(\"\".concat(positionArray[0], \"-widget\"));\n\n if (positionArray[1]) {\n this.domElement.classList.add(\"\".concat(positionArray[1], \"-widget\"));\n } else {\n // If only one position parameter was given, center the domElement on the other axis.\n // TODO : at this stage, offsetWidth and offsetHeight do no include borders. This should be worked around.\n switch (positionArray[0]) {\n case 'top':\n case 'bottom':\n this.domElement.style.left = \"calc(50% - \".concat(this.domElement.offsetWidth / 2, \"px)\");\n break;\n\n case 'left':\n case 'right':\n this.domElement.style.top = \"calc(50% - \".concat(this.domElement.offsetHeight / 2, \"px)\");\n break;\n\n default:\n break;\n }\n } // Translate widget div according to optional translate parameter.\n\n\n if (options.translate) {\n this.domElement.style.transform = \"translate(\".concat(options.translate.x || 0, \"px, \").concat(options.translate.y || 0, \"px)\");\n }\n});\n\nexport default Widget;","import _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _possibleConstructorReturn from \"@babel/runtime/helpers/possibleConstructorReturn\";\nimport _getPrototypeOf from \"@babel/runtime/helpers/getPrototypeOf\";\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nimport { VIEW_EVENTS } from \"../../src/Core/View\";\nimport Widget from \"./Widget\";\nvar DEFAULT_OPTIONS = {\n parentElement: document.body,\n displayCompass: true,\n display3DToggle: true,\n displayZoomIn: true,\n displayZoomOut: true,\n animationDuration: 500,\n position: 'bottom-left',\n direction: 'column'\n};\n/**\n * A widget menu manager for navigation.\n *\n * @property {HTMLElement} domElement An html div containing all navigation widgets.\n * @property {HTMLElement} parentElement The parent HTML container of `this.domElement`.\n */\n\nvar Navigation = /*#__PURE__*/function (_Widget) {\n _inherits(Navigation, _Widget);\n\n var _super = _createSuper(Navigation);\n\n /**\n * @param {View} view The iTowns view the navigation should be linked\n * to.\n * @param {Object} options The navigation menu optional configuration.\n * @param {HTMLElement} [options.parentElement=document.body] The parent HTML container of the div which\n * contains navigation widgets.\n * @param {boolean} [options.displayCompass=true] Whether the compass widget should be displayed.\n * @param {boolean} [options.display3DToggle=true] Whether the navigation should include a widget\n * to toggle between top and oblique view.\n * @param {boolean} [options.displayZoomIn=true] Whether the zoom-in widget should be displayed.\n * @param {boolean} [options.displayZoomOut=true] Whether the zoom-out widget should be displayed.\n * @param {number} [options.animationDuration=500] The duration of travel animations, when clicking\n * navigation widgets.\n * @param {string} [options.position='bottom-left'] Defines which corner of the `parentElement` the\n * navigation menu should be displayed to.\n * Possible values are `top-left`, `top-right`,\n * `bottom-left` and `bottom-right`. If the input\n * value does not match one of these, it will be\n * defaulted to `bottom-left`.\n * @param {string} [options.direction='column'] Whether the navigation menu should expand\n * horizontally or vertically. Possible values\n * are `column` and `row`. If the input value\n * does not match one of these, it will be\n * defaulted to `column`.\n * @param {Object} [options.translate] An optional translation of the navigation menu.\n * @param {number} [options.translate.x=0] The navigation menu translation along the page\n * x-axis.\n * @param {number} [options.translate.y=0] The navigation menu translation along the page\n * y-axis.\n */\n function Navigation(view) {\n var _this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Navigation);\n\n // ---------- BUILD PROPERTIES ACCORDING TO DEFAULT OPTIONS AND OPTIONS PASSED IN PARAMETERS : ----------\n // `top`, `bottom`, `left` and `right` values for `position` option are not relevant for navigation widget.\n if (['top', 'bottom', 'left', 'right'].includes(options.position)) {\n console.warn('\\'position\\' optional parameter for \\'Navigation\\' is not a valid option. ' + \"It will be set to '\".concat(DEFAULT_OPTIONS.position, \"'.\"));\n options.position = DEFAULT_OPTIONS.position;\n }\n\n _this = _super.call(this, view, options, DEFAULT_OPTIONS);\n _this.direction = options.direction || DEFAULT_OPTIONS.direction;\n\n if (!['column', 'row'].includes(_this.direction)) {\n console.warn('\\'direction\\' optional parameter for \\'Navigation\\' constructor is not a valid option. ' + \"It will be set to '\".concat(DEFAULT_OPTIONS.direction, \"'.\"));\n _this.direction = DEFAULT_OPTIONS.direction;\n }\n\n _this.animationDuration = options.animationDuration === undefined ? DEFAULT_OPTIONS.animationDuration : options.animationDuration; // ---------- CREATE A DomElement WITH id AND classes RELEVANT TO THE WIDGET PROPERTIES : ----------\n // Create a div containing all widgets and add it to its specified parent.\n\n _this.domElement.id = 'widgets-navigation'; // Position widget div according to options.\n\n _this.domElement.classList.add(\"\".concat(_this.direction, \"-widget\")); // ---------- CREATE THE DEFAULT WIDGETS IF NOT HIDDEN (COMPASS, 3D AND ZOOM BUTTONS) : ----------\n // Add a compass widget if requested.\n\n\n if (options.displayCompass === undefined ? DEFAULT_OPTIONS.displayCompass : options.displayCompass) {\n _this.compass = _this.addButton('compass', '', function () {\n view.controls.lookAtCoordinate({\n heading: 0,\n tilt: 89.5,\n time: _this.animationDuration\n });\n }, 'widgets'); // Manage compass rotation when the view's camera is moved.\n\n view.addEventListener(VIEW_EVENTS.CAMERA_MOVED, function (event) {\n _this.compass.style.transform = \"rotate(\".concat(-event.heading, \"deg)\");\n });\n } // Add a 3D toggle button if requested.\n\n\n if (options.display3DToggle === undefined ? DEFAULT_OPTIONS.display3DToggle : options.display3DToggle) {\n _this.switch3dButton = _this.addButton('3d-button', '3D', function () {\n var tilt;\n\n if (view.controls.getTilt() < 89) {\n tilt = 89.5;\n } else {\n tilt = 40;\n }\n\n view.controls.lookAtCoordinate({\n tilt: tilt,\n time: _this.animationDuration\n });\n }); // Manage button content toggle when the view's camera is moved.\n\n view.addEventListener(VIEW_EVENTS.CAMERA_MOVED, function (event) {\n _this.switch3dButton.innerHTML = event.tilt < 89 ? '2D' : '3D';\n });\n } // Add a zoom-in button if requested.\n\n\n if (options.displayZoomIn === undefined ? DEFAULT_OPTIONS.displayZoomIn : options.displayZoomIn) {\n _this.zoomInButton = _this.addButton('zoom-in-button', '<span class=\"widget-zoom-button-logo\"></span>', function () {\n view.controls.lookAtCoordinate({\n zoom: Math.min(20, view.controls.getZoom() + 1),\n time: _this.animationDuration\n });\n }, 'zoom-button-bar');\n } // Add a zoom-out button if requested.\n\n\n if (options.displayZoomOut === undefined ? DEFAULT_OPTIONS.displayZoomOut : options.displayZoomOut) {\n _this.zoomOutButton = _this.addButton('zoom-out-button', '<span id=\"zoom-out-logo\" class=\"widget-zoom-button-logo\"></span>', function () {\n view.controls.lookAtCoordinate({\n zoom: Math.max(3, view.controls.getZoom() - 1),\n time: _this.animationDuration\n });\n }, 'zoom-button-bar');\n }\n\n return _this;\n }\n /**\n *\n * @param {string} id The unique id the created button should be given.\n * @param {string} [content=''] An HTML string defining the content of the button.\n * @param {function} [actionOnClick] The method that should be executed when the button is clicked on.\n * @param {string} [parentId] The unique id of a button bar in which the created button should be added.\n * A button bar is a group which contains one or several buttons. All\n * buttons created with Navigation are in a button bar. If the given id does\n * not match an already existing button bar, a new button bar will be created\n * with this id. If no id is given, a button bar will be created with no id.\n * The later case can be useful for creating isolated buttons.\n *\n * @returns {HTMLButtonElement} The created button.\n */\n\n\n _createClass(Navigation, [{\n key: \"addButton\",\n value: function addButton(id) {\n var content = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var actionOnClick = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};\n var parentId = arguments.length > 3 ? arguments[3] : undefined;\n var buttonBar = document.getElementById(parentId);\n\n if (!buttonBar) {\n buttonBar = this.addButtonBar(parentId);\n }\n\n var button = document.createElement('button');\n button.className = 'widget-button';\n button.id = id;\n button.innerHTML = content;\n buttonBar.appendChild(button);\n button.addEventListener('click', actionOnClick);\n return button;\n }\n }, {\n key: \"addButtonBar\",\n value: function addButtonBar(id) {\n var buttonBar = document.createElement('div');\n buttonBar.className = 'widget-button-bar';\n\n if (id) {\n buttonBar.id = id;\n }\n\n this.domElement.appendChild(buttonBar);\n return buttonBar;\n }\n }]);\n\n return Navigation;\n}(Widget);\n\nexport default Navigation;","import _createClass from \"@babel/runtime/helpers/createClass\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _possibleConstructorReturn from \"@babel/runtime/helpers/possibleConstructorReturn\";\nimport _getPrototypeOf from \"@babel/runtime/helpers/getPrototypeOf\";\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function () { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nimport Coordinates from \"../../src/Core/Geographic/Coordinates\";\nimport { MAIN_LOOP_EVENTS } from \"../../src/Core/MainLoop\";\nimport PlanarView from \"../../src/Core/Prefab/PlanarView\";\nimport { CAMERA_TYPE } from \"../../src/Renderer/Camera\";\nimport Widget from \"./Widget\";\nvar DEFAULT_OPTIONS = {\n minScale: 1 / 500000,\n maxScale: 1 / 5E8,\n zoomRatio: 1 / 30,\n width: 150,\n height: 150,\n position: 'bottom-left'\n};\n/**\n * A widget for minimap\n *\n * @property {HTMLElement} domElement An html div containing the minimap.\n * @property {HTMLElement} parentElement The parent HTML container of `this.domElement`.\n */\n\nvar Minimap = /*#__PURE__*/function (_Widget) {\n _inherits(Minimap, _Widget);\n\n var _super = _createSuper(Minimap);\n\n /**\n * @param {GlobeView} view The iTowns view the minimap should be\n * linked to. Only {@link GlobeView} is\n * supported at the moment.\n * @param {ColorLayer} layer The {@link ColorLayer} that should be\n * displayed on the minimap.\n * @param {Object} [options] The minimap optional configuration.\n * @param {HTMLElement} [options.parentElement=view.domElement] The parent HTML container of the div\n * which contains minimap widgets.\n * @param {number} [options.size] The size of the minimap. It is a number\n * that describing both width and height\n * in pixels of the minimap.\n * @param {number} [options.width=150] The width in pixels of the minimap.\n * @param {number} [options.height=150] The height in pixels of the minimap.\n * @param {string} [options.position='bottom-left'] Defines which corner of the\n * `parentElement` the minimap should be\n * displayed to. Possible values are\n * `top-left`, `top-right`, `bottom-left`\n * and `bottom-right`. If the input value\n * does not match one of these, it will\n * be defaulted to `bottom-left`.\n * @param {Object} [options.translate] An optional translation of the minimap.\n * @param {number} [options.translate.x=0] The minimap translation along the page\n * x-axis.\n * @param {number} [options.translate.y=0] The minimap translation along the page\n * y-axis.\n * @param {HTMLElement|string} [options.cursor] An html element or an HTML string\n * describing a cursor showing minimap\n * view camera target position at the\n * center of the minimap.\n * @param {number} [options.minScale=1/2000] The minimal scale the minimap can reach.\n * @param {number} [options.maxScale=1/1_250_000] The maximal scale the minimap can reach.\n * @param {number} [options.zoomRatio=1/30] The ratio between minimap camera zoom\n * and view camera zoom.\n * @param {number} [options.pitch=0.28] The screen pixel pitch, used to compute\n * view and minimap scale.\n */\n function Minimap(view, layer) {\n var _this;\n\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n _classCallCheck(this, Minimap);\n\n // ---------- BUILD PROPERTIES ACCORDING TO DEFAULT OPTIONS AND OPTIONS PASSED IN PARAMETERS : ----------\n if (!view.isGlobeView) {\n throw new Error('\\'Minimap\\' plugin only supports \\'GlobeView\\'. Therefore, the \\'view\\' parameter must be a ' + '\\'GlobeView\\'.');\n }\n\n if (!layer.isColorLayer) {\n throw new Error('\\'layer\\' parameter form \\'Minimap\\' constructor should be a \\'ColorLayer\\'.');\n }\n\n _this = _super.call(this, view, options, DEFAULT_OPTIONS);\n _this.minScale = options.minScale || DEFAULT_OPTIONS.minScale;\n _this.maxScale = options.maxScale || DEFAULT_OPTIONS.maxScale; // TODO : it could be interesting to be able to specify a method as zoomRatio parameter. This method could\n // return a zoom ratio from the scale of the minimap.\n\n _this.zoomRatio = options.zoomRatio || DEFAULT_OPTIONS.zoomRatio; // ---------- this.domElement SETTINGS SPECIFIC TO MINIMAP : ----------\n\n _this.domElement.id = 'widgets-minimap'; // Display a cursor at the center of the minimap, if requested.\n\n if (options.cursor) {\n // Wrap cursor domElement inside a div to center it in minimap.\n var cursorWrapper = document.createElement('div');\n cursorWrapper.id = 'cursor-wrapper';\n\n _this.domElement.appendChild(cursorWrapper); // Add specified cursor to its wrapper.\n\n\n if (typeof options.cursor === 'string') {\n cursorWrapper.innerHTML = options.cursor;\n } else if (options.cursor instanceof HTMLElement) {\n cursorWrapper.appendChild(options.cursor);\n }\n } // ---------- CREATE A MINIMAP View AND DISPLAY DATA PASSED IN Layer PARAMETER : ----------\n\n\n _this.view = new PlanarView(_this.domElement, layer.source.extent, {\n camera: {\n type: CAMERA_TYPE.ORTHOGRAPHIC\n },\n placement: layer.source.extent,\n // TODO : the default placement should be the view extent for ortho camera\n noControls: true,\n maxSubdivisionLevel: view.tileLayer.maxSubdivisionLevel\n });\n\n _this.view.addLayer(layer); // TODO : should this promise be returned by constructor so that user can use it ?\n // Give the focus back to the main view. Indeed, `View` constructor takes the focus, and we don't want the focus\n // on the latest created `View`, which is the minimap view.\n\n\n view.domElement.focus(); // Prevent the minimap domElement to get focus when clicked, and prevent click event to be propagated to the\n // main view controls.\n\n _this.domElement.addEventListener('pointerdown', function (event) {\n event.stopPropagation();\n event.preventDefault();\n }); // Store minimap view camera3D in constant for code convenience.\n\n\n var camera3D = _this.view.camera.camera3D; // ---------- UPDATE MINIMAP VIEW WHEN UPDATING THE MAIN VIEW : ----------\n // The minimal and maximal value the minimap camera3D zoom can reach in order to stay in the scale limits.\n\n var initialScale = _this.view.getScale(options.pitch);\n\n var minZoom = camera3D.zoom * _this.maxScale / initialScale;\n var maxZoom = camera3D.zoom * _this.minScale / initialScale; // Coordinates used to transform position vectors from the main view CRS to the minimap view CRS.\n\n var mainViewCoordinates = new Coordinates(view.referenceCrs);\n var viewCoordinates = new Coordinates(_this.view.referenceCrs);\n var targetPosition = view.controls.getCameraTargetPosition();\n view.addFrameRequester(MAIN_LOOP_EVENTS.AFTER_RENDER, function () {\n // Update minimap camera zoom\n var distance = view.camera.camera3D.position.distanceTo(targetPosition);\n var scale = view.getScaleFromDistance(options.pitch, distance);\n camera3D.zoom = _this.zoomRatio * maxZoom * scale / _this.minScale;\n camera3D.zoom = Math.min(Math.max(camera3D.zoom, minZoom), maxZoom);\n camera3D.updateProjectionMatrix(); // Update minimap camera position.\n\n mainViewCoordinates.setFromVector3(view.controls.getCameraTargetPosition());\n mainViewCoordinates.as(_this.view.referenceCrs, viewCoordinates);\n camera3D.position.x = viewCoordinates.x;\n camera3D.position.y = viewCoordinates.y;\n camera3D.updateMatrixWorld(true);\n\n _this.view.notifyChange(camera3D);\n });\n return _this;\n }\n\n return _createClass(Minimap);\n}(Widget);\n\nexport default Minimap;"],"names":["root","factory","exports","module","define","amd","self","Widget","view","options","arguments","length","undefined","defaultOptions","this","parentElement","domElement","position","includes","console","warn","concat","document","createElement","appendChild","style","width","size","height","positionArray","split","classList","add","left","offsetWidth","top","offsetHeight","translate","transform","x","y","DEFAULT_OPTIONS","body","displayCompass","display3DToggle","displayZoomIn","displayZoomOut","animationDuration","direction","_Widget","Navigation","Derived","hasNativeReflectConstruct","_super","Reflect","construct","sham","Proxy","Boolean","prototype","valueOf","call","e","_isNativeReflectConstruct","result","Super","NewTarget","constructor","apply","_this","id","compass","addButton","controls","lookAtCoordinate","heading","tilt","time","addEventListener","event","switch3dButton","getTilt","innerHTML","zoomInButton","zoom","Math","min","getZoom","zoomOutButton","max","key","value","content","actionOnClick","parentId","buttonBar","getElementById","addButtonBar","button","className","minScale","maxScale","zoomRatio","Minimap","layer","isGlobeView","Error","isColorLayer","cursor","cursorWrapper","HTMLElement","PlanarView","source","extent","camera","type","placement","noControls","maxSubdivisionLevel","tileLayer","addLayer","focus","stopPropagation","preventDefault","camera3D","initialScale","getScale","pitch","minZoom","maxZoom","mainViewCoordinates","Coordinates","referenceCrs","viewCoordinates","targetPosition","getCameraTargetPosition","addFrameRequester","distance","distanceTo","scale","getScaleFromDistance","updateProjectionMatrix","setFromVector3","as","updateMatrixWorld","notifyChange"],"sourceRoot":""}
@@ -8,6 +8,10 @@
8
8
  "view_immersive": "Immersive view"
9
9
  },
10
10
 
11
+ "Geoid": {
12
+ "geoid_geoidLayer": "Display geoid heights"
13
+ },
14
+
11
15
  "3d Tiles": {
12
16
  "3dtiles_basic": "Basic",
13
17
  "3dtiles_batch_table": "Batch table",
@@ -28,19 +32,29 @@
28
32
  "vector_tile_dragndrop": "Drag and drop a style"
29
33
  },
30
34
 
31
- "Source / Stream": {
35
+ "WFS source": {
32
36
  "source_stream_wfs_25d": "WFS to 2.5D objects",
33
37
  "source_stream_wfs_3d": "WFS to 3D objects",
34
38
  "source_stream_wfs_raster": "WFS to raster"
35
39
  },
36
40
 
37
- "Source / File": {
38
- "source_file_gpx_3d": "GPX to 3D objects",
39
- "source_file_geojson_3d": "GeoJSON to 3D objects",
40
- "source_file_shapefile": "Shapefile to raster",
41
+ "Specific source options": {
42
+ "source_file_from_format": "format",
43
+ "source_file_from_methods": "fetcher and parser"
44
+ },
45
+
46
+ "FileSource": {
41
47
  "source_file_geojson_raster": "GeoJSON to raster",
48
+ "source_file_geojson_3d": "GeoJSON to 3D objects",
49
+ "source_file_kml_raster": "KML to raster",
42
50
  "source_file_gpx_raster": "GPX to raster",
43
- "source_file_kml_raster": "KML to raster"
51
+ "source_file_gpx_3d": "GPX to 3D objects"
52
+ },
53
+
54
+ "Customize FileSource": {
55
+ "source_file_from_fetched_data": "Handle fetching step",
56
+ "source_file_from_parsed_data": "Handle parsing step",
57
+ "source_file_shapefile": "Shapefile case"
44
58
  },
45
59
 
46
60
  "Effects": {
@@ -64,6 +78,11 @@
64
78
  "misc_camera_traveling": "Camera traveling"
65
79
  },
66
80
 
81
+ "Widgets": {
82
+ "widgets_navigation": "Navigation",
83
+ "widgets_minimap": "Minimap"
84
+ },
85
+
67
86
  "Plugins": {
68
87
  "plugins_drag_n_drop": "Drag and drop",
69
88
  "plugins_pyramidal_tiff": "Pyramidal TIFFs",
@@ -0,0 +1,248 @@
1
+ /* ---------- GENERIC WIDGET SETTINGS : ----------------------------------------------------------------------------- */
2
+
3
+ /* Define widget position according to its position settings. */
4
+ .top-widget {
5
+ top: 10px;
6
+ }
7
+ .bottom-widget {
8
+ bottom: 10px;
9
+ }
10
+ .left-widget {
11
+ left: 10px;
12
+ }
13
+ .right-widget {
14
+ right: 10px;
15
+ }
16
+
17
+
18
+
19
+ /* ---------- NAVIGATION WIDGET SETTINGS : -------------------------------------------------------------------------- */
20
+
21
+ #widgets-navigation {
22
+ position: absolute;
23
+ z-index: 10;
24
+
25
+ display: flex;
26
+ align-items: center;
27
+ }
28
+
29
+ /* Define navigation menu flex direction according to its position and direction settings */
30
+ .column-widget.top-widget {
31
+ flex-direction: column;
32
+ }
33
+ .column-widget.bottom-widget {
34
+ flex-direction: column-reverse;
35
+ }
36
+ .row-widget.left-widget {
37
+ flex-direction: row;
38
+ }
39
+ .row-widget.right-widget {
40
+ flex-direction: row-reverse;
41
+ }
42
+
43
+ /* Define spacing between each navigation widgets according to position and direction settings. */
44
+ #widgets-navigation.column-widget.top-widget > *:not(:first-child),
45
+ #widgets-navigation.column-widget.bottom-widget > *:not(:last-child) {
46
+ margin-top: 5px;
47
+ }
48
+ #widgets-navigation.column-widget.top-widget > *:not(:last-child),
49
+ #widgets-navigation.column-widget.bottom-widget > *:not(:first-child) {
50
+ margin-bottom: 5px;
51
+ }
52
+ #widgets-navigation.row-widget.left-widget > *:not(:first-child),
53
+ #widgets-navigation.row-widget.right-widget > *:not(:last-child) {
54
+ margin-left: 5px;
55
+ }
56
+ #widgets-navigation.row-widget.left-widget > *:not(:last-child),
57
+ #widgets-navigation.row-widget.right-widget > *:not(:first-child) {
58
+ margin-right: 5px;
59
+ }
60
+
61
+
62
+
63
+ /* ---------- NAVIGATION BUTTON BAR : ------------------------------------------------------------------------------- */
64
+
65
+ /* Define button-bar flex direction according to widget position and direction settings. */
66
+ #widgets-navigation .widget-button-bar {
67
+ display: flex;
68
+ }
69
+ #widgets-navigation.column-widget.top-widget .widget-button-bar {
70
+ flex-direction: column;
71
+ }
72
+ #widgets-navigation.column-widget.bottom-widget .widget-button-bar {
73
+ flex-direction: column-reverse;
74
+ }
75
+ #widgets-navigation.row-widget.left-widget .widget-button-bar {
76
+ flex-direction: row;
77
+ }
78
+ #widgets-navigation.row-widget.right-widget .widget-button-bar {
79
+ flex-direction: row-reverse;
80
+ }
81
+
82
+
83
+
84
+ /* ---------- BUTTONS GENERIC STYLE : ------------------------------------------------------------------------------- */
85
+
86
+ #widgets-navigation .widget-button {
87
+ background-color: #313336bb;
88
+ border: 1px solid #222222;
89
+ padding: 0;
90
+
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+
95
+ font-weight: 900;
96
+ font-size: 15px;
97
+ }
98
+ #widgets-navigation .widget-button:hover {
99
+ cursor: pointer;
100
+ }
101
+ #widgets-navigation .widget-button:active {
102
+ background-color: #222222;
103
+ }
104
+
105
+
106
+
107
+ /* ---------- BUTTONS SHAPE AND POSITION WITHIN BUTTON-BAR : -------------------------------------------------------- */
108
+
109
+ #widgets-navigation .widget-button-bar > .widget-button {
110
+ height: 30px;
111
+ width: 30px;
112
+
113
+ color: white;
114
+ }
115
+
116
+ /* Buttons shape and position within a column direction widget group. */
117
+ #widgets-navigation.column-widget.top-widget .widget-button-bar > .widget-button:first-child:not(:only-child),
118
+ #widgets-navigation.column-widget.bottom-widget .widget-button-bar > .widget-button:last-child:not(:only-child) {
119
+ border-radius: 7px 7px 0 0;
120
+ }
121
+ #widgets-navigation.column-widget.top-widget .widget-button-bar > .widget-button:last-child:not(:only-child),
122
+ #widgets-navigation.column-widget.bottom-widget .widget-button-bar > .widget-button:first-child:not(:only-child) {
123
+ border-radius: 0 0 7px 7px;
124
+ }
125
+ #widgets-navigation.column-widget.top-widget .widget-button-bar > .widget-button:not(:last-child),
126
+ #widgets-navigation.column-widget.bottom-widget .widget-button-bar > .widget-button:not(:first-child) {
127
+ margin-bottom: -1px;
128
+ }
129
+
130
+ /* Buttons shape and position within a row direction widget group. */
131
+ #widgets-navigation.row-widget.left-widget .widget-button-bar > .widget-button:first-child:not(:only-child),
132
+ #widgets-navigation.row-widget.right-widget .widget-button-bar > .widget-button:last-child:not(:only-child) {
133
+ border-radius: 7px 0 0 7px;
134
+ }
135
+ #widgets-navigation.row-widget.left-widget .widget-button-bar > .widget-button:last-child:not(:only-child),
136
+ #widgets-navigation.row-widget.right-widget .widget-button-bar > .widget-button:first-child:not(:only-child) {
137
+ border-radius: 0 7px 7px 0;
138
+ }
139
+ #widgets-navigation.row-widget.left-widget .widget-button-bar > .widget-button:not(:last-child),
140
+ #widgets-navigation.row-widget.right-widget .widget-button-bar > .widget-button:not(:first-child) {
141
+ margin-right: -1px;
142
+ }
143
+
144
+ /* Buttons shape and position within a single button button-bar. */
145
+ #widgets-navigation .widget-button-bar > .widget-button:only-child {
146
+ border-radius: 7px;
147
+ }
148
+
149
+
150
+
151
+ /* ---------- SPECIFIC SHAPE AND POSITION FOR ZOOM-IN AND ZOOM-OUT BUTTON-BAR AND BUTTONS : ------------------------- */
152
+
153
+ #zoom-button-bar {
154
+ display: flex;
155
+ }
156
+ #widgets-navigation.column-widget #zoom-button-bar {
157
+ flex-direction: column;
158
+ }
159
+ #widgets-navigation.row-widget #zoom-button-bar {
160
+ flex-direction: row-reverse;
161
+ }
162
+
163
+ /* Zoom buttons shape and position within a COLUMN direction widget group. */
164
+ #widgets-navigation.column-widget #zoom-button-bar > .widget-button:first-child {
165
+ border-radius: 7px 7px 0 0;
166
+ }
167
+ #widgets-navigation.column-widget #zoom-button-bar > .widget-button:last-child {
168
+ border-radius: 0 0 7px 7px;
169
+ }
170
+ #widgets-navigation.column-widget.bottom-widget #zoom-button-bar > .widget-button:not(:last-child) {
171
+ margin-top: 0;
172
+ margin-bottom: -1px;
173
+ }
174
+
175
+ /* Zoom buttons shape and position within a ROW direction navigation menu. */
176
+ #widgets-navigation.row-widget #zoom-button-bar > .widget-button:first-child {
177
+ border-radius: 0 7px 7px 0;
178
+ }
179
+ #widgets-navigation.row-widget #zoom-button-bar > .widget-button:last-child {
180
+ border-radius: 7px 0 0 7px;
181
+ }
182
+ #widgets-navigation.row-widget.left-widget #zoom-button-bar > .widget-button:not(:last-child) {
183
+ margin-right: 0;
184
+ margin-left: -1px;
185
+ }
186
+
187
+ /* Zoom button shape and position if user decides to show only one of the two zoom buttons. */
188
+ #widgets-navigation #zoom-button-bar > .widget-button:only-child {
189
+ border-radius: 7px;
190
+ }
191
+
192
+ /* Style of zoom buttons content. */
193
+ #widgets-navigation .widget-zoom-button-logo {
194
+ width: 50%;
195
+ height: 50%;
196
+
197
+ background-image: url('../images/widget-logo.svg');
198
+ background-size: 100%;
199
+ }
200
+ #widgets-navigation #zoom-out-logo {
201
+ background-position: center -100%;
202
+ }
203
+
204
+
205
+
206
+ /* ---------- SPECIFIC COMPASS SETTINGS : --------------------------------------------------------------------------- */
207
+
208
+ #widgets-navigation #compass {
209
+ width: 60px;
210
+ height: 60px;
211
+
212
+ border-radius: 50%;
213
+
214
+ background-image: url('../images/compass.svg');
215
+ background-repeat: no-repeat;
216
+ background-size: auto 90%;
217
+ background-position: center;
218
+ }
219
+
220
+
221
+
222
+ /* ---------- MINIMAP WIDGET SETTINGS : ----------------------------------------------------------------------------- */
223
+
224
+ #widgets-minimap {
225
+ position: absolute;
226
+ z-index: 10;
227
+
228
+ border: 1px solid #222222;
229
+ border-radius: 7px;
230
+ overflow: hidden;
231
+
232
+ user-select: none;
233
+ }
234
+
235
+ #widgets-minimap #cursor-wrapper {
236
+ position: absolute;
237
+ z-index: 11;
238
+
239
+ display: flex;
240
+ align-items: center;
241
+ justify-content: center;
242
+
243
+ width: 100%;
244
+ height: 100%;
245
+
246
+ font-size: 40px;
247
+ color: #222222;
248
+ }
@@ -0,0 +1,102 @@
1
+ <html>
2
+ <head>
3
+ <title>Itowns - GeoidLayer</title>
4
+
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+
8
+ <link rel="stylesheet" type="text/css" href="css/example.css">
9
+ <link rel="stylesheet" type="text/css" href="css/LoadingScreen.css">
10
+
11
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script>
12
+ </head>
13
+ <body>
14
+ <div id="viewerDiv"></div>
15
+
16
+ <!-- Import iTowns source code -->
17
+ <script src="../dist/itowns.js"></script>
18
+ <script src="../dist/debug.js"></script>
19
+ <!-- Import iTowns LoadingScreen and GuiTools pluggins -->
20
+ <script src="js/GUI/LoadingScreen.js"></script>
21
+ <script src="js/GUI/GuiTools.js"></script>
22
+
23
+ <script type="text/javascript">
24
+
25
+
26
+
27
+ // ---------- CREATE A GlobeView FOR SUPPORTING DATA VISUALIZATION : ----------
28
+
29
+ // Define camera initial position
30
+ const placement = {
31
+ coord: new itowns.Coordinates('EPSG:4326', 2.351323, 48.856712),
32
+ range: 25000000,
33
+ }
34
+
35
+ // `viewerDiv` contains iTowns' rendering area (`<canvas>`)
36
+ const viewerDiv = document.getElementById('viewerDiv');
37
+
38
+ // Create a GlobeView
39
+ const view = new itowns.GlobeView(viewerDiv, placement);
40
+
41
+ // Setup loading screen and debug menu
42
+ setupLoadingScreen(viewerDiv, view);
43
+ const debugMenu = new GuiTools('menuDiv', view);
44
+
45
+
46
+
47
+ // ---------- DISPLAY CONTEXTUAL DATA : ----------
48
+
49
+ // Add one imagery layer to the scene. This layer's properties are defined in a json file, but it could be
50
+ // defined as a plain js object. See `Layer` documentation for more info.
51
+ itowns.Fetcher.json('layers/JSONLayers/Ortho.json').then((config) => {
52
+ config.source = new itowns.WMTSSource(config.source);
53
+ view.addLayer(
54
+ new itowns.ColorLayer(config.id, config),
55
+ ).then(debugMenu.addLayerGUI.bind(debugMenu));
56
+ });
57
+
58
+ // Add two elevaion layers, each with a different level of detail. Here again, each layer's properties are
59
+ // defined in a json file.
60
+ function addElevationLayerFromConfig(config) {
61
+ config.source = new itowns.WMTSSource(config.source);
62
+ view.addLayer(
63
+ new itowns.ElevationLayer(config.id, config),
64
+ ).then(debugMenu.addLayerGUI.bind(debugMenu));
65
+ }
66
+ itowns.Fetcher.json('layers/JSONLayers/WORLD_DTM.json').then(addElevationLayerFromConfig);
67
+ itowns.Fetcher.json('layers/JSONLayers/IGN_MNT_HIGHRES.json').then(addElevationLayerFromConfig);
68
+
69
+
70
+
71
+ // ---------- DISPLAY GEOID HEIGHT DATA : ----------
72
+
73
+ // As both ElevationLayers data consist in altitudes, and as iTowns GlobeView displays elevation data as
74
+ // ellipsoid heights, we must add a GeoidLayer to display the altitudes correctly.
75
+
76
+ // Define the source of a geoid height grid, which serves as a conversion grid between altitudes and
77
+ // ellipsoid heights.
78
+ const geoidSource = new itowns.FileSource({
79
+ url: 'https://raw.githubusercontent.com/iTowns/iTowns2-sample-data/master/altitude-conversion-grids/' +
80
+ 'RAF20_float.gtx',
81
+ crs: 'EPSG:4326',
82
+ format: 'application/gtx',
83
+ });
84
+ // Specify the type geoid height data are encoded with. See GTXParser documentation at
85
+ // http://www.itowns-project.org/itowns/docs/#api/Parser/GTXParser for more.
86
+ geoidSource.dataType = 'float';
87
+
88
+ // Create a Layer to support geoid height data and add it to the view.
89
+ const geoidLayer = new itowns.GeoidLayer('geoid', {
90
+ source: geoidSource,
91
+ });
92
+ view.addLayer(geoidLayer).then(debugMenu.addLayerGUI.bind(debugMenu));
93
+
94
+
95
+
96
+ // ---------- DEBUG TOOLS : ----------
97
+
98
+ debug.createTileDebugUI(debugMenu.gui, view);
99
+
100
+ </script>
101
+ </body>
102
+ </html>
@@ -0,0 +1,60 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg version="1.2" width="45.56mm" height="154.55mm" viewBox="8073 6473 4556 15455" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="http://sun.com/xmlns/staroffice/presentation" xmlns:smil="http://www.w3.org/2001/SMIL20/" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xml:space="preserve">
4
+ <defs class="EmbeddedBulletChars">
5
+ <g id="bullet-char-template-57356" transform="scale(0.00048828125,-0.00048828125)">
6
+ <path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
7
+ </g>
8
+ <g id="bullet-char-template-57354" transform="scale(0.00048828125,-0.00048828125)">
9
+ <path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
10
+ </g>
11
+ <g id="bullet-char-template-10146" transform="scale(0.00048828125,-0.00048828125)">
12
+ <path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
13
+ </g>
14
+ <g id="bullet-char-template-10132" transform="scale(0.00048828125,-0.00048828125)">
15
+ <path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
16
+ </g>
17
+ <g id="bullet-char-template-10007" transform="scale(0.00048828125,-0.00048828125)">
18
+ <path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
19
+ </g>
20
+ <g id="bullet-char-template-10004" transform="scale(0.00048828125,-0.00048828125)">
21
+ <path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
22
+ </g>
23
+ <g id="bullet-char-template-9679" transform="scale(0.00048828125,-0.00048828125)">
24
+ <path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
25
+ </g>
26
+ <g id="bullet-char-template-8226" transform="scale(0.00048828125,-0.00048828125)">
27
+ <path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
28
+ </g>
29
+ <g id="bullet-char-template-8211" transform="scale(0.00048828125,-0.00048828125)">
30
+ <path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
31
+ </g>
32
+ <g id="bullet-char-template-61548" transform="scale(0.00048828125,-0.00048828125)">
33
+ <path d="M 173,740 C 173,903 231,1043 346,1159 462,1274 601,1332 765,1332 928,1332 1067,1274 1183,1159 1299,1043 1357,903 1357,740 1357,577 1299,437 1183,322 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"/>
34
+ </g>
35
+ </defs>
36
+ <g class="Page">
37
+ <g class="com.sun.star.drawing.CustomShape">
38
+ <g id="id3">
39
+ <rect class="BoundingBox" stroke="none" fill="none" x="8073" y="6473" width="4556" height="7756"/>
40
+ <g>
41
+ <defs>
42
+ <linearGradient id="gradient1" x1="7842" y1="10175" x2="12859" y2="10525" gradientUnits="userSpaceOnUse">
43
+ <stop offset="0" style="stop-color:rgb(255,39,39)"/>
44
+ <stop offset="1" style="stop-color:rgb(195,3,3)"/>
45
+ </linearGradient>
46
+ </defs>
47
+ <path style="fill:url(#gradient1)" d="M 10350,6500 L 12601,14201 8100,14201 10350,6500 Z"/>
48
+ </g>
49
+ <path fill="none" stroke="rgb(0,0,0)" stroke-width="53" stroke-linejoin="round" d="M 10350,6500 L 12601,14201 8100,14201 10350,6500 Z"/>
50
+ </g>
51
+ </g>
52
+ <g class="com.sun.star.drawing.CustomShape">
53
+ <g id="id4">
54
+ <rect class="BoundingBox" stroke="none" fill="none" x="8073" y="14172" width="4556" height="7756"/>
55
+ <path fill="rgb(255,255,255)" stroke="none" d="M 10350,21900 L 12601,14199 8100,14199 10350,21900 Z"/>
56
+ <path fill="none" stroke="rgb(0,0,0)" stroke-width="53" stroke-linejoin="round" d="M 10350,21900 L 12601,14199 8100,14199 10350,21900 Z"/>
57
+ </g>
58
+ </g>
59
+ </g>
60
+ </svg>
@@ -0,0 +1,66 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg version="1.2" width="79.01mm" height="158.01mm" viewBox="5500 2100 7901 15801" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="http://sun.com/xmlns/staroffice/presentation" xmlns:smil="http://www.w3.org/2001/SMIL20/" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xml:space="preserve">
4
+ <defs class="EmbeddedBulletChars">
5
+ <g id="bullet-char-template-57356" transform="scale(0.00048828125,-0.00048828125)">
6
+ <path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
7
+ </g>
8
+ <g id="bullet-char-template-57354" transform="scale(0.00048828125,-0.00048828125)">
9
+ <path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
10
+ </g>
11
+ <g id="bullet-char-template-10146" transform="scale(0.00048828125,-0.00048828125)">
12
+ <path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
13
+ </g>
14
+ <g id="bullet-char-template-10132" transform="scale(0.00048828125,-0.00048828125)">
15
+ <path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
16
+ </g>
17
+ <g id="bullet-char-template-10007" transform="scale(0.00048828125,-0.00048828125)">
18
+ <path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
19
+ </g>
20
+ <g id="bullet-char-template-10004" transform="scale(0.00048828125,-0.00048828125)">
21
+ <path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
22
+ </g>
23
+ <g id="bullet-char-template-9679" transform="scale(0.00048828125,-0.00048828125)">
24
+ <path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
25
+ </g>
26
+ <g id="bullet-char-template-8226" transform="scale(0.00048828125,-0.00048828125)">
27
+ <path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
28
+ </g>
29
+ <g id="bullet-char-template-8211" transform="scale(0.00048828125,-0.00048828125)">
30
+ <path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
31
+ </g>
32
+ <g id="bullet-char-template-61548" transform="scale(0.00048828125,-0.00048828125)">
33
+ <path d="M 173,740 C 173,903 231,1043 346,1159 462,1274 601,1332 765,1332 928,1332 1067,1274 1183,1159 1299,1043 1357,903 1357,740 1357,577 1299,437 1183,322 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"/>
34
+ </g>
35
+ </defs>
36
+ <g class="Page">
37
+ <g class="com.sun.star.drawing.CustomShape">
38
+ <g id="id3">
39
+ <rect class="BoundingBox" stroke="none" fill="none" x="5899" y="5100" width="7103" height="1902"/>
40
+ <path fill="rgb(255,255,255)" stroke="none" d="M 6216,5100 L 6217,5100 C 6161,5100 6107,5115 6058,5142 6010,5170 5970,5210 5942,5258 5915,5307 5900,5361 5900,5417 L 5900,6684 5900,6684 C 5900,6740 5915,6794 5942,6843 5970,6891 6010,6931 6058,6959 6107,6986 6161,7001 6217,7001 L 12684,7001 12684,7001 C 12740,7001 12794,6986 12843,6959 12891,6931 12931,6891 12959,6843 12986,6794 13001,6740 13001,6684 L 13001,5416 13001,5417 13001,5417 C 13001,5361 12986,5307 12959,5258 12931,5210 12891,5170 12843,5142 12794,5115 12740,5100 12684,5100 L 6216,5100 Z"/>
41
+ </g>
42
+ </g>
43
+ <g class="com.sun.star.drawing.CustomShape">
44
+ <g id="id4">
45
+ <rect class="BoundingBox" stroke="none" fill="none" x="5500" y="2100" width="7901" height="7901"/>
46
+ </g>
47
+ </g>
48
+ <g class="com.sun.star.drawing.CustomShape">
49
+ <g id="id5">
50
+ <rect class="BoundingBox" stroke="none" fill="none" x="8499" y="2499" width="1903" height="7103"/>
51
+ <path fill="rgb(255,255,255)" stroke="none" d="M 8500,9285 L 8500,9284 C 8500,9340 8515,9394 8542,9443 8570,9491 8610,9531 8658,9559 8707,9586 8761,9601 8817,9601 L 10084,9601 10084,9601 C 10140,9601 10194,9586 10243,9559 10291,9531 10331,9491 10359,9443 10386,9394 10401,9340 10401,9284 L 10401,2817 10401,2817 C 10401,2761 10386,2707 10359,2658 10331,2610 10291,2570 10243,2542 10194,2515 10140,2500 10084,2500 L 8816,2500 8817,2500 8817,2500 C 8761,2500 8707,2515 8658,2542 8610,2570 8570,2610 8542,2658 8515,2707 8500,2761 8500,2817 L 8500,9285 Z"/>
52
+ </g>
53
+ </g>
54
+ <g class="com.sun.star.drawing.CustomShape">
55
+ <g id="id6">
56
+ <rect class="BoundingBox" stroke="none" fill="none" x="5899" y="13000" width="7103" height="1902"/>
57
+ <path fill="rgb(255,255,255)" stroke="none" d="M 6216,13000 L 6217,13000 C 6161,13000 6107,13015 6058,13042 6010,13070 5970,13110 5942,13158 5915,13207 5900,13261 5900,13317 L 5900,14584 5900,14584 C 5900,14640 5915,14694 5942,14743 5970,14791 6010,14831 6058,14859 6107,14886 6161,14901 6217,14901 L 12684,14901 12684,14901 C 12740,14901 12794,14886 12843,14859 12891,14831 12931,14791 12959,14743 12986,14694 13001,14640 13001,14584 L 13001,13316 13001,13317 13001,13317 C 13001,13261 12986,13207 12959,13158 12931,13110 12891,13070 12843,13042 12794,13015 12740,13000 12684,13000 L 6216,13000 Z"/>
58
+ </g>
59
+ </g>
60
+ <g class="com.sun.star.drawing.CustomShape">
61
+ <g id="id7">
62
+ <rect class="BoundingBox" stroke="none" fill="none" x="5500" y="10000" width="7901" height="7901"/>
63
+ </g>
64
+ </g>
65
+ </g>
66
+ </svg>