数据处理的默认配置是有一个数据上下文,它会在需要时才加载数据,即每个数据片段首次需要时才加载。这是直到Orekit 10.0为止唯一可能的配置,因为在10.1版本中引入了多个数据上下文。
延迟加载由DataProvidersManager
类管理。在Orekit 10.0之前,它是一个单例。自Orekit 10.1以来,它是一个常规类,存储在对应于默认数据上下文的LazyLoadedDataContext
中。
DataProvidersManager
类将数据加载分为两个阶段:检索存储介质上的原始数据和解析数据格式。
数据集必须存储在Orekit库能够找到的位置。这可以是简单的磁盘上的目录树,但也可以是几乎任何其他东西,因为这种简单的解决方案无法适应库的所有用途。
以下用例展示了不同的可能数据存储策略。所有这些都可以通过Orekit插件机制处理。大多数插件已经在库本身中可用。
在控制中心的几个操作员桌面上使用的应用程序,没有外部网络连接
在这种情况下,数据可以存储在主操作数据库中,依赖现有的管理程序(更新、备份、冗余等)。
用于日常研究的桌面计算机上的仿真工具
对于每天在本地使用的工具,数据主要存储在用户环境中。传统架构将涉及两个主要数据存储,一个在网络共享磁盘上,用于处理部门级别的大型通用数据集,另一个作为本地用户磁盘上的简单文件,用户可以将自定义数据集放在其中以满足特定目的。本地数据文件可以设置为覆盖特殊情况下的系统级值。
添加到现有工具套件的新程序
如果使用Orekit的程序集成到具有自己已建立的数据管理系统的现有环境中,则必须配置库以使用此现有系统来检索现有数据,而不是使用Orekit自己的内部系统。这样可以实现更顺畅的集成。它还简化了整个套件的系统管理,并避免了数据重复。
小型网络设备上的独立应用程序
在小型设备上使用的应用程序(例如移动电话),如果它不在设备本身上存储数据,而是在需要时从网络上动态获取数据,那么设置和使用起来可能更简单。
应用程序服务器中的计算服务
在应用程序服务器上安装的服务,如果不是在服务器上使用显式文件位置,而是将数据存储在应用程序类路径中,那么配置起来可能更简单,因为它将与应用程序代码本身一起由应用程序服务器管理。
为了简化用户的数据更新并避免转换错误,Orekit使用每个支持的数据集的原始格式。因此,如果用户想要考虑给定年份的地球定向参数,例如,他或她只需从IERS服务器上的http://www.iers.org/IERS/EN/DataProducts/EarthOrientationData/eop.html下载相应的文件,并将其放入Orekit配置的数据存储系统中,而无需对数据文件本身进行任何更改。
可以使用自定义数据格式,参见应用数据页面。
下图显示了Orekit中最低级别的数据处理。
当在Orekit中读取某些数据时(例如LazyLoadedCelestialBody
类所需的JPL DE405或DE430天体轨道数据),会使用DataLoader
接口的实现。默认情况下,它将是JPLEphemeridesLoader
(可以自定义)。该实现根据文件名(unxp1950.405,lnxp1990.430等)知道它可以处理的文件类型。它还知道文件格式和如何处理数据。数据加载器不知道数据的位置,也不会打开文件本身。
定位和获取数据的任务由实现DataProvider
类的类执行。每个实现专用于一种存储类型(磁盘,类路径,直接从网络下载,访问数据库,委托给用户定义的库等)。提供者会遍历其存储介质,并针对每个存储的文件询问数据加载器是否支持该文件。如果数据加载器支持该文件,则提供者将从存储介质中获取数据并将其提供给加载器。
使用哪个数据加载器很简单。例如,LazyLoadedCelestialBody
类只能处理JPL天体轨道数据,因此只能使用一个数据加载器。它在LazyLoadedCelestialBody
类中作为默认加载器进行硬编码。可以自定义使用哪个数据提供者。一个数据上下文的DataProvidersManager
管理应该在该上下文中用于数据加载的所有提供者。该管理器通常在应用程序初始化时进行配置,具体取决于用例和可能的配置数据(环境变量,Java属性,用户首选项等)。如果未配置管理器,则设置默认配置。
默认设置基于一个名为orekit.data.path
的Java属性。该属性应设置为一个包含Orekit可以使用的数据文件的目录树(推荐)或zip/jar归档文件(不推荐)。该属性根据操作系统的约定进行设置,即在Linux和Unix类型的操作系统上,列表元素以冒号分隔,在Windows类型的操作系统上以分号分隔。
此默认设置仅使用静态本地存储(或网络共享磁盘)。它不连接到任何东西,既不下载常规文件,也不从数据库中提取一堆字节。它也不会在类路径中查找数据。如果出现这样的需求,则必须设置自定义配置。
可以使用任意数量的目录树或zip/jar归档文件,每个列表元素只是添加一个新的位置来查找数据。列表元素按照定义的顺序逐个使用。如果一个位置包含Orekit正在寻找的数据片段,则循环遍历位置将停止,并忽略剩余的列表元素。可以将可以分散在不同文件中的数据(例如JPL星历或地球定向参数)仅从一个位置加载。这意味着,例如,如果EOP数据被拆分为目录eop/yearly
中的年度EOPC04文件和目录eop/weekly
中的每周BulletinA文件,则用户不应单独配置这两个位置eop/yearly
和eop/weekly
,因为这将导致只使用第一个配置的位置,而忽略第二个位置。这种目录组织是完全可接受的,但应将其配置为仅指定顶级目录eop
作为一个位置(子目录会自动递归搜索)。这种设计选择允许设置配置,其中用户提供自己的数据子集(例如仅地球定向参数),并防止系统范围的配置用于此子集,同时仍然使用系统树中的其余数据(例如JPL星历)。用户可以通过将自己的目录放在属性中的大型系统级目录之前来实现此目的。然而,最简单的配置是将所有数据放入一个orekit-data
顶级目录,并将此单个目录指定为唯一要使用的位置。
目录树或zip/jar归档文件可以互换使用。它们基本上都表示文件或其他目录树或zip/jar归档文件的容器。Orekit会动态打开zip/jar归档文件,并像打开常规目录一样进入其中,而不会将任何内容写入磁盘。然而,不推荐使用zip/jar归档文件,因为从这样的归档文件中提取文件意味着读取整个文件(因为zip格式将中央目录放在归档文件的末尾)。因此,如果一个zip归档文件包含大型行星星历、长期EOP数据和大型重力场,加载对应于UTC-TAI文件的几百个字节仍然意味着读取所有其他将被忽略的数据,最后找到中央目录以定位所需的小文件,并倒回所有内容以恢复其数据(通过再次读取文件或在内存中保留所有内容)。将zip文件在事先扩展为目录树并将Orekit指向顶级目录的位置要少得多。
数据文件也可以使用gzip或Unix compress进行压缩,以节省一些磁盘空间。在解析过程中,压缩文件会直接解压缩,只有当前需要的压缩和解压缩块会保留在内存中。对于类似Bulletin B、EOPC04或RINEX这样的文本文件进行压缩可以节省大量磁盘空间,但对于JPL二进制文件进行压缩几乎不会节省空间。在zip存档文件中使用压缩文件也是无关紧要的,因为zip/jar文件本身已经被压缩,堆叠压缩算法只会减慢读取速度而不会节省任何磁盘空间(除了RINEX文件的专用Hatanaka压缩通常与Unix或gzip压缩一起使用)。过滤功能在过滤页面中有详细说明。
由于从不将任何内容写入磁盘(没有临时文件),用户提供的数据集可以存储在非可写介质上,例如具有受限访问权限的磁盘分区或CD/DVD介质。
数据目录树或zip/jar存档中没有强制的布局。Orekit在查找数据文件时会遍历它们及其子目录。文件通过对其名称进行模式匹配来识别。不符合规则的文件会被静默忽略。这使得用户可以与其他需要特定布局或附加文件的工具共享数据目录树。上图中展示的布局是一个简单的示例。
与任何其他Java属性一样,orekit.data.path
可以在应用程序启动时由用户初始化(例如使用虚拟机的-D标志)或通过调用System.setProperty
方法在应用程序内部初始化。在后一种情况下,可以使用DataProvidersManager
类中的OREKIT_DATA_PATH
静态字段,而不是字面字符串常量orekit.data.path
。如果应用程序设置了该属性,则必须在调用任何Orekit功能之前进行设置,因为一些数据在非常早期就被初始化(主要是与帧和时间相关的数据,如UTC的闰秒)。
如果默认设置不符合用户的需求,就需要设置自定义配置。例如,如果数据必须嵌入应用程序并从类路径加载,或者如果数据必须从动态或虚拟存储介质(如数据库、网站或本地数据处理库)中检索,就需要进行自定义配置。
可以通过使用专用的数据上下文来设置自定义配置,例如,如果使用了专用于任务的数据库,或者通过配置默认的DataProvidersManager
来设置,如果数据存储仍然主要是资源/文件导向的。
配置DataProvidersManager
涉及清除它(如果已经存在)并按适当的顺序添加特定的数据提供程序。
Orekit库预定义的数据提供程序如下:
DirectoryCrawler
用于加载由其根目录指定的目录树中的文件ZipJarCrawler
用于加载存储在zip或jar存档中的文件ClasspathCrawler
用于加载存储为类路径资源的文件NetworkCrawler
用于从远程主机下载文件(可以直接从互联网站点通过企业代理服务器下载)用户还可以添加自己的DataProvider
接口实现,并将其注册到DataProvidersManager
实例中。
为了方便起见,最简单的配置是从forge下载orekit-data-master.zip文件,将其解压到用户想要的任何位置,将创建的orekit-data-master
文件夹重命名为orekit-data
,并在用户程序的开头添加以下行:
File orekitData = new File("/path/to/the/folder/orekit-data");
DataProvidersManager manager = DataContext.getDefault().getDataProvidersManager();
manager.addProvider(new DirectoryCrawler(orekitData));
此zip文件包含JPL DE 440天体力学数据(1990年至2149年),1973年起的IERS地球定向参数(包括IAU-1980和IAU-2000),1972年起的UTC-TAI历史,1999年起的Marshall太阳活动未来估计,Eigen 06S重力场和FES 2004海洋潮汐模型以及从1957年开始的观测数据和未来22年的预测数据的空间天气数据。