cesium 0.13.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.
- data/LICENSE.md +259 -0
- data/README.rdoc +90 -0
- data/Rakefile +40 -0
- data/app/assets/javascripts/Assets/Assets.profile.js +8 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_0.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_1.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_10.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_11.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_12.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_13.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_14.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_15.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_16.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_17.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_18.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_19.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_2.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_20.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_21.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_22.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_23.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_24.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_25.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_26.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_27.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_3.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_4.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_5.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_6.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_7.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_8.json +1 -0
- data/app/assets/javascripts/Assets/IAU2006_XYS/IAU2006_XYS_9.json +1 -0
- data/app/assets/javascripts/Assets/Textures/NE2_LR_LC_SR_W_DR_2048.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_my.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_px.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_py.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg +0 -0
- data/app/assets/javascripts/Assets/Textures/waterNormals.jpg +0 -0
- data/app/assets/javascripts/Assets/package.json +6 -0
- data/app/assets/javascripts/Cesium.js +320 -0
- data/app/assets/javascripts/Core/AnimationController.js +148 -0
- data/app/assets/javascripts/Core/AxisAlignedBoundingBox.js +243 -0
- data/app/assets/javascripts/Core/BoundingRectangle.js +364 -0
- data/app/assets/javascripts/Core/BoundingSphere.js +819 -0
- data/app/assets/javascripts/Core/BoxTessellator.js +93 -0
- data/app/assets/javascripts/Core/Cartesian2.js +762 -0
- data/app/assets/javascripts/Core/Cartesian3.js +861 -0
- data/app/assets/javascripts/Core/Cartesian4.js +762 -0
- data/app/assets/javascripts/Core/Cartographic.js +211 -0
- data/app/assets/javascripts/Core/CatmullRomSpline.js +232 -0
- data/app/assets/javascripts/Core/Clock.js +195 -0
- data/app/assets/javascripts/Core/ClockRange.js +37 -0
- data/app/assets/javascripts/Core/ClockStep.js +32 -0
- data/app/assets/javascripts/Core/Color.js +1629 -0
- data/app/assets/javascripts/Core/ComponentDatatype.js +119 -0
- data/app/assets/javascripts/Core/Core.profile.js +8 -0
- data/app/assets/javascripts/Core/CubeMapEllipsoidTessellator.js +198 -0
- data/app/assets/javascripts/Core/CubicRealPolynomial.js +251 -0
- data/app/assets/javascripts/Core/DefaultProxy.js +30 -0
- data/app/assets/javascripts/Core/DeveloperError.js +60 -0
- data/app/assets/javascripts/Core/EarthOrientationParameters.js +383 -0
- data/app/assets/javascripts/Core/EarthOrientationParametersSample.js +50 -0
- data/app/assets/javascripts/Core/Ellipsoid.js +539 -0
- data/app/assets/javascripts/Core/EllipsoidTangentPlane.js +207 -0
- data/app/assets/javascripts/Core/EllipsoidalOccluder.js +151 -0
- data/app/assets/javascripts/Core/EncodedCartesian3.js +197 -0
- data/app/assets/javascripts/Core/Enumeration.js +67 -0
- data/app/assets/javascripts/Core/Event.js +122 -0
- data/app/assets/javascripts/Core/Extent.js +383 -0
- data/app/assets/javascripts/Core/ExtentTessellator.js +384 -0
- data/app/assets/javascripts/Core/FAR.js +13 -0
- data/app/assets/javascripts/Core/FeatureDetection.js +126 -0
- data/app/assets/javascripts/Core/Fullscreen.js +235 -0
- data/app/assets/javascripts/Core/GeographicProjection.js +107 -0
- data/app/assets/javascripts/Core/HermitePolynomialApproximation.js +176 -0
- data/app/assets/javascripts/Core/HermiteSpline.js +234 -0
- data/app/assets/javascripts/Core/Iau2006XysData.js +259 -0
- data/app/assets/javascripts/Core/Iau2006XysSample.js +36 -0
- data/app/assets/javascripts/Core/IndexDatatype.js +28 -0
- data/app/assets/javascripts/Core/Intersect.js +40 -0
- data/app/assets/javascripts/Core/IntersectionTests.js +359 -0
- data/app/assets/javascripts/Core/Interval.js +27 -0
- data/app/assets/javascripts/Core/Iso8601.js +46 -0
- data/app/assets/javascripts/Core/JulianDate.js +1228 -0
- data/app/assets/javascripts/Core/KeyboardEventModifier.js +38 -0
- data/app/assets/javascripts/Core/LagrangePolynomialApproximation.js +96 -0
- data/app/assets/javascripts/Core/LeapSecond.js +158 -0
- data/app/assets/javascripts/Core/LinearApproximation.js +98 -0
- data/app/assets/javascripts/Core/Math.js +532 -0
- data/app/assets/javascripts/Core/Matrix2.js +833 -0
- data/app/assets/javascripts/Core/Matrix3.js +1099 -0
- data/app/assets/javascripts/Core/Matrix4.js +2164 -0
- data/app/assets/javascripts/Core/MeshFilters.js +568 -0
- data/app/assets/javascripts/Core/Occluder.js +474 -0
- data/app/assets/javascripts/Core/OrientationInterpolator.js +109 -0
- data/app/assets/javascripts/Core/PlaneTessellator.js +74 -0
- data/app/assets/javascripts/Core/PolygonPipeline.js +792 -0
- data/app/assets/javascripts/Core/PolylinePipeline.js +90 -0
- data/app/assets/javascripts/Core/PrimitiveType.js +80 -0
- data/app/assets/javascripts/Core/QuadraticRealPolynomial.js +146 -0
- data/app/assets/javascripts/Core/QuarticRealPolynomial.js +339 -0
- data/app/assets/javascripts/Core/Quaternion.js +947 -0
- data/app/assets/javascripts/Core/Queue.js +95 -0
- data/app/assets/javascripts/Core/Ray.js +64 -0
- data/app/assets/javascripts/Core/ReferenceFrame.js +25 -0
- data/app/assets/javascripts/Core/RequestErrorEvent.js +35 -0
- data/app/assets/javascripts/Core/RuntimeError.js +59 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventHandler.js +658 -0
- data/app/assets/javascripts/Core/ScreenSpaceEventType.js +149 -0
- data/app/assets/javascripts/Core/Shapes.js +230 -0
- data/app/assets/javascripts/Core/Spherical.js +192 -0
- data/app/assets/javascripts/Core/TaskProcessor.js +131 -0
- data/app/assets/javascripts/Core/TimeConstants.js +85 -0
- data/app/assets/javascripts/Core/TimeInterval.js +305 -0
- data/app/assets/javascripts/Core/TimeIntervalCollection.js +543 -0
- data/app/assets/javascripts/Core/TimeStandard.js +31 -0
- data/app/assets/javascripts/Core/Tipsify.js +285 -0
- data/app/assets/javascripts/Core/Transforms.js +614 -0
- data/app/assets/javascripts/Core/TridiagonalSystemSolver.js +102 -0
- data/app/assets/javascripts/Core/Visibility.js +38 -0
- data/app/assets/javascripts/Core/WebMercatorProjection.js +154 -0
- data/app/assets/javascripts/Core/WindingOrder.js +40 -0
- data/app/assets/javascripts/Core/binarySearch.js +69 -0
- data/app/assets/javascripts/Core/buildModuleUrl.js +77 -0
- data/app/assets/javascripts/Core/clone.js +21 -0
- data/app/assets/javascripts/Core/combine.js +81 -0
- data/app/assets/javascripts/Core/computeSunPosition.js +116 -0
- data/app/assets/javascripts/Core/createGuid.js +25 -0
- data/app/assets/javascripts/Core/defaultValue.js +22 -0
- data/app/assets/javascripts/Core/destroyObject.js +61 -0
- data/app/assets/javascripts/Core/freezeObject.js +20 -0
- data/app/assets/javascripts/Core/getImagePixels.js +46 -0
- data/app/assets/javascripts/Core/isLeapYear.js +30 -0
- data/app/assets/javascripts/Core/jsonp.js +116 -0
- data/app/assets/javascripts/Core/loadArrayBuffer.js +76 -0
- data/app/assets/javascripts/Core/loadImage.js +85 -0
- data/app/assets/javascripts/Core/loadJson.js +54 -0
- data/app/assets/javascripts/Core/loadText.js +78 -0
- data/app/assets/javascripts/Core/loadXML.js +76 -0
- data/app/assets/javascripts/Core/package.json +6 -0
- data/app/assets/javascripts/Core/pointInsideTriangle2D.js +41 -0
- data/app/assets/javascripts/Core/requestAnimationFrame.js +61 -0
- data/app/assets/javascripts/Core/throttleRequestByServer.js +74 -0
- data/app/assets/javascripts/Core/writeTextToCanvas.js +92 -0
- data/app/assets/javascripts/DynamicScene/CompositeDynamicObjectCollection.js +254 -0
- data/app/assets/javascripts/DynamicScene/CzmlBoolean.js +57 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian2.js +96 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlCartographic.js +125 -0
- data/app/assets/javascripts/DynamicScene/CzmlColor.js +127 -0
- data/app/assets/javascripts/DynamicScene/CzmlDefaults.js +135 -0
- data/app/assets/javascripts/DynamicScene/CzmlHorizontalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlImage.js +61 -0
- data/app/assets/javascripts/DynamicScene/CzmlLabelStyle.js +59 -0
- data/app/assets/javascripts/DynamicScene/CzmlNumber.js +82 -0
- data/app/assets/javascripts/DynamicScene/CzmlString.js +56 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitCartesian3.js +99 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitQuaternion.js +172 -0
- data/app/assets/javascripts/DynamicScene/CzmlUnitSpherical.js +98 -0
- data/app/assets/javascripts/DynamicScene/CzmlVerticalOrigin.js +59 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboard.js +245 -0
- data/app/assets/javascripts/DynamicScene/DynamicBillboardVisualizer.js +347 -0
- data/app/assets/javascripts/DynamicScene/DynamicColorMaterial.js +78 -0
- data/app/assets/javascripts/DynamicScene/DynamicCone.js +291 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizer.js +350 -0
- data/app/assets/javascripts/DynamicScene/DynamicConeVisualizerUsingCustomSensor.js +389 -0
- data/app/assets/javascripts/DynamicScene/DynamicDirectionsProperty.js +163 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoid.js +158 -0
- data/app/assets/javascripts/DynamicScene/DynamicEllipsoidVisualizer.js +277 -0
- data/app/assets/javascripts/DynamicScene/DynamicImageMaterial.js +136 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabel.js +286 -0
- data/app/assets/javascripts/DynamicScene/DynamicLabelVisualizer.js +341 -0
- data/app/assets/javascripts/DynamicScene/DynamicMaterialProperty.js +125 -0
- data/app/assets/javascripts/DynamicScene/DynamicObject.js +364 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectCollection.js +137 -0
- data/app/assets/javascripts/DynamicScene/DynamicObjectView.js +299 -0
- data/app/assets/javascripts/DynamicScene/DynamicPath.js +214 -0
- data/app/assets/javascripts/DynamicScene/DynamicPathVisualizer.js +402 -0
- data/app/assets/javascripts/DynamicScene/DynamicPoint.js +184 -0
- data/app/assets/javascripts/DynamicScene/DynamicPointVisualizer.js +323 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygon.js +138 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolygonVisualizer.js +251 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolyline.js +183 -0
- data/app/assets/javascripts/DynamicScene/DynamicPolylineVisualizer.js +268 -0
- data/app/assets/javascripts/DynamicScene/DynamicPositionProperty.js +525 -0
- data/app/assets/javascripts/DynamicScene/DynamicProperty.js +352 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramid.js +204 -0
- data/app/assets/javascripts/DynamicScene/DynamicPyramidVisualizer.js +302 -0
- data/app/assets/javascripts/DynamicScene/DynamicScene.profile.js +8 -0
- data/app/assets/javascripts/DynamicScene/DynamicVertexPositionsProperty.js +199 -0
- data/app/assets/javascripts/DynamicScene/ReferenceProperty.js +155 -0
- data/app/assets/javascripts/DynamicScene/VisualizerCollection.js +181 -0
- data/app/assets/javascripts/DynamicScene/package.json +6 -0
- data/app/assets/javascripts/DynamicScene/processCzml.js +77 -0
- data/app/assets/javascripts/Renderer/BlendEquation.js +52 -0
- data/app/assets/javascripts/Renderer/BlendFunction.js +158 -0
- data/app/assets/javascripts/Renderer/BlendingState.js +64 -0
- data/app/assets/javascripts/Renderer/Buffer.js +141 -0
- data/app/assets/javascripts/Renderer/BufferUsage.js +48 -0
- data/app/assets/javascripts/Renderer/ClearCommand.js +40 -0
- data/app/assets/javascripts/Renderer/CommandLists.js +42 -0
- data/app/assets/javascripts/Renderer/Context.js +2805 -0
- data/app/assets/javascripts/Renderer/CubeMap.js +358 -0
- data/app/assets/javascripts/Renderer/CubeMapFace.js +202 -0
- data/app/assets/javascripts/Renderer/CullFace.js +50 -0
- data/app/assets/javascripts/Renderer/DepthFunction.js +95 -0
- data/app/assets/javascripts/Renderer/DrawCommand.js +96 -0
- data/app/assets/javascripts/Renderer/Framebuffer.js +435 -0
- data/app/assets/javascripts/Renderer/MipmapHint.js +50 -0
- data/app/assets/javascripts/Renderer/PickFramebuffer.js +178 -0
- data/app/assets/javascripts/Renderer/PixelDatatype.js +86 -0
- data/app/assets/javascripts/Renderer/PixelFormat.js +113 -0
- data/app/assets/javascripts/Renderer/Renderbuffer.js +102 -0
- data/app/assets/javascripts/Renderer/RenderbufferFormat.js +77 -0
- data/app/assets/javascripts/Renderer/Renderer.profile.js +8 -0
- data/app/assets/javascripts/Renderer/ShaderCache.js +121 -0
- data/app/assets/javascripts/Renderer/ShaderProgram.js +2402 -0
- data/app/assets/javascripts/Renderer/StencilFunction.js +95 -0
- data/app/assets/javascripts/Renderer/StencilOperation.js +95 -0
- data/app/assets/javascripts/Renderer/Texture.js +395 -0
- data/app/assets/javascripts/Renderer/TextureAtlas.js +472 -0
- data/app/assets/javascripts/Renderer/TextureAtlasBuilder.js +133 -0
- data/app/assets/javascripts/Renderer/TextureMagnificationFilter.js +41 -0
- data/app/assets/javascripts/Renderer/TextureMinificationFilter.js +77 -0
- data/app/assets/javascripts/Renderer/TextureWrap.js +50 -0
- data/app/assets/javascripts/Renderer/UniformDatatype.js +218 -0
- data/app/assets/javascripts/Renderer/UniformState.js +799 -0
- data/app/assets/javascripts/Renderer/VertexArray.js +365 -0
- data/app/assets/javascripts/Renderer/VertexArrayFacade.js +574 -0
- data/app/assets/javascripts/Renderer/VertexLayout.js +49 -0
- data/app/assets/javascripts/Renderer/loadCubeMap.js +92 -0
- data/app/assets/javascripts/Renderer/package.json +6 -0
- data/app/assets/javascripts/Scene/AnimationCollection.js +249 -0
- data/app/assets/javascripts/Scene/ArcGisMapServerImageryProvider.js +384 -0
- data/app/assets/javascripts/Scene/Billboard.js +680 -0
- data/app/assets/javascripts/Scene/BillboardCollection.js +1209 -0
- data/app/assets/javascripts/Scene/BingMapsImageryProvider.js +460 -0
- data/app/assets/javascripts/Scene/BingMapsStyle.js +55 -0
- data/app/assets/javascripts/Scene/Camera.js +358 -0
- data/app/assets/javascripts/Scene/CameraColumbusViewMode.js +30 -0
- data/app/assets/javascripts/Scene/CameraController.js +1258 -0
- data/app/assets/javascripts/Scene/CameraEventAggregator.js +270 -0
- data/app/assets/javascripts/Scene/CameraEventType.js +53 -0
- data/app/assets/javascripts/Scene/CameraFlightPath.js +495 -0
- data/app/assets/javascripts/Scene/CentralBody.js +817 -0
- data/app/assets/javascripts/Scene/CentralBodySurface.js +1120 -0
- data/app/assets/javascripts/Scene/CentralBodySurfaceShaderSet.js +107 -0
- data/app/assets/javascripts/Scene/ComplexConicSensorVolume.js +511 -0
- data/app/assets/javascripts/Scene/CompositePrimitive.js +454 -0
- data/app/assets/javascripts/Scene/CullingVolume.js +59 -0
- data/app/assets/javascripts/Scene/CustomSensorVolume.js +440 -0
- data/app/assets/javascripts/Scene/DiscardMissingTileImagePolicy.js +134 -0
- data/app/assets/javascripts/Scene/EllipsoidPrimitive.js +412 -0
- data/app/assets/javascripts/Scene/EllipsoidTerrainProvider.js +182 -0
- data/app/assets/javascripts/Scene/FrameState.js +86 -0
- data/app/assets/javascripts/Scene/FrustumCommands.js +32 -0
- data/app/assets/javascripts/Scene/GeographicTilingScheme.js +265 -0
- data/app/assets/javascripts/Scene/HorizontalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/Imagery.js +85 -0
- data/app/assets/javascripts/Scene/ImageryLayer.js +876 -0
- data/app/assets/javascripts/Scene/ImageryLayerCollection.js +403 -0
- data/app/assets/javascripts/Scene/ImageryProvider.js +185 -0
- data/app/assets/javascripts/Scene/ImageryProviderError.js +149 -0
- data/app/assets/javascripts/Scene/ImageryState.js +20 -0
- data/app/assets/javascripts/Scene/Label.js +706 -0
- data/app/assets/javascripts/Scene/LabelCollection.js +697 -0
- data/app/assets/javascripts/Scene/LabelStyle.js +39 -0
- data/app/assets/javascripts/Scene/Material.js +1177 -0
- data/app/assets/javascripts/Scene/NeverTileDiscardPolicy.js +38 -0
- data/app/assets/javascripts/Scene/OpenStreetMapImageryProvider.js +282 -0
- data/app/assets/javascripts/Scene/OrthographicFrustum.js +345 -0
- data/app/assets/javascripts/Scene/PerformanceDisplay.js +183 -0
- data/app/assets/javascripts/Scene/PerspectiveFrustum.js +239 -0
- data/app/assets/javascripts/Scene/PerspectiveOffCenterFrustum.js +394 -0
- data/app/assets/javascripts/Scene/Polygon.js +886 -0
- data/app/assets/javascripts/Scene/Polyline.js +441 -0
- data/app/assets/javascripts/Scene/PolylineCollection.js +1532 -0
- data/app/assets/javascripts/Scene/Projections.js +93 -0
- data/app/assets/javascripts/Scene/RectangularPyramidSensorVolume.js +224 -0
- data/app/assets/javascripts/Scene/Scene.js +632 -0
- data/app/assets/javascripts/Scene/Scene.profile.js +8 -0
- data/app/assets/javascripts/Scene/SceneMode.js +51 -0
- data/app/assets/javascripts/Scene/SceneTransitioner.js +776 -0
- data/app/assets/javascripts/Scene/ScreenSpaceCameraController.js +1063 -0
- data/app/assets/javascripts/Scene/SensorVolumeCollection.js +192 -0
- data/app/assets/javascripts/Scene/SingleTileImageryProvider.js +295 -0
- data/app/assets/javascripts/Scene/SkyAtmosphere.js +239 -0
- data/app/assets/javascripts/Scene/SkyBox.js +231 -0
- data/app/assets/javascripts/Scene/TerrainProvider.js +229 -0
- data/app/assets/javascripts/Scene/TexturePool.js +154 -0
- data/app/assets/javascripts/Scene/Tile.js +322 -0
- data/app/assets/javascripts/Scene/TileDiscardPolicy.js +42 -0
- data/app/assets/javascripts/Scene/TileImagery.js +36 -0
- data/app/assets/javascripts/Scene/TileLoadQueue.js +123 -0
- data/app/assets/javascripts/Scene/TileMapServiceImageryProvider.js +337 -0
- data/app/assets/javascripts/Scene/TileReplacementQueue.js +139 -0
- data/app/assets/javascripts/Scene/TileState.js +19 -0
- data/app/assets/javascripts/Scene/TilingScheme.js +213 -0
- data/app/assets/javascripts/Scene/VerticalOrigin.js +39 -0
- data/app/assets/javascripts/Scene/ViewportQuad.js +256 -0
- data/app/assets/javascripts/Scene/WebMapServiceImageryProvider.js +374 -0
- data/app/assets/javascripts/Scene/WebMercatorTilingScheme.js +291 -0
- data/app/assets/javascripts/Scene/package.json +6 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.glsl +30 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionFS.js +31 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.glsl +68 -0
- data/app/assets/javascripts/Shaders/BillboardCollectionVS.js +54 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.glsl +927 -0
- data/app/assets/javascripts/Shaders/BuiltinFunctions.js +322 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.glsl +106 -0
- data/app/assets/javascripts/Shaders/CentralBodyFS.js +82 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.glsl +20 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSDepth.js +22 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.glsl +29 -0
- data/app/assets/javascripts/Shaders/CentralBodyFSPole.js +28 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.glsl +88 -0
- data/app/assets/javascripts/Shaders/CentralBodyVS.js +69 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.glsl +9 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSDepth.js +13 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.glsl +12 -0
- data/app/assets/javascripts/Shaders/CentralBodyVSPole.js +15 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.glsl +448 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeFS.js +361 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.glsl +19 -0
- data/app/assets/javascripts/Shaders/ComplexConicSensorVolumeVS.js +20 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.glsl +886 -0
- data/app/assets/javascripts/Shaders/ConstructiveSolidGeometry.js +586 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.glsl +126 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeFS.js +95 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.glsl +14 -0
- data/app/assets/javascripts/Shaders/CustomSensorVolumeVS.js +18 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.glsl +40 -0
- data/app/assets/javascripts/Shaders/EllipsoidFS.js +38 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.glsl +26 -0
- data/app/assets/javascripts/Shaders/EllipsoidVS.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.glsl +25 -0
- data/app/assets/javascripts/Shaders/Materials/AsphaltMaterial.js +23 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/BlobMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.glsl +42 -0
- data/app/assets/javascripts/Shaders/Materials/BrickMaterial.js +36 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/BumpMapMaterial.js +27 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/CementMaterial.js +20 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.glsl +38 -0
- data/app/assets/javascripts/Shaders/Materials/CheckerboardMaterial.js +32 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/DotMaterial.js +18 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.glsl +23 -0
- data/app/assets/javascripts/Shaders/Materials/ErosionMaterial.js +24 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/FacetMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.glsl +12 -0
- data/app/assets/javascripts/Shaders/Materials/FresnelMaterial.js +15 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.glsl +28 -0
- data/app/assets/javascripts/Shaders/Materials/GrassMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.glsl +19 -0
- data/app/assets/javascripts/Shaders/Materials/NormalMapMaterial.js +21 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.glsl +13 -0
- data/app/assets/javascripts/Shaders/Materials/ReflectionMaterial.js +16 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.glsl +14 -0
- data/app/assets/javascripts/Shaders/Materials/RefractionMaterial.js +17 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.glsl +18 -0
- data/app/assets/javascripts/Shaders/Materials/RimLightingMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.glsl +29 -0
- data/app/assets/javascripts/Shaders/Materials/StripeMaterial.js +26 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.glsl +17 -0
- data/app/assets/javascripts/Shaders/Materials/TieDyeMaterial.js +19 -0
- data/app/assets/javascripts/Shaders/Materials/Water.glsl +91 -0
- data/app/assets/javascripts/Shaders/Materials/Water.js +60 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.glsl +36 -0
- data/app/assets/javascripts/Shaders/Materials/WoodMaterial.js +31 -0
- data/app/assets/javascripts/Shaders/Noise.glsl +453 -0
- data/app/assets/javascripts/Shaders/Noise.js +242 -0
- data/app/assets/javascripts/Shaders/PolygonFS.glsl +27 -0
- data/app/assets/javascripts/Shaders/PolygonFS.js +23 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolygonFSPick.js +11 -0
- data/app/assets/javascripts/Shaders/PolygonVS.glsl +38 -0
- data/app/assets/javascripts/Shaders/PolygonVS.js +39 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.glsl +30 -0
- data/app/assets/javascripts/Shaders/PolygonVSPick.js +32 -0
- data/app/assets/javascripts/Shaders/PolylineFS.glsl +6 -0
- data/app/assets/javascripts/Shaders/PolylineFS.js +11 -0
- data/app/assets/javascripts/Shaders/PolylineVS.glsl +34 -0
- data/app/assets/javascripts/Shaders/PolylineVS.js +35 -0
- data/app/assets/javascripts/Shaders/Ray.glsl +532 -0
- data/app/assets/javascripts/Shaders/Ray.js +357 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.glsl +26 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorFS.js +22 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.glsl +11 -0
- data/app/assets/javascripts/Shaders/ReprojectWebMercatorVS.js +14 -0
- data/app/assets/javascripts/Shaders/SensorVolume.glsl +43 -0
- data/app/assets/javascripts/Shaders/SensorVolume.js +31 -0
- data/app/assets/javascripts/Shaders/Shaders.profile.js +8 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.glsl +70 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereFS.js +62 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.glsl +131 -0
- data/app/assets/javascripts/Shaders/SkyAtmosphereVS.js +115 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxFS.js +14 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/SkyBoxVS.js +14 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.glsl +16 -0
- data/app/assets/javascripts/Shaders/ViewportQuadFS.js +17 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.glsl +10 -0
- data/app/assets/javascripts/Shaders/ViewportQuadVS.js +14 -0
- data/app/assets/javascripts/Shaders/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/ThirdParty.profile.js +8 -0
- data/app/assets/javascripts/ThirdParty/Tween.js +678 -0
- data/app/assets/javascripts/ThirdParty/Uri.js +277 -0
- data/app/assets/javascripts/ThirdParty/measureText.js +197 -0
- data/app/assets/javascripts/ThirdParty/package.json +6 -0
- data/app/assets/javascripts/ThirdParty/sprintf.js +319 -0
- data/app/assets/javascripts/ThirdParty/when.js +748 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.css +175 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.html +52 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumViewerWidget.js +1237 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.html +4 -0
- data/app/assets/javascripts/Widgets/Dojo/CesiumWidget.js +349 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.css +1 -0
- data/app/assets/javascripts/Widgets/Dojo/TimelineWidget.js +47 -0
- data/app/assets/javascripts/Widgets/Dojo/checkForChromeFrame.js +71 -0
- data/app/assets/javascripts/Widgets/Images/Bing_Logo_51x19_White.png +0 -0
- data/app/assets/javascripts/Widgets/Images/Cesium_Logo_overlay.png +0 -0
- data/app/assets/javascripts/Widgets/Images/TimelineIcons.png +0 -0
- data/app/assets/javascripts/Widgets/Images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/Widgets/Images/animationBar.png +0 -0
- data/app/assets/javascripts/Widgets/Images/viewControlBar.png +0 -0
- data/app/assets/javascripts/Widgets/Timeline.css +113 -0
- data/app/assets/javascripts/Widgets/Timeline.js +629 -0
- data/app/assets/javascripts/Widgets/TimelineHighlightRange.js +51 -0
- data/app/assets/javascripts/Widgets/TimelineTrack.js +54 -0
- data/app/assets/javascripts/Widgets/Widgets.profile.js +8 -0
- data/app/assets/javascripts/Widgets/package.json +6 -0
- data/app/assets/javascripts/Workers/Workers.profile.js +8 -0
- data/app/assets/javascripts/Workers/cesiumWorkerBootstrapper.js +2015 -0
- data/app/assets/javascripts/Workers/createTaskProcessorWorker.js +55 -0
- data/app/assets/javascripts/Workers/createVerticesFromExtent.js +24 -0
- data/app/assets/javascripts/Workers/package.json +6 -0
- data/app/assets/javascripts/copyrightHeader.js +22 -0
- data/app/assets/javascripts/main.js +10 -0
- data/app/assets/stylesheets/cesium.css +4 -0
- data/app/controllers/cesium_controller.rb +4 -0
- data/app/helpers/cesium_helper.rb +2 -0
- data/app/views/cesium/index.html.erb +3 -0
- data/config/routes.rb +3 -0
- data/lib/cesium.rb +4 -0
- data/lib/cesium/engine.rb +4 -0
- data/lib/cesium/version.rb +3 -0
- data/lib/tasks/cesium_tasks.rake +4 -0
- data/test/cesium_test.rb +7 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/adapters/jquery-adapter.js.coffee +4 -0
- data/test/dummy/app/assets/javascripts/app.js.coffee +11 -0
- data/test/dummy/app/assets/javascripts/application.js.coffee +73 -0
- data/test/dummy/app/assets/stylesheets/application.css +12 -0
- data/test/dummy/app/controllers/application_controller.rb +4 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +21 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/requirejs.yml +10 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/cesium_controller_test.rb +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/helpers/cesium_helper_test.rb +4 -0
- metadata +641 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/*global define*/
|
|
2
|
+
define(['./defaultValue'], function(defaultValue) {
|
|
3
|
+
"use strict";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Represents the closed interval [start, stop].
|
|
7
|
+
* @alias Interval
|
|
8
|
+
* @constructor
|
|
9
|
+
*
|
|
10
|
+
* @param {Number} [start=0.0] The beginning of the interval.
|
|
11
|
+
* @param {Number} [stop=0.0] The end of the interval.
|
|
12
|
+
*/
|
|
13
|
+
var Interval = function(start, stop) {
|
|
14
|
+
/**
|
|
15
|
+
* The beginning of the interval.
|
|
16
|
+
* @type {Number}
|
|
17
|
+
*/
|
|
18
|
+
this.start = defaultValue(start, 0.0);
|
|
19
|
+
/**
|
|
20
|
+
* The end of the interval.
|
|
21
|
+
* @type {Number}
|
|
22
|
+
*/
|
|
23
|
+
this.stop = defaultValue(stop, 0.0);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return Interval;
|
|
27
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*global define*/
|
|
2
|
+
define([
|
|
3
|
+
'./freezeObject',
|
|
4
|
+
'./JulianDate',
|
|
5
|
+
'./TimeInterval'
|
|
6
|
+
], function(
|
|
7
|
+
freezeObject,
|
|
8
|
+
JulianDate,
|
|
9
|
+
TimeInterval) {
|
|
10
|
+
"use strict";
|
|
11
|
+
|
|
12
|
+
var MINIMUM_VALUE = freezeObject(JulianDate.fromIso8601('0000-01-01T00:00:00Z'));
|
|
13
|
+
var MAXIMUM_VALUE = freezeObject(JulianDate.fromIso8601('9999-12-31T24:00:00Z'));
|
|
14
|
+
var MAXIMUM_INTERVAL = freezeObject(new TimeInterval(MINIMUM_VALUE, MAXIMUM_VALUE, true, true));
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Constants related to ISO8601 support.
|
|
18
|
+
*
|
|
19
|
+
* @exports Iso8601
|
|
20
|
+
*
|
|
21
|
+
* @see <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 on Wikipedia</a>.
|
|
22
|
+
* @see JulianDate
|
|
23
|
+
* @see TimeInterval
|
|
24
|
+
*/
|
|
25
|
+
var Iso8601 = {
|
|
26
|
+
/**
|
|
27
|
+
* A {@link JulianDate} representing the earliest time representable by an ISO8601 date.
|
|
28
|
+
* This is equivalent to the date string '0000-01-01T00:00:00Z'
|
|
29
|
+
*/
|
|
30
|
+
MINIMUM_VALUE : MINIMUM_VALUE,
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A {@link JulianDate} representing the latest time representable by an ISO8601 date.
|
|
34
|
+
* This is equivalent to the date string '9999-12-31T24:00:00Z'
|
|
35
|
+
*/
|
|
36
|
+
MAXIMUM_VALUE : MAXIMUM_VALUE,
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A {@link TimeInterval} representing the largest interval representable by an ISO8601 interval.
|
|
40
|
+
* This is equivalent to the interval string '0000-01-01T00:00:00Z/9999-12-31T24:00:00Z'
|
|
41
|
+
*/
|
|
42
|
+
MAXIMUM_INTERVAL : MAXIMUM_INTERVAL
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return Iso8601;
|
|
46
|
+
});
|
|
@@ -0,0 +1,1228 @@
|
|
|
1
|
+
/*global define*/
|
|
2
|
+
define([
|
|
3
|
+
'./DeveloperError',
|
|
4
|
+
'./binarySearch',
|
|
5
|
+
'./TimeConstants',
|
|
6
|
+
'./LeapSecond',
|
|
7
|
+
'./TimeStandard',
|
|
8
|
+
'./isLeapYear',
|
|
9
|
+
'../ThirdParty/sprintf'
|
|
10
|
+
], function(
|
|
11
|
+
DeveloperError,
|
|
12
|
+
binarySearch,
|
|
13
|
+
TimeConstants,
|
|
14
|
+
LeapSecond,
|
|
15
|
+
TimeStandard,
|
|
16
|
+
isLeapYear,
|
|
17
|
+
sprintf) {
|
|
18
|
+
"use strict";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The object returned by {@link JulianDate#toGregorianDate}.
|
|
22
|
+
*
|
|
23
|
+
* @alias GregorianDate
|
|
24
|
+
* @see JulianDate#toGregorianDate
|
|
25
|
+
* @constructor
|
|
26
|
+
*/
|
|
27
|
+
var GregorianDate = function(year, month, day, hour, minute, second, millisecond, isLeapSecond) {
|
|
28
|
+
/**
|
|
29
|
+
* The year, a whole number.
|
|
30
|
+
* @type Number
|
|
31
|
+
*/
|
|
32
|
+
this.year = year;
|
|
33
|
+
/**
|
|
34
|
+
* The month, a whole number with range [1, 12].
|
|
35
|
+
* @type Number
|
|
36
|
+
*/
|
|
37
|
+
this.month = month;
|
|
38
|
+
/**
|
|
39
|
+
* The day, a whole number with range 1.
|
|
40
|
+
* @type Number
|
|
41
|
+
*/
|
|
42
|
+
this.day = day;
|
|
43
|
+
/**
|
|
44
|
+
* The hour, a whole number with range [0, 23].
|
|
45
|
+
* @type Number
|
|
46
|
+
*/
|
|
47
|
+
this.hour = hour;
|
|
48
|
+
/**
|
|
49
|
+
* The minute, a whole number with range [0, 59].
|
|
50
|
+
* @type Number
|
|
51
|
+
*/
|
|
52
|
+
this.minute = minute;
|
|
53
|
+
/**
|
|
54
|
+
* The second, a whole number with range [0, 60], with 60 representing a leap second.
|
|
55
|
+
* @type Number
|
|
56
|
+
*/
|
|
57
|
+
this.second = second;
|
|
58
|
+
/**
|
|
59
|
+
* The millisecond, a floating point number with range [0.0, 1000.0).
|
|
60
|
+
* @type Number
|
|
61
|
+
*/
|
|
62
|
+
this.millisecond = millisecond;
|
|
63
|
+
/**
|
|
64
|
+
* True if this date is during a leap second.
|
|
65
|
+
* @type Boolean
|
|
66
|
+
*/
|
|
67
|
+
this.isLeapSecond = isLeapSecond;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
71
|
+
var daysInLeapFeburary = 29;
|
|
72
|
+
|
|
73
|
+
function convertUtcToTai(julianDate) {
|
|
74
|
+
//Even though julianDate is in UTC, we'll treat it as TAI and
|
|
75
|
+
//search the leap second table for it.
|
|
76
|
+
var toFind = new LeapSecond(julianDate, 0.0);
|
|
77
|
+
var leapSeconds = LeapSecond.getLeapSeconds();
|
|
78
|
+
var index = binarySearch(leapSeconds, toFind, LeapSecond.compareLeapSecondDate);
|
|
79
|
+
|
|
80
|
+
if (index < 0) {
|
|
81
|
+
index = ~index;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (index >= leapSeconds.length) {
|
|
85
|
+
index = leapSeconds.length - 1;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
var offset = leapSeconds[index].offset;
|
|
89
|
+
if (index > 0) {
|
|
90
|
+
//Now we have the index of the closest leap second that comes on or after our UTC time.
|
|
91
|
+
//However, if the difference between the UTC date being converted and the TAI
|
|
92
|
+
//defined leap second is greater than the offset, we are off by one and need to use
|
|
93
|
+
//the previous leap second.
|
|
94
|
+
var difference = julianDate.getSecondsDifference(leapSeconds[index].julianDate);
|
|
95
|
+
if (difference > offset) {
|
|
96
|
+
index--;
|
|
97
|
+
offset = leapSeconds[index].offset;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
julianDate.addSeconds(offset, julianDate);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function convertTaiToUtc(julianDate, result) {
|
|
105
|
+
var toFind = new LeapSecond(julianDate, 0.0);
|
|
106
|
+
var leapSeconds = LeapSecond.getLeapSeconds();
|
|
107
|
+
var index = binarySearch(leapSeconds, toFind, LeapSecond.compareLeapSecondDate);
|
|
108
|
+
if (index < 0) {
|
|
109
|
+
index = ~index;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
//All times before our first leap second get the first offset.
|
|
113
|
+
if (index === 0) {
|
|
114
|
+
return julianDate.addSeconds(-leapSeconds[0].offset, result);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
//All times after our leap second get the last offset.
|
|
118
|
+
if (index >= leapSeconds.length) {
|
|
119
|
+
return julianDate.addSeconds(-leapSeconds[index - 1].offset, result);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//Compute the difference between the found leap second and the time we are converting.
|
|
123
|
+
var difference = julianDate.getSecondsDifference(leapSeconds[index].julianDate);
|
|
124
|
+
|
|
125
|
+
if (difference === 0) {
|
|
126
|
+
//The date is in our leap second table.
|
|
127
|
+
return julianDate.addSeconds(-leapSeconds[index].offset, result);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (difference <= 1.0) {
|
|
131
|
+
//The requested date is during the moment of a leap second, then we cannot convert to UTC
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//The time is in between two leap seconds, index is the leap second after the date
|
|
136
|
+
//we're converting, so we subtract one to get the correct LeapSecond instance.
|
|
137
|
+
return julianDate.addSeconds(-leapSeconds[--index].offset, result);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function setComponents(wholeDays, secondsOfDay, julianDate) {
|
|
141
|
+
var extraDays = (secondsOfDay / TimeConstants.SECONDS_PER_DAY) | 0;
|
|
142
|
+
wholeDays += extraDays;
|
|
143
|
+
secondsOfDay -= TimeConstants.SECONDS_PER_DAY * extraDays;
|
|
144
|
+
|
|
145
|
+
if (secondsOfDay < 0) {
|
|
146
|
+
wholeDays--;
|
|
147
|
+
secondsOfDay += TimeConstants.SECONDS_PER_DAY;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (typeof julianDate === 'undefined') {
|
|
151
|
+
return new JulianDate(wholeDays, secondsOfDay, TimeStandard.TAI);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
julianDate._julianDayNumber = wholeDays;
|
|
155
|
+
julianDate._secondsOfDay = secondsOfDay;
|
|
156
|
+
return julianDate;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function computeJulianDateComponents(year, month, day, hour, minute, second, millisecond) {
|
|
160
|
+
// Algorithm from page 604 of the Explanatory Supplement to the
|
|
161
|
+
// Astronomical Almanac (Seidelmann 1992).
|
|
162
|
+
|
|
163
|
+
var a = ((month - 14) / 12) | 0;
|
|
164
|
+
var b = year + 4800 + a;
|
|
165
|
+
var dayNumber = (((1461 * b) / 4) | 0) + (((367 * (month - 2 - 12 * a)) / 12) | 0) - (((3 * ((b + 100) / 100)) / 4) | 0) + day - 32075;
|
|
166
|
+
|
|
167
|
+
// JulianDates are noon-based
|
|
168
|
+
hour = hour - 12;
|
|
169
|
+
if (hour < 0) {
|
|
170
|
+
hour += 24;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
var secondsOfDay = second + ((hour * TimeConstants.SECONDS_PER_HOUR) + (minute * TimeConstants.SECONDS_PER_MINUTE) + (millisecond * TimeConstants.SECONDS_PER_MILLISECOND));
|
|
174
|
+
|
|
175
|
+
if (secondsOfDay >= 43200.0) {
|
|
176
|
+
dayNumber -= 1;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return [dayNumber, secondsOfDay];
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function computeJulianDateComponentsFromDate(date) {
|
|
183
|
+
return computeJulianDateComponents(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date
|
|
184
|
+
.getUTCMilliseconds());
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
//Regular expressions used for ISO8601 date parsing.
|
|
188
|
+
//YYYY
|
|
189
|
+
var matchCalendarYear = /^(\d{4})$/;
|
|
190
|
+
//YYYY-MM (YYYYMM is invalid)
|
|
191
|
+
var matchCalendarMonth = /^(\d{4})-(\d{2})$/;
|
|
192
|
+
//YYYY-DDD or YYYYDDD
|
|
193
|
+
var matchOrdinalDate = /^(\d{4})-?(\d{3})$/;
|
|
194
|
+
//YYYY-Www or YYYYWww or YYYY-Www-D or YYYYWwwD
|
|
195
|
+
var matchWeekDate = /^(\d{4})-?W(\d{2})-?(\d{1})?$/;
|
|
196
|
+
//YYYY-MM-DD or YYYYMMDD
|
|
197
|
+
var matchCalendarDate = /^(\d{4})-?(\d{2})-?(\d{2})$/;
|
|
198
|
+
// Match utc offset
|
|
199
|
+
var utcOffset = /([Z+\-])?(\d{2})?:?(\d{2})?$/;
|
|
200
|
+
// Match hours HH or HH.xxxxx
|
|
201
|
+
var matchHours = /^(\d{2})(\.\d+)?/.source + utcOffset.source;
|
|
202
|
+
// Match hours/minutes HH:MM HHMM.xxxxx
|
|
203
|
+
var matchHoursMinutes = /^(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source;
|
|
204
|
+
// Match hours/minutes HH:MM:SS HHMMSS.xxxxx
|
|
205
|
+
var matchHoursMinutesSeconds = /^(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?/.source + utcOffset.source;
|
|
206
|
+
|
|
207
|
+
var iso8601ErrorMessage = 'Valid ISO 8601 date string required.';
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Constructs a JulianDate instance from a Julian day number, the number of seconds elapsed
|
|
211
|
+
* into that day, and the time standard which the parameters are in. Passing no parameters will
|
|
212
|
+
* construct a JulianDate that represents the current system time.
|
|
213
|
+
*
|
|
214
|
+
* An astronomical Julian Date is the number of days since noon on January 1, -4712 (4713 BC).
|
|
215
|
+
* For increased precision, this class stores the whole number part of the date and the seconds
|
|
216
|
+
* part of the date in separate components. In order to be safe for arithmetic and represent
|
|
217
|
+
* leap seconds, the date is always stored in the International Atomic Time standard
|
|
218
|
+
* {@link TimeStandard.TAI}.
|
|
219
|
+
*
|
|
220
|
+
* @alias JulianDate
|
|
221
|
+
* @constructor
|
|
222
|
+
* @immutable
|
|
223
|
+
*
|
|
224
|
+
* @param {Number} julianDayNumber The Julian Day Number representing the number of whole days. Fractional days will also be handled correctly.
|
|
225
|
+
* @param {Number} julianSecondsOfDay The number of seconds into the current Julian Day Number. Fractional seconds, negative seconds and seconds greater than a day will be handled correctly.
|
|
226
|
+
* @param {TimeStandard} [timeStandard = TimeStandard.UTC] The time standard in which the first two parameters are defined.
|
|
227
|
+
*
|
|
228
|
+
* @exception {DeveloperError} timeStandard is not a known TimeStandard.
|
|
229
|
+
* @exception {DeveloperError} julianDayNumber is required.
|
|
230
|
+
* @exception {DeveloperError} julianSecondsOfDay is required.
|
|
231
|
+
*
|
|
232
|
+
* @see JulianDate.fromDate
|
|
233
|
+
* @see JulianDate.fromTotalDays
|
|
234
|
+
* @see JulianDate.fromIso8601
|
|
235
|
+
* @see TimeStandard
|
|
236
|
+
* @see LeapSecond
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* // Example 1. Construct a Julian date representing the current system time.
|
|
240
|
+
* var julianDate = new JulianDate();
|
|
241
|
+
*
|
|
242
|
+
* // Example 2. Construct a Julian date from a Julian day number and seconds of the day.
|
|
243
|
+
* var julianDayNumber = 2448257; // January 1, 1991
|
|
244
|
+
* var secondsOfDay = 21600; // 06:00:00
|
|
245
|
+
* var julianDate = new JulianDate(julianDayNumber, secondsOfDay, TimeStandard.UTC);
|
|
246
|
+
*/
|
|
247
|
+
var JulianDate = function(julianDayNumber, julianSecondsOfDay, timeStandard) {
|
|
248
|
+
this._julianDayNumber = undefined;
|
|
249
|
+
this._secondsOfDay = undefined;
|
|
250
|
+
|
|
251
|
+
var wholeDays;
|
|
252
|
+
var secondsOfDay;
|
|
253
|
+
//If any of the properties are defined, then we are constructing from components.
|
|
254
|
+
if (typeof julianDayNumber !== 'undefined' || typeof julianSecondsOfDay !== 'undefined' || typeof timeStandard !== 'undefined') {
|
|
255
|
+
if (typeof timeStandard === 'undefined') {
|
|
256
|
+
timeStandard = TimeStandard.UTC;
|
|
257
|
+
} else if ((timeStandard !== TimeStandard.UTC) && (timeStandard !== TimeStandard.TAI)) {
|
|
258
|
+
throw new DeveloperError('timeStandard is not a known TimeStandard.');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (julianDayNumber === null || isNaN(julianDayNumber)) {
|
|
262
|
+
throw new DeveloperError('julianDayNumber is required.');
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (julianSecondsOfDay === null || isNaN(julianSecondsOfDay)) {
|
|
266
|
+
throw new DeveloperError('julianSecondsOfDay is required.');
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
//coerce to integer
|
|
270
|
+
wholeDays = julianDayNumber | 0;
|
|
271
|
+
//If julianDayNumber was fractional, add the number of seconds the fraction represented
|
|
272
|
+
secondsOfDay = julianSecondsOfDay + (julianDayNumber - wholeDays) * TimeConstants.SECONDS_PER_DAY;
|
|
273
|
+
} else {
|
|
274
|
+
//Create a new date from the current time.
|
|
275
|
+
var date = new Date();
|
|
276
|
+
var components = computeJulianDateComponentsFromDate(date);
|
|
277
|
+
wholeDays = components[0];
|
|
278
|
+
secondsOfDay = components[1];
|
|
279
|
+
timeStandard = TimeStandard.UTC;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
setComponents(wholeDays, secondsOfDay, this);
|
|
283
|
+
|
|
284
|
+
if (timeStandard === TimeStandard.UTC) {
|
|
285
|
+
convertUtcToTai(this);
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Duplicates a JulianDate instance.
|
|
291
|
+
* @memberof JulianDate
|
|
292
|
+
*
|
|
293
|
+
* @param {Cartesian3} date The JulianDate to duplicate.
|
|
294
|
+
* @param {Cartesian3} [result] The object onto which to store the JulianDate.
|
|
295
|
+
* @return {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
|
|
296
|
+
*
|
|
297
|
+
* @exception {DeveloperError} date is required.
|
|
298
|
+
*/
|
|
299
|
+
JulianDate.clone = function(date, result) {
|
|
300
|
+
if (typeof date === 'undefined') {
|
|
301
|
+
throw new DeveloperError('date is required.');
|
|
302
|
+
}
|
|
303
|
+
if (typeof result === 'undefined') {
|
|
304
|
+
return new JulianDate(date._julianDayNumber, date._secondsOfDay, TimeStandard.TAI);
|
|
305
|
+
}
|
|
306
|
+
result._julianDayNumber = date._julianDayNumber;
|
|
307
|
+
result._secondsOfDay = date._secondsOfDay;
|
|
308
|
+
return result;
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Creates a JulianDate instance from a JavaScript Date object.
|
|
313
|
+
* While the JavaScript Date object defaults to the system's local time zone,
|
|
314
|
+
* the Julian date is computed using the UTC values.
|
|
315
|
+
*
|
|
316
|
+
* @memberof JulianDate
|
|
317
|
+
*
|
|
318
|
+
* @param {Date} date The JavaScript Date object representing the time to be converted to a Julian date.
|
|
319
|
+
* @param {TimeStandard} [timeStandard = TimeStandard.UTC] Indicates the time standard in which this Julian date is represented.
|
|
320
|
+
*
|
|
321
|
+
* @return {JulianDate} The new {@Link JulianDate} instance.
|
|
322
|
+
*
|
|
323
|
+
* @exception {DeveloperError} date must be a valid JavaScript Date.
|
|
324
|
+
*
|
|
325
|
+
* @see JulianDate
|
|
326
|
+
* @see JulianDate.fromTotalDays
|
|
327
|
+
* @see JulianDate.fromIso8601
|
|
328
|
+
* @see TimeStandard
|
|
329
|
+
* @see LeapSecond
|
|
330
|
+
* @see <a href='http://www.w3schools.com/js/js_obj_date.asp'>JavaScript Date Object on w3schools</a>.
|
|
331
|
+
* @see <a href='http://www.w3schools.com/jsref/jsref_obj_date.asp'>JavaScript Date Object Reference on w3schools</a>.
|
|
332
|
+
*
|
|
333
|
+
* @example
|
|
334
|
+
* // Construct a Julian date specifying the UTC time standard
|
|
335
|
+
* var date = new Date('January 1, 2011 12:00:00 EST');
|
|
336
|
+
* var julianDate = JulianDate.fromDate(date, TimeStandard.UTC);
|
|
337
|
+
*/
|
|
338
|
+
JulianDate.fromDate = function(date, timeStandard) {
|
|
339
|
+
if (typeof date === 'undefined' || date === null || isNaN(date.getTime())) {
|
|
340
|
+
throw new DeveloperError('date must be a valid JavaScript Date.');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
var components = computeJulianDateComponentsFromDate(date);
|
|
344
|
+
return new JulianDate(components[0], components[1], timeStandard);
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Creates a JulianDate instance from an ISO 8601 date string. Unlike Date.parse,
|
|
349
|
+
* this method properly accounts for all valid formats defined by the ISO 8601
|
|
350
|
+
* specification. It also properly handles leap seconds and sub-millisecond times.
|
|
351
|
+
*
|
|
352
|
+
* @memberof JulianDate
|
|
353
|
+
*
|
|
354
|
+
* @param {String} iso8601String The ISO 8601 date string representing the time to be converted to a Julian date.
|
|
355
|
+
*
|
|
356
|
+
* @return {JulianDate} The new {@Link JulianDate} instance.
|
|
357
|
+
*
|
|
358
|
+
* @exception {DeveloperError} Valid ISO 8601 date string required.
|
|
359
|
+
*
|
|
360
|
+
* @see JulianDate
|
|
361
|
+
* @see JulianDate.fromTotalDays
|
|
362
|
+
* @see JulianDate.fromDate
|
|
363
|
+
* @see LeapSecond
|
|
364
|
+
* @see <a href='http://en.wikipedia.org/wiki/ISO_8601'>ISO 8601 on Wikipedia</a>.
|
|
365
|
+
*
|
|
366
|
+
* @example
|
|
367
|
+
* // Example 1. Construct a Julian date in UTC at April 24th, 2012 6:08PM UTC
|
|
368
|
+
* var julianDate = JulianDate.fromIso8601('2012-04-24T18:08Z');
|
|
369
|
+
* // Example 2. Construct a Julian date in local time April 24th, 2012 12:00 AM
|
|
370
|
+
* var localDay = JulianDate.fromIso8601('2012-04-24');
|
|
371
|
+
* // Example 3. Construct a Julian date 5 hours behind UTC April 24th, 2012 5:00 pm UTC
|
|
372
|
+
* var localDay = JulianDate.fromIso8601('2012-04-24T12:00-05:00');
|
|
373
|
+
*/
|
|
374
|
+
JulianDate.fromIso8601 = function(iso8601String) {
|
|
375
|
+
if (typeof iso8601String !== 'string') {
|
|
376
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
//Comma and decimal point both indicate a fractional number according to ISO 8601,
|
|
380
|
+
//start out by blanket replacing , with . which is the only valid such symbol in JS.
|
|
381
|
+
iso8601String = iso8601String.replace(',', '.');
|
|
382
|
+
|
|
383
|
+
//Split the string into its date and time components, denoted by a mandatory T
|
|
384
|
+
var tokens = iso8601String.split('T');
|
|
385
|
+
var year;
|
|
386
|
+
var month = 1;
|
|
387
|
+
var day = 1;
|
|
388
|
+
var hour = 0;
|
|
389
|
+
var minute = 0;
|
|
390
|
+
var second = 0;
|
|
391
|
+
var millisecond = 0;
|
|
392
|
+
|
|
393
|
+
//Lacking a time is okay, but a missing date is illegal.
|
|
394
|
+
var date = tokens[0];
|
|
395
|
+
var time = tokens[1];
|
|
396
|
+
var tmp;
|
|
397
|
+
var inLeapYear;
|
|
398
|
+
if (typeof date === 'undefined') {
|
|
399
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
var dashCount;
|
|
403
|
+
|
|
404
|
+
//First match the date against possible regular expressions.
|
|
405
|
+
tokens = date.match(matchCalendarDate);
|
|
406
|
+
if (tokens !== null) {
|
|
407
|
+
dashCount = date.split('-').length - 1;
|
|
408
|
+
if (dashCount > 0 && dashCount !== 2) {
|
|
409
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
410
|
+
}
|
|
411
|
+
year = +tokens[1];
|
|
412
|
+
month = +tokens[2];
|
|
413
|
+
day = +tokens[3];
|
|
414
|
+
} else {
|
|
415
|
+
tokens = date.match(matchCalendarMonth);
|
|
416
|
+
if (tokens !== null) {
|
|
417
|
+
year = +tokens[1];
|
|
418
|
+
month = +tokens[2];
|
|
419
|
+
} else {
|
|
420
|
+
tokens = date.match(matchCalendarYear);
|
|
421
|
+
if (tokens !== null) {
|
|
422
|
+
year = +tokens[1];
|
|
423
|
+
} else {
|
|
424
|
+
//Not a year/month/day so it must be an ordinal date.
|
|
425
|
+
var dayOfYear;
|
|
426
|
+
tokens = date.match(matchOrdinalDate);
|
|
427
|
+
if (tokens !== null) {
|
|
428
|
+
|
|
429
|
+
year = +tokens[1];
|
|
430
|
+
dayOfYear = +tokens[2];
|
|
431
|
+
inLeapYear = isLeapYear(year);
|
|
432
|
+
|
|
433
|
+
//This validation is only applicable for this format.
|
|
434
|
+
if (dayOfYear < 1 || (inLeapYear && dayOfYear > 366) || (!inLeapYear && dayOfYear > 365)) {
|
|
435
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
tokens = date.match(matchWeekDate);
|
|
439
|
+
if (tokens !== null) {
|
|
440
|
+
//ISO week date to ordinal date from
|
|
441
|
+
//http://en.wikipedia.org/w/index.php?title=ISO_week_date&oldid=474176775
|
|
442
|
+
year = +tokens[1];
|
|
443
|
+
var weekNumber = +tokens[2];
|
|
444
|
+
var dayOfWeek = +tokens[3] || 0;
|
|
445
|
+
|
|
446
|
+
dashCount = date.split('-').length - 1;
|
|
447
|
+
if (dashCount > 0 &&
|
|
448
|
+
((typeof tokens[3] === 'undefined' && dashCount !== 1) ||
|
|
449
|
+
(typeof tokens[3] !== 'undefined' && dashCount !== 2))) {
|
|
450
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
var january4 = new Date(Date.UTC(year, 0, 4));
|
|
454
|
+
dayOfYear = (weekNumber * 7) + dayOfWeek - january4.getUTCDay() - 3;
|
|
455
|
+
} else {
|
|
456
|
+
//None of our regular expressions succeeded in parsing the date properly.
|
|
457
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
//Split an ordinal date into month/day.
|
|
461
|
+
tmp = new Date(Date.UTC(year, 0, 1));
|
|
462
|
+
tmp.setUTCDate(dayOfYear);
|
|
463
|
+
month = tmp.getUTCMonth() + 1;
|
|
464
|
+
day = tmp.getUTCDate();
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
//Now that we have all of the date components, validate them to make sure nothing is out of range.
|
|
470
|
+
inLeapYear = isLeapYear(year);
|
|
471
|
+
if (month < 1 || month > 12 || day < 1 || ((month !== 2 || !inLeapYear) && day > daysInMonth[month - 1]) || (inLeapYear && month === 2 && day > daysInLeapFeburary)) {
|
|
472
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
//Not move onto the time string, which is much simpler.
|
|
476
|
+
var offsetIndex;
|
|
477
|
+
if (typeof time !== 'undefined') {
|
|
478
|
+
tokens = time.match(matchHoursMinutesSeconds);
|
|
479
|
+
if (tokens !== null) {
|
|
480
|
+
dashCount = time.split(':').length - 1;
|
|
481
|
+
if (dashCount > 0 && dashCount !== 2) {
|
|
482
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
hour = +tokens[1];
|
|
486
|
+
minute = +tokens[2];
|
|
487
|
+
second = +tokens[3];
|
|
488
|
+
millisecond = +(tokens[4] || 0) * 1000.0;
|
|
489
|
+
offsetIndex = 5;
|
|
490
|
+
} else {
|
|
491
|
+
tokens = time.match(matchHoursMinutes);
|
|
492
|
+
if (tokens !== null) {
|
|
493
|
+
dashCount = time.split(':').length - 1;
|
|
494
|
+
if (dashCount > 0 && dashCount !== 1) {
|
|
495
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
hour = +tokens[1];
|
|
499
|
+
minute = +tokens[2];
|
|
500
|
+
second = +(tokens[3] || 0) * 60.0;
|
|
501
|
+
offsetIndex = 4;
|
|
502
|
+
} else {
|
|
503
|
+
tokens = time.match(matchHours);
|
|
504
|
+
if (tokens !== null) {
|
|
505
|
+
hour = +tokens[1];
|
|
506
|
+
minute = +(tokens[2] || 0) * 60.0;
|
|
507
|
+
offsetIndex = 3;
|
|
508
|
+
} else {
|
|
509
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
//Validate that all values are in proper range. Minutes and hours have special cases at 60 and 24.
|
|
515
|
+
if (minute >= 60 || second >= 61 || hour > 24 || (hour === 24 && (minute > 0 || second > 0 || millisecond > 0))) {
|
|
516
|
+
throw new DeveloperError(iso8601ErrorMessage);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
//Check the UTC offset value, if no value exists, use local time
|
|
520
|
+
//a Z indicates UTC, + or - are offsets.
|
|
521
|
+
var offset = tokens[offsetIndex];
|
|
522
|
+
var offsetHours = +(tokens[offsetIndex + 1]);
|
|
523
|
+
var offsetMinutes = +(tokens[offsetIndex + 2] || 0);
|
|
524
|
+
switch (offset) {
|
|
525
|
+
case '+':
|
|
526
|
+
hour = hour - offsetHours;
|
|
527
|
+
minute = minute - offsetMinutes;
|
|
528
|
+
break;
|
|
529
|
+
case '-':
|
|
530
|
+
hour = hour + offsetHours;
|
|
531
|
+
minute = minute + offsetMinutes;
|
|
532
|
+
break;
|
|
533
|
+
case 'Z':
|
|
534
|
+
break;
|
|
535
|
+
default:
|
|
536
|
+
minute = minute + new Date(Date.UTC(year, month - 1, day, hour, minute)).getTimezoneOffset();
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
} else {
|
|
540
|
+
//If no time is specified, it is considered the beginning of the day, local time.
|
|
541
|
+
minute = minute + new Date(Date.UTC(year, month - 1, day)).getTimezoneOffset();
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
//ISO8601 denotes a leap second by any time having a seconds component of 60 seconds.
|
|
545
|
+
//If that's the case, we need to temporarily subtract a second in order to build a UTC date.
|
|
546
|
+
//Then we add it back in after converting to TAI.
|
|
547
|
+
var isLeapSecond = second === 60;
|
|
548
|
+
if (isLeapSecond) {
|
|
549
|
+
second--;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
//Even if we successfully parsed the string into its components, after applying UTC offset or
|
|
553
|
+
//special cases like 24:00:00 denoting midnight, we need to normalize the data appropriately.
|
|
554
|
+
|
|
555
|
+
//milliseconds can never be greater than 1000, and seconds can't be above 60, so we start with minutes
|
|
556
|
+
while (minute >= 60) {
|
|
557
|
+
minute -= 60;
|
|
558
|
+
hour++;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
while (hour >= 24) {
|
|
562
|
+
hour -= 24;
|
|
563
|
+
day++;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
|
|
567
|
+
while (day > tmp) {
|
|
568
|
+
day -= tmp;
|
|
569
|
+
month++;
|
|
570
|
+
|
|
571
|
+
if (month > 12) {
|
|
572
|
+
month -= 12;
|
|
573
|
+
year++;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
//If UTC offset is at the beginning/end of the day, minutes can be negative.
|
|
580
|
+
while (minute < 0) {
|
|
581
|
+
minute += 60;
|
|
582
|
+
hour--;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
while (hour < 0) {
|
|
586
|
+
hour += 24;
|
|
587
|
+
day--;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
while (day < 1) {
|
|
591
|
+
month--;
|
|
592
|
+
if (month < 1) {
|
|
593
|
+
month += 12;
|
|
594
|
+
year--;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
tmp = (inLeapYear && month === 2) ? daysInLeapFeburary : daysInMonth[month - 1];
|
|
598
|
+
day += tmp;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
//Now create the JulianDate components from the Gregorian date and actually create our instance.
|
|
602
|
+
var components = computeJulianDateComponents(year, month, day, hour, minute, second, millisecond);
|
|
603
|
+
var result = new JulianDate(components[0], components[1], TimeStandard.UTC);
|
|
604
|
+
|
|
605
|
+
//If we were on a leap second, add it back.
|
|
606
|
+
if (isLeapSecond) {
|
|
607
|
+
result.addSeconds(1, result);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
return result;
|
|
611
|
+
};
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Creates a JulianDate instance from a single number representing the Julian day and fractional day.
|
|
615
|
+
*
|
|
616
|
+
* @memberof JulianDate
|
|
617
|
+
*
|
|
618
|
+
* @param {Number} totalDays The combined Julian Day Number and fractional day.
|
|
619
|
+
* @param {TimeStandard} [timeStandard = TimeStandard.UTC] Indicates the time standard in which the first parameter is defined.
|
|
620
|
+
*
|
|
621
|
+
* @return {JulianDate} The new {@Link JulianDate} instance.
|
|
622
|
+
*
|
|
623
|
+
* @exception {DeveloperError} totalDays is required.
|
|
624
|
+
*
|
|
625
|
+
* @see JulianDate
|
|
626
|
+
* @see JulianDate.fromDate
|
|
627
|
+
* @see JulianDate.fromIso8601
|
|
628
|
+
* @see TimeStandard
|
|
629
|
+
* @see LeapSecond
|
|
630
|
+
*
|
|
631
|
+
* @example
|
|
632
|
+
* // Construct a date which corresponds to January 1, 1991 06:00:00 UTC.
|
|
633
|
+
* var julianDate = JulianDate.fromTotalDays(2448257.75, TimeStandard.UTC);
|
|
634
|
+
*/
|
|
635
|
+
JulianDate.fromTotalDays = function(totalDays, timeStandard) {
|
|
636
|
+
if (totalDays === null || isNaN(totalDays)) {
|
|
637
|
+
throw new DeveloperError('totalDays is required.');
|
|
638
|
+
}
|
|
639
|
+
return new JulianDate(totalDays, 0, timeStandard);
|
|
640
|
+
};
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Compares two {JulianDate} instances.
|
|
644
|
+
*
|
|
645
|
+
* @memberof JulianDate
|
|
646
|
+
*
|
|
647
|
+
* @param {JulianDate} a The first instance.
|
|
648
|
+
* @param {JulianDate} b The second instance.
|
|
649
|
+
* @return {Number} A negative value if a is less than b, a positive value if
|
|
650
|
+
* a is greater than b, and zero if a and b are equal.
|
|
651
|
+
*/
|
|
652
|
+
JulianDate.compare = function(a, b) {
|
|
653
|
+
var dayDifference = (a._julianDayNumber - b._julianDayNumber);
|
|
654
|
+
if (dayDifference !== 0) {
|
|
655
|
+
return dayDifference;
|
|
656
|
+
}
|
|
657
|
+
return a._secondsOfDay - b._secondsOfDay;
|
|
658
|
+
};
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Duplicates this JulianDate.
|
|
662
|
+
* @memberof JulianDate
|
|
663
|
+
*
|
|
664
|
+
* @param {Cartesian3} [result] The object onto which to store the JulianDate.
|
|
665
|
+
* @return {Cartesian3} The modified result parameter or a new Cartesian3 instance if one was not provided.
|
|
666
|
+
*/
|
|
667
|
+
JulianDate.prototype.clone = function(result) {
|
|
668
|
+
return JulianDate.clone(this, result);
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Returns the total number of whole and fractional days represented by this astronomical Julian date.
|
|
673
|
+
*
|
|
674
|
+
* @memberof JulianDate
|
|
675
|
+
*
|
|
676
|
+
* @return {Number} The Julian date as single floating point number.
|
|
677
|
+
*
|
|
678
|
+
* @see JulianDate#getJulianDayNumber
|
|
679
|
+
* @see JulianDate#getJulianTimeFraction
|
|
680
|
+
*/
|
|
681
|
+
JulianDate.prototype.getTotalDays = function() {
|
|
682
|
+
return this._julianDayNumber + (this._secondsOfDay / TimeConstants.SECONDS_PER_DAY);
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* Returns the whole number component of the Julian date.
|
|
687
|
+
*
|
|
688
|
+
* @memberof JulianDate
|
|
689
|
+
*
|
|
690
|
+
* @return {Number} A whole number representing the Julian day number.
|
|
691
|
+
*
|
|
692
|
+
* @see JulianDate#getTotalDays
|
|
693
|
+
* @see JulianDate#getJulianTimeFraction
|
|
694
|
+
*/
|
|
695
|
+
JulianDate.prototype.getJulianDayNumber = function() {
|
|
696
|
+
return this._julianDayNumber;
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
* Returns the floating point component of the Julian date representing the time of day.
|
|
701
|
+
*
|
|
702
|
+
* @memberof JulianDate
|
|
703
|
+
*
|
|
704
|
+
* @return {Number} The floating point component of the Julian date representing the time of day.
|
|
705
|
+
*
|
|
706
|
+
* @see JulianDate#getTotalDays
|
|
707
|
+
* @see JulianDate#getJulianDayNumber
|
|
708
|
+
*/
|
|
709
|
+
JulianDate.prototype.getJulianTimeFraction = function() {
|
|
710
|
+
return this._secondsOfDay / TimeConstants.SECONDS_PER_DAY;
|
|
711
|
+
};
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* Return the number of seconds elapsed into the current Julian day (starting at noon).
|
|
715
|
+
*
|
|
716
|
+
* @memberof JulianDate
|
|
717
|
+
*
|
|
718
|
+
* @return {Number} The number of seconds elapsed into the current day.
|
|
719
|
+
*
|
|
720
|
+
* @see JulianDate#getJulianDayNumber
|
|
721
|
+
*/
|
|
722
|
+
JulianDate.prototype.getSecondsOfDay = function() {
|
|
723
|
+
return this._secondsOfDay;
|
|
724
|
+
};
|
|
725
|
+
|
|
726
|
+
var toGregorianDateScratch = new JulianDate(0, 0, TimeStandard.TAI);
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* Creates a GregorianDate representation of this date in UTC.
|
|
730
|
+
* @memberof JulianDate
|
|
731
|
+
*
|
|
732
|
+
* @return {GregorianDate} A gregorian date.
|
|
733
|
+
*/
|
|
734
|
+
JulianDate.prototype.toGregorianDate = function() {
|
|
735
|
+
var isLeapSecond = false;
|
|
736
|
+
var thisUtc = convertTaiToUtc(this, toGregorianDateScratch);
|
|
737
|
+
if (typeof thisUtc === 'undefined') {
|
|
738
|
+
//Conversion to UTC will fail if we are during a leap second.
|
|
739
|
+
//If that's the case, subtract a second and convert again.
|
|
740
|
+
//JavaScript doesn't support leap seconds, so this results in second 59 being repeated twice.
|
|
741
|
+
this.addSeconds(-1, toGregorianDateScratch);
|
|
742
|
+
thisUtc = convertTaiToUtc(toGregorianDateScratch, toGregorianDateScratch);
|
|
743
|
+
isLeapSecond = true;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
var julianDayNumber = thisUtc._julianDayNumber;
|
|
747
|
+
var secondsOfDay = thisUtc._secondsOfDay;
|
|
748
|
+
|
|
749
|
+
if (secondsOfDay >= 43200.0) {
|
|
750
|
+
julianDayNumber += 1;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
// Algorithm from page 604 of the Explanatory Supplement to the
|
|
754
|
+
// Astronomical Almanac (Seidelmann 1992).
|
|
755
|
+
var L = (julianDayNumber + 68569) | 0;
|
|
756
|
+
var N = (4 * L / 146097) | 0;
|
|
757
|
+
L = (L - (((146097 * N + 3) / 4) | 0)) | 0;
|
|
758
|
+
var I = ((4000 * (L + 1)) / 1461001) | 0;
|
|
759
|
+
L = (L - (((1461 * I) / 4) | 0) + 31) | 0;
|
|
760
|
+
var J = ((80 * L) / 2447) | 0;
|
|
761
|
+
var day = (L - (((2447 * J) / 80) | 0)) | 0;
|
|
762
|
+
L = (J / 11) | 0;
|
|
763
|
+
var month = (J + 2 - 12 * L) | 0;
|
|
764
|
+
var year = (100 * (N - 49) + I + L) | 0;
|
|
765
|
+
|
|
766
|
+
var hour = (secondsOfDay / TimeConstants.SECONDS_PER_HOUR) | 0;
|
|
767
|
+
var remainingSeconds = secondsOfDay - (hour * TimeConstants.SECONDS_PER_HOUR);
|
|
768
|
+
var minute = (remainingSeconds / TimeConstants.SECONDS_PER_MINUTE) | 0;
|
|
769
|
+
remainingSeconds = remainingSeconds - (minute * TimeConstants.SECONDS_PER_MINUTE);
|
|
770
|
+
var second = remainingSeconds | 0;
|
|
771
|
+
var millisecond = ((remainingSeconds - second) / TimeConstants.SECONDS_PER_MILLISECOND);
|
|
772
|
+
|
|
773
|
+
// JulianDates are noon-based
|
|
774
|
+
hour += 12;
|
|
775
|
+
if (hour > 23) {
|
|
776
|
+
hour -= 24;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
//If we were on a leap second, add it back.
|
|
780
|
+
if (isLeapSecond) {
|
|
781
|
+
second += 1;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
return new GregorianDate(year, month, day, hour, minute, second, millisecond, isLeapSecond);
|
|
785
|
+
};
|
|
786
|
+
|
|
787
|
+
/**
|
|
788
|
+
* Creates a JavaScript Date representation of this date in UTC.
|
|
789
|
+
* Javascript dates are only accurate to the nearest millisecond.
|
|
790
|
+
* @memberof JulianDate
|
|
791
|
+
*
|
|
792
|
+
* @return {Date} A new JavaScript Date equivalent to this Julian date.
|
|
793
|
+
*/
|
|
794
|
+
JulianDate.prototype.toDate = function() {
|
|
795
|
+
var gDate = this.toGregorianDate();
|
|
796
|
+
var second = gDate.second;
|
|
797
|
+
if (gDate.isLeapSecond) {
|
|
798
|
+
second -= 1;
|
|
799
|
+
}
|
|
800
|
+
return new Date(Date.UTC(gDate.year, gDate.month - 1, gDate.day, gDate.hour, gDate.minute, second, gDate.millisecond));
|
|
801
|
+
};
|
|
802
|
+
|
|
803
|
+
/**
|
|
804
|
+
* Creates an ISO8601 string represenation of this Julian date in UTC.
|
|
805
|
+
* @memberof JulianDate
|
|
806
|
+
*
|
|
807
|
+
* @param {Number} [precision] The number of fractional digits used to represent the seconds component. By default, the most precise representation is used.
|
|
808
|
+
* @return {String} An ISO8601 string represenation of this Julian date.
|
|
809
|
+
*/
|
|
810
|
+
JulianDate.prototype.toIso8601 = function(precision) {
|
|
811
|
+
var gDate = this.toGregorianDate();
|
|
812
|
+
var millisecondStr;
|
|
813
|
+
|
|
814
|
+
if (typeof precision === 'undefined' && gDate.millisecond !== 0) {
|
|
815
|
+
//Forces milliseconds into a number with at least 3 digits to whatever the default toString() precision is.
|
|
816
|
+
millisecondStr = (gDate.millisecond * 0.01).toString().replace('.', '');
|
|
817
|
+
return sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%sZ", gDate.year, gDate.month, gDate.day, gDate.hour, gDate.minute, gDate.second, millisecondStr);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
//Precision is either 0 or milliseconds is 0 with undefined precision, in either case, leave off milliseconds entirely
|
|
821
|
+
if (typeof precision === 'undefined' || precision === 0) {
|
|
822
|
+
return sprintf("%04d-%02d-%02dT%02d:%02d:%02dZ", gDate.year, gDate.month, gDate.day, gDate.hour, gDate.minute, gDate.second);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
//Forces milliseconds into a number with at least 3 digits to whatever the specified precision is.
|
|
826
|
+
millisecondStr = (gDate.millisecond * 0.01).toFixed(precision).replace('.', '').slice(0, precision);
|
|
827
|
+
return sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%sZ", gDate.year, gDate.month, gDate.day, gDate.hour, gDate.minute, gDate.second, millisecondStr);
|
|
828
|
+
};
|
|
829
|
+
|
|
830
|
+
/**
|
|
831
|
+
* Computes the number of seconds that have elapsed from this Julian date to the <code>other</code>
|
|
832
|
+
* Julian date.
|
|
833
|
+
*
|
|
834
|
+
* @memberof JulianDate
|
|
835
|
+
*
|
|
836
|
+
* @param {JulianDate} other The other Julian date, which is the end of the interval.
|
|
837
|
+
*
|
|
838
|
+
* @return {Number} The number of seconds that have elpased from this Julian date to the other Julian date.
|
|
839
|
+
*
|
|
840
|
+
* @see JulianDate#getMinutesDifference
|
|
841
|
+
* @see JulianDate#getDaysDifference
|
|
842
|
+
*
|
|
843
|
+
* @example
|
|
844
|
+
* var start = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
845
|
+
* var end = JulianDate.fromDate(new Date('July 5, 2011 12:01:00'));
|
|
846
|
+
* var difference = start.getSecondsDifference(end); // 86460.0 seconds
|
|
847
|
+
*/
|
|
848
|
+
JulianDate.prototype.getSecondsDifference = function(other) {
|
|
849
|
+
var julianDate1 = this;
|
|
850
|
+
var julianDate2 = other;
|
|
851
|
+
var dayDifference = (julianDate2._julianDayNumber - julianDate1._julianDayNumber) * TimeConstants.SECONDS_PER_DAY;
|
|
852
|
+
return (dayDifference + (julianDate2._secondsOfDay - julianDate1._secondsOfDay));
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* Computes the number of minutes that have elapsed from this Julian date to the <code>other</code>
|
|
857
|
+
* Julian date.
|
|
858
|
+
*
|
|
859
|
+
* @memberof JulianDate
|
|
860
|
+
*
|
|
861
|
+
* @param {JulianDate} other The other Julian date, which is the end of the interval.
|
|
862
|
+
*
|
|
863
|
+
* @return {Number} The number of seconds that have elpased from this Julian date to the other Julian date.
|
|
864
|
+
*
|
|
865
|
+
* @see JulianDate#getSecondsDifference
|
|
866
|
+
* @see JulianDate#getDaysDifference
|
|
867
|
+
*
|
|
868
|
+
* @example
|
|
869
|
+
* var start = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
870
|
+
* var end = JulianDate.fromDate(new Date('July 5, 2011 12:01:00'));
|
|
871
|
+
* var difference = start.getMinutesDifference(end); // 1441.0 minutes
|
|
872
|
+
*/
|
|
873
|
+
JulianDate.prototype.getMinutesDifference = function(other) {
|
|
874
|
+
return this.getSecondsDifference(other) / TimeConstants.SECONDS_PER_MINUTE;
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Computes the number of days that have elapsed from this Julian date to the <code>other</code>
|
|
879
|
+
* Julian date. A day is always exactly 86400.0 seconds.
|
|
880
|
+
*
|
|
881
|
+
* @memberof JulianDate
|
|
882
|
+
*
|
|
883
|
+
* @param {JulianDate} other The other Julian date, which is the end of the interval.
|
|
884
|
+
*
|
|
885
|
+
* @return {Number} The number of days that have elpased from this Julian date to the other Julian date.
|
|
886
|
+
*
|
|
887
|
+
* @see JulianDate#getSecondsDifference
|
|
888
|
+
* @see JulianDate#getMinutesDifference
|
|
889
|
+
*
|
|
890
|
+
* @example
|
|
891
|
+
* var start = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
892
|
+
* var end = JulianDate.fromDate(new Date('July 5, 2011 14:24:00'));
|
|
893
|
+
* var difference = start.getDaysDifference(end); // 1.1 days
|
|
894
|
+
*/
|
|
895
|
+
JulianDate.prototype.getDaysDifference = function(other) {
|
|
896
|
+
var julianDate1 = this;
|
|
897
|
+
var julianDate2 = other;
|
|
898
|
+
var dayDifference = (julianDate2._julianDayNumber - julianDate1._julianDayNumber);
|
|
899
|
+
var secondDifference = (julianDate2._secondsOfDay - julianDate1._secondsOfDay) / TimeConstants.SECONDS_PER_DAY;
|
|
900
|
+
return dayDifference + secondDifference;
|
|
901
|
+
};
|
|
902
|
+
|
|
903
|
+
/**
|
|
904
|
+
* Returns the number of seconds this TAI date is ahead of UTC.
|
|
905
|
+
*
|
|
906
|
+
* @memberof JulianDate
|
|
907
|
+
*
|
|
908
|
+
* @return {Number} The number of seconds this TAI date is ahead of UTC
|
|
909
|
+
*
|
|
910
|
+
* @see LeapSecond
|
|
911
|
+
* @see TimeStandard
|
|
912
|
+
*
|
|
913
|
+
* @example
|
|
914
|
+
* var date = new Date('August 1, 2012 12:00:00 UTC');
|
|
915
|
+
* var julianDate = JulianDate.fromDate(date);
|
|
916
|
+
* var difference = julianDate.getTaiMinusUtc(); //35
|
|
917
|
+
*/
|
|
918
|
+
JulianDate.prototype.getTaiMinusUtc = function() {
|
|
919
|
+
var toFind = new LeapSecond(this, 0.0);
|
|
920
|
+
var leapSeconds = LeapSecond.getLeapSeconds();
|
|
921
|
+
var index = binarySearch(leapSeconds, toFind, LeapSecond.compareLeapSecondDate);
|
|
922
|
+
if (index < 0) {
|
|
923
|
+
index = ~index;
|
|
924
|
+
--index;
|
|
925
|
+
if (index < 0) {
|
|
926
|
+
index = 0;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return leapSeconds[index].offset;
|
|
930
|
+
};
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* Returns a new Julian date representing a time <code>duration</code> seconds later
|
|
934
|
+
* (or earlier in the case of a negative amount).
|
|
935
|
+
*
|
|
936
|
+
* @memberof JulianDate
|
|
937
|
+
*
|
|
938
|
+
* @param {Number} seconds The number of seconds to add or subtract.
|
|
939
|
+
* @param {JulianDate} [result] The JulianDate to store the result into.
|
|
940
|
+
*
|
|
941
|
+
* @return {JulianDate} The modified result parameter or a new JulianDate instance if it was not provided.
|
|
942
|
+
*
|
|
943
|
+
* @exception {DeveloperError} seconds is required and must be a number.
|
|
944
|
+
*
|
|
945
|
+
* @see JulianDate#addMinutes
|
|
946
|
+
* @see JulianDate#addHours
|
|
947
|
+
* @see JulianDate#addDays
|
|
948
|
+
*
|
|
949
|
+
* @example
|
|
950
|
+
* var date = new Date();
|
|
951
|
+
* date.setUTCFullYear(2011, 6, 4); // July 4, 2011 @ 12:00:00 UTC
|
|
952
|
+
* date.setUTCHours(12, 0, 00, 0);
|
|
953
|
+
* var start = JulianDate.fromDate(date);
|
|
954
|
+
* var end = start.addSeconds(95); // July 4, 2011 @ 12:01:35 UTC
|
|
955
|
+
*/
|
|
956
|
+
JulianDate.prototype.addSeconds = function(seconds, result) {
|
|
957
|
+
if (seconds === null || isNaN(seconds)) {
|
|
958
|
+
throw new DeveloperError('seconds is required and must be a number.');
|
|
959
|
+
}
|
|
960
|
+
return setComponents(this._julianDayNumber, this._secondsOfDay + seconds, result);
|
|
961
|
+
};
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* Returns a new Julian date representing a time <code>duration</code> minutes later
|
|
965
|
+
* (or earlier in the case of a negative amount).
|
|
966
|
+
*
|
|
967
|
+
* @memberof JulianDate
|
|
968
|
+
*
|
|
969
|
+
* @param {Number} duration An integer number of minutes to add or subtract.
|
|
970
|
+
*
|
|
971
|
+
* @return {JulianDate} A new Julian date object
|
|
972
|
+
*
|
|
973
|
+
* @exception {DeveloperError} duration is required and must be a number.
|
|
974
|
+
*
|
|
975
|
+
* @see JulianDate#addSeconds
|
|
976
|
+
* @see JulianDate#addHours
|
|
977
|
+
* @see JulianDate#addDays
|
|
978
|
+
*
|
|
979
|
+
* @example
|
|
980
|
+
* var date = new Date();
|
|
981
|
+
* date.setUTCFullYear(2011, 6, 4); // July 4, 2011 @ 12:00 UTC
|
|
982
|
+
* date.setUTCHours(12, 0, 0, 0);
|
|
983
|
+
* var start = JulianDate.fromDate(date);
|
|
984
|
+
* var end = start.addMinutes(65); // July 4, 2011 @ 13:05 UTC
|
|
985
|
+
*/
|
|
986
|
+
JulianDate.prototype.addMinutes = function(duration) {
|
|
987
|
+
if (duration === null || isNaN(duration)) {
|
|
988
|
+
throw new DeveloperError('duration is required and must be a number.');
|
|
989
|
+
}
|
|
990
|
+
var newSecondsOfDay = this._secondsOfDay + (duration * TimeConstants.SECONDS_PER_MINUTE);
|
|
991
|
+
return new JulianDate(this._julianDayNumber, newSecondsOfDay, TimeStandard.TAI);
|
|
992
|
+
};
|
|
993
|
+
|
|
994
|
+
/**
|
|
995
|
+
* Returns a new Julian date representing a time <code>duration</code> hours later
|
|
996
|
+
* (or earlier in the case of a negative amount).
|
|
997
|
+
*
|
|
998
|
+
* @memberof JulianDate
|
|
999
|
+
*
|
|
1000
|
+
* @param {Number} duration An integer number of hours to add or subtract.
|
|
1001
|
+
*
|
|
1002
|
+
* @return {JulianDate} A new Julian date object
|
|
1003
|
+
*
|
|
1004
|
+
* @exception {DeveloperError} duration is required and must be a number.
|
|
1005
|
+
*
|
|
1006
|
+
* @see JulianDate#addSeconds
|
|
1007
|
+
* @see JulianDate#addMinutes
|
|
1008
|
+
* @see JulianDate#addDays
|
|
1009
|
+
*
|
|
1010
|
+
* @example
|
|
1011
|
+
* var date = new Date();
|
|
1012
|
+
* date.setUTCFullYear(2011, 6, 4); // July 4, 2011 @ 12:00 UTC
|
|
1013
|
+
* date.setUTCHours(12, 0, 0, 0);
|
|
1014
|
+
* var start = JulianDate.fromDate(date);
|
|
1015
|
+
* var end = start.addHours(6); // July 4, 2011 @ 18:00 UTC
|
|
1016
|
+
*/
|
|
1017
|
+
JulianDate.prototype.addHours = function(duration) {
|
|
1018
|
+
if (duration === null || isNaN(duration)) {
|
|
1019
|
+
throw new DeveloperError('duration is required and must be a number.');
|
|
1020
|
+
}
|
|
1021
|
+
var newSecondsOfDay = this._secondsOfDay + (duration * TimeConstants.SECONDS_PER_HOUR);
|
|
1022
|
+
return new JulianDate(this._julianDayNumber, newSecondsOfDay, TimeStandard.TAI);
|
|
1023
|
+
};
|
|
1024
|
+
|
|
1025
|
+
/**
|
|
1026
|
+
* Returns a new Julian date representing a time <code>duration</code> days later
|
|
1027
|
+
* (or earlier in the case of a negative amount).
|
|
1028
|
+
*
|
|
1029
|
+
* @memberof JulianDate
|
|
1030
|
+
*
|
|
1031
|
+
* @param {Number} duration An integer number of days to add or subtract.
|
|
1032
|
+
*
|
|
1033
|
+
* @return {JulianDate} A new Julian date object
|
|
1034
|
+
*
|
|
1035
|
+
* @exception {DeveloperError} duration is required and must be a number.
|
|
1036
|
+
*
|
|
1037
|
+
* @see JulianDate#addSeconds
|
|
1038
|
+
* @see JulianDate#addMinutes
|
|
1039
|
+
* @see JulianDate#addHours
|
|
1040
|
+
*
|
|
1041
|
+
* @example
|
|
1042
|
+
* var date = new Date();
|
|
1043
|
+
* date.setUTCFullYear(2011, 6, 4); // July 4, 2011 @ 12:00 UTC
|
|
1044
|
+
* date.setUTCHours(12, 0, 0, 0);
|
|
1045
|
+
* var start = JulianDate.fromDate(date);
|
|
1046
|
+
* var end = start.addDays(5); // July 9, 2011 @ 12:00 UTC
|
|
1047
|
+
*/
|
|
1048
|
+
JulianDate.prototype.addDays = function(duration) {
|
|
1049
|
+
if (duration === null || isNaN(duration)) {
|
|
1050
|
+
throw new DeveloperError('duration is required and must be a number.');
|
|
1051
|
+
}
|
|
1052
|
+
var newJulianDayNumber = this._julianDayNumber + duration;
|
|
1053
|
+
return new JulianDate(newJulianDayNumber, this._secondsOfDay, TimeStandard.TAI);
|
|
1054
|
+
};
|
|
1055
|
+
|
|
1056
|
+
/**
|
|
1057
|
+
* Returns true if <code>other</code> occurs after this Julian date.
|
|
1058
|
+
*
|
|
1059
|
+
* @memberof JulianDate
|
|
1060
|
+
*
|
|
1061
|
+
* @param {JulianDate} other The Julian date to be compared.
|
|
1062
|
+
*
|
|
1063
|
+
* @return {Boolean} <code>true</code> if this JulianDate is chronologically earlier than <code>other</code>; otherwise, <code>false</code>.
|
|
1064
|
+
*
|
|
1065
|
+
* @see JulianDate#lessThanOrEquals
|
|
1066
|
+
* @see JulianDate#greaterThan
|
|
1067
|
+
* @see JulianDate#greaterThanOrEquals
|
|
1068
|
+
*
|
|
1069
|
+
* @example
|
|
1070
|
+
* var start = JulianDate.fromDate(new Date('July 6, 1991 12:00:00'));
|
|
1071
|
+
* var end = JulianDate.fromDate(new Date('July 6, 2011 12:01:00'));
|
|
1072
|
+
* start.lessThan(end); // true
|
|
1073
|
+
*/
|
|
1074
|
+
JulianDate.prototype.lessThan = function(other) {
|
|
1075
|
+
return JulianDate.compare(this, other) < 0;
|
|
1076
|
+
};
|
|
1077
|
+
|
|
1078
|
+
/**
|
|
1079
|
+
* Returns true if <code>other</code> occurs at or after this Julian date.
|
|
1080
|
+
*
|
|
1081
|
+
* @memberof JulianDate
|
|
1082
|
+
*
|
|
1083
|
+
* @param {JulianDate} other The Julian date to be compared.
|
|
1084
|
+
*
|
|
1085
|
+
* @return {Boolean} <code>true</code> if this JulianDate is chronologically less than or equal to<code>other</code>; otherwise, <code>false</code>.
|
|
1086
|
+
*
|
|
1087
|
+
* @see JulianDate#lessThan
|
|
1088
|
+
* @see JulianDate#greaterThan
|
|
1089
|
+
* @see JulianDate#greaterThanOrEquals
|
|
1090
|
+
*
|
|
1091
|
+
* @example
|
|
1092
|
+
* var start = JulianDate.fromDate(new Date('July 6, 1991 12:00:00'));
|
|
1093
|
+
* var end = JulianDate.fromDate(new Date('July 6, 2011 12:00:00'));
|
|
1094
|
+
* start.lessThanOrEquals(end); // true
|
|
1095
|
+
*/
|
|
1096
|
+
JulianDate.prototype.lessThanOrEquals = function(other) {
|
|
1097
|
+
return JulianDate.compare(this, other) <= 0;
|
|
1098
|
+
};
|
|
1099
|
+
|
|
1100
|
+
/**
|
|
1101
|
+
* Returns true if <code>other</code> occurs before this Julian date.
|
|
1102
|
+
*
|
|
1103
|
+
* @memberof JulianDate
|
|
1104
|
+
*
|
|
1105
|
+
* @param {JulianDate} other The Julian date to be compared.
|
|
1106
|
+
*
|
|
1107
|
+
* @return {Boolean} <code>true</code> if this JulianDate is chronologically later than <code>other</code>; otherwise, <code>false</code>.
|
|
1108
|
+
*
|
|
1109
|
+
* @see JulianDate#lessThan
|
|
1110
|
+
* @see JulianDate#lessThanOrEquals
|
|
1111
|
+
* @see JulianDate#greaterThanOrEquals
|
|
1112
|
+
*
|
|
1113
|
+
* @example
|
|
1114
|
+
* var start = JulianDate.fromDate(new Date('July 6, 1991 12:00:00'));
|
|
1115
|
+
* var end = JulianDate.fromDate(new Date('July 6, 2011 12:01:00'));
|
|
1116
|
+
* end.greaterThan(start); // true
|
|
1117
|
+
*/
|
|
1118
|
+
JulianDate.prototype.greaterThan = function(other) {
|
|
1119
|
+
return JulianDate.compare(this, other) > 0;
|
|
1120
|
+
};
|
|
1121
|
+
|
|
1122
|
+
/**
|
|
1123
|
+
* Returns true if <code>other</code> occurs at or before this Julian date.
|
|
1124
|
+
*
|
|
1125
|
+
* @memberof JulianDate
|
|
1126
|
+
*
|
|
1127
|
+
* @param {JulianDate} other The Julian date to be compared.
|
|
1128
|
+
*
|
|
1129
|
+
* @return {Boolean} <code>true</code> if this JulianDate is chronologically later than or equal to <code>other</code>; otherwise, <code>false</code>.
|
|
1130
|
+
*
|
|
1131
|
+
* @see JulianDate#lessThan
|
|
1132
|
+
* @see JulianDate#lessThanOrEquals
|
|
1133
|
+
* @see JulianDate#greaterThan
|
|
1134
|
+
*
|
|
1135
|
+
* @example
|
|
1136
|
+
* var start = JulianDate.fromDate(new Date('July 6, 1991 12:00:00'));
|
|
1137
|
+
* var end = JulianDate.fromDate(new Date('July 6, 2011 12:00:00'));
|
|
1138
|
+
* end.greaterThanOrEquals(start); // true
|
|
1139
|
+
*/
|
|
1140
|
+
JulianDate.prototype.greaterThanOrEquals = function(other) {
|
|
1141
|
+
return JulianDate.compare(this, other) >= 0;
|
|
1142
|
+
};
|
|
1143
|
+
|
|
1144
|
+
/**
|
|
1145
|
+
* Returns <code>true</code> if this date is equivalent to the specified date.
|
|
1146
|
+
*
|
|
1147
|
+
* @memberof JulianDate
|
|
1148
|
+
*
|
|
1149
|
+
* @param {JulianDate} other The JulianDate to be compared.
|
|
1150
|
+
* @param {Number} epsilon The number of seconds that should separate the two JulianDates
|
|
1151
|
+
*
|
|
1152
|
+
* @return {Boolean} <code>true</code> if the two JulianDates are equal; otherwise <code>false</code>.
|
|
1153
|
+
*
|
|
1154
|
+
* @see JulianDate#equalsEpsilon
|
|
1155
|
+
*
|
|
1156
|
+
* @example
|
|
1157
|
+
* var original = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
1158
|
+
* var clone = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
1159
|
+
* original.equals(clone); // true
|
|
1160
|
+
*/
|
|
1161
|
+
JulianDate.prototype.equals = function(other) {
|
|
1162
|
+
return JulianDate.compare(this, other) === 0;
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1165
|
+
/**
|
|
1166
|
+
* Returns <code>true</code> if this date is within <code>epsilon</code> seconds of the
|
|
1167
|
+
* specified date. That is, in order for the dates to be considered equal (and for
|
|
1168
|
+
* this function to return <code>true</code>), the absolute value of the difference between them, in
|
|
1169
|
+
* seconds, must be less than <code>epsilon</code>.
|
|
1170
|
+
*
|
|
1171
|
+
* @memberof JulianDate
|
|
1172
|
+
*
|
|
1173
|
+
* @param {JulianDate} other The JulianDate to be compared.
|
|
1174
|
+
* @param {Number} epsilon The number of seconds that should separate the two JulianDates
|
|
1175
|
+
*
|
|
1176
|
+
* @return {Boolean} <code>true</code> if the two JulianDates are within <code>epsilon</code> seconds of each other; otherwise <code>false</code>.
|
|
1177
|
+
*
|
|
1178
|
+
* @exception {DeveloperError} epsilon is required and must be number.
|
|
1179
|
+
*
|
|
1180
|
+
* @see JulianDate#equals
|
|
1181
|
+
*
|
|
1182
|
+
* @example
|
|
1183
|
+
* var original = JulianDate.fromDate(new Date('July 4, 2011 12:00:00'));
|
|
1184
|
+
* var clone = JulianDate.fromDate(new Date('July 4, 2011 12:00:01'));
|
|
1185
|
+
* original.equalsEpsilon(clone, 2); // true
|
|
1186
|
+
*/
|
|
1187
|
+
JulianDate.prototype.equalsEpsilon = function(other, epsilon) {
|
|
1188
|
+
if (epsilon === null || isNaN(epsilon)) {
|
|
1189
|
+
throw new DeveloperError('epsilon is required and must be number.');
|
|
1190
|
+
}
|
|
1191
|
+
return Math.abs(this.getSecondsDifference(other)) <= epsilon;
|
|
1192
|
+
};
|
|
1193
|
+
|
|
1194
|
+
//To avoid circular dependencies, we load the default list of leap seconds
|
|
1195
|
+
//here, rather than in the LeapSecond class itself.
|
|
1196
|
+
if (LeapSecond._leapSeconds.length === 0) {
|
|
1197
|
+
LeapSecond._leapSeconds = [
|
|
1198
|
+
new LeapSecond(new JulianDate(2441317, 43210.0, TimeStandard.TAI), 10), // January 1, 1972 00:00:00 UTC
|
|
1199
|
+
new LeapSecond(new JulianDate(2441499, 43211.0, TimeStandard.TAI), 11), // July 1, 1972 00:00:00 UTC
|
|
1200
|
+
new LeapSecond(new JulianDate(2441683, 43212.0, TimeStandard.TAI), 12), // January 1, 1973 00:00:00 UTC
|
|
1201
|
+
new LeapSecond(new JulianDate(2442048, 43213.0, TimeStandard.TAI), 13), // January 1, 1974 00:00:00 UTC
|
|
1202
|
+
new LeapSecond(new JulianDate(2442413, 43214.0, TimeStandard.TAI), 14), // January 1, 1975 00:00:00 UTC
|
|
1203
|
+
new LeapSecond(new JulianDate(2442778, 43215.0, TimeStandard.TAI), 15), // January 1, 1976 00:00:00 UTC
|
|
1204
|
+
new LeapSecond(new JulianDate(2443144, 43216.0, TimeStandard.TAI), 16), // January 1, 1977 00:00:00 UTC
|
|
1205
|
+
new LeapSecond(new JulianDate(2443509, 43217.0, TimeStandard.TAI), 17), // January 1, 1978 00:00:00 UTC
|
|
1206
|
+
new LeapSecond(new JulianDate(2443874, 43218.0, TimeStandard.TAI), 18), // January 1, 1979 00:00:00 UTC
|
|
1207
|
+
new LeapSecond(new JulianDate(2444239, 43219.0, TimeStandard.TAI), 19), // January 1, 1980 00:00:00 UTC
|
|
1208
|
+
new LeapSecond(new JulianDate(2444786, 43220.0, TimeStandard.TAI), 20), // July 1, 1981 00:00:00 UTC
|
|
1209
|
+
new LeapSecond(new JulianDate(2445151, 43221.0, TimeStandard.TAI), 21), // July 1, 1982 00:00:00 UTC
|
|
1210
|
+
new LeapSecond(new JulianDate(2445516, 43222.0, TimeStandard.TAI), 22), // July 1, 1983 00:00:00 UTC
|
|
1211
|
+
new LeapSecond(new JulianDate(2446247, 43223.0, TimeStandard.TAI), 23), // July 1, 1985 00:00:00 UTC
|
|
1212
|
+
new LeapSecond(new JulianDate(2447161, 43224.0, TimeStandard.TAI), 24), // January 1, 1988 00:00:00 UTC
|
|
1213
|
+
new LeapSecond(new JulianDate(2447892, 43225.0, TimeStandard.TAI), 25), // January 1, 1990 00:00:00 UTC
|
|
1214
|
+
new LeapSecond(new JulianDate(2448257, 43226.0, TimeStandard.TAI), 26), // January 1, 1991 00:00:00 UTC
|
|
1215
|
+
new LeapSecond(new JulianDate(2448804, 43227.0, TimeStandard.TAI), 27), // July 1, 1992 00:00:00 UTC
|
|
1216
|
+
new LeapSecond(new JulianDate(2449169, 43228.0, TimeStandard.TAI), 28), // July 1, 1993 00:00:00 UTC
|
|
1217
|
+
new LeapSecond(new JulianDate(2449534, 43229.0, TimeStandard.TAI), 29), // July 1, 1994 00:00:00 UTC
|
|
1218
|
+
new LeapSecond(new JulianDate(2450083, 43230.0, TimeStandard.TAI), 30), // January 1, 1996 00:00:00 UTC
|
|
1219
|
+
new LeapSecond(new JulianDate(2450630, 43231.0, TimeStandard.TAI), 31), // July 1, 1997 00:00:00 UTC
|
|
1220
|
+
new LeapSecond(new JulianDate(2451179, 43232.0, TimeStandard.TAI), 32), // January 1, 1999 00:00:00 UTC
|
|
1221
|
+
new LeapSecond(new JulianDate(2453736, 43233.0, TimeStandard.TAI), 33), // January 1, 2006 00:00:00 UTC
|
|
1222
|
+
new LeapSecond(new JulianDate(2454832, 43234.0, TimeStandard.TAI), 34), // January 1, 2009 00:00:00 UTC
|
|
1223
|
+
new LeapSecond(new JulianDate(2456109, 43235.0, TimeStandard.TAI), 35) // July 1, 2012 00:00:00 UTC
|
|
1224
|
+
];
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
return JulianDate;
|
|
1228
|
+
});
|