RFC 56:OFTTime/OFTDateTime毫秒精度

作者:连鲁奥

联系人:spatialys.com上的偶数点rouault

状态:通过、实施

版本:2.0

总结

此RFC旨在增加OFTTime和OFTDateTime字段的毫秒精度,因为许多格式都显式或隐式支持它:MapInfo、GPX、Atom(GeoRSS驱动程序)、GeoPackage、SQLite、PostgreSQL、CSV、GeoJSON、ODS、XLSX、KML(也可能是GML)。。。

核心变化

OGRField枚举被修改为:

typedef union {
    [... unchanged ... ]

    struct {
        GInt16  Year;
        GByte   Month;
        GByte   Day;
        GByte   Hour;
        GByte   Minute;
        GByte   TZFlag; /* 0=unknown, 1=localtime(ambiguous),
                           100=GMT, 104=GMT+1, 80=GMT-5, etc */
        GByte   Reserved; /* must be set to 0 */
        float   Second; /* with millisecond accuracy. at the end of the structure, so as to keep it 12 bytes on 32 bit */
    } Date;
} OGRField;

因此“GByte Second”字段将被删除,并替换为保留供以后使用的填充字节。将添加一个“float Second”字段。

在32位构建中,OGRField的大小现在是12字节,而不是8字节。在64位构建中,OGRField的大小保持为16字节。

新方法/修改方法

使用int nSecond的OGRFeature::SetFieldAsDateTime()方法现在使用float fSecond参数。获取int的GetFieldAsDateTime()方法 * 保留pnSecond,并使用一个新的GetFieldAsDateTime()方法 * 添加pfSecond。

  • 在OGRFeature类中:

int                 GetFieldAsDateTime( int i,
                                 int *pnYear, int *pnMonth, int *pnDay,
                                 int *pnHour, int *pnMinute, int *pnSecond,
                                 int *pnTZFlag ); /* unchanged from GDAL 1.X */
int                 GetFieldAsDateTime( int i,
                                 int *pnYear, int *pnMonth, int *pnDay,
                                 int *pnHour, int *pnMinute, float *pfSecond,
                                 int *pnTZFlag ); /* new */
void                SetField( int i, int nYear, int nMonth, int nDay,
                              int nHour=0, int nMinute=0, float fSecond=0.f,
                              int nTZFlag = 0 ); /* modified */
void                SetField( const char *pszFName,
                              int nYear, int nMonth, int nDay,
                              int nHour=0, int nMinute=0, float fSecond=0.f,
                              int nTZFlag = 0 ); /* modified */

如果OGRField.Date的第二个成员不是整数,则将OGRFeature::GetFieldAsString()修改为输出毫秒

OGRParseDate()被修改为将第二个解析为浮点数。

以下实用程序函数的签名已被修改为接受OGRField(而不是整年、月、日、时、分、秒、TZFlag分解),并接受十进制秒作为输入/输出:

int CPL_DLL OGRParseXMLDateTime( const char* pszXMLDateTime,
                                 OGRField* psField );
int CPL_DLL OGRParseRFC822DateTime( const char* pszRFC822DateTime,
                                    OGRField* psField );
char CPL_DLL * OGRGetRFC822DateTime(const OGRField* psField);
char CPL_DLL * OGRGetXMLDateTime(const OGRField* psField);

C API更改

仅添加:

int   CPL_DLL OGR_F_GetFieldAsDateTimeEx( OGRFeatureH hFeat, int iField,
                                int *pnYear, int *pnMonth, int *pnDay,
                                int *pnHour, int *pnMinute, float *pfSecond,
                                int *pnTZFlag );
void   CPL_DLL OGR_F_SetFieldDateTimeEx( OGRFeatureH, int,
                                       int, int, int, int, int, float, int );

驱动因素的变化

以下驱动程序现在接受毫秒作为输入/输出:

  • GeoJSON

  • CSV

  • PG

  • PGDump(仅输出)

  • CartoDB

  • GeoPackage

  • SQLite

  • MapInfo.tab和.mif

  • LIBKML

  • ODS

  • XLSX

  • GeoRSS(Atom格式)

  • GPX

SWIG绑定的更改

Feature.GetFieldAsDateTime()和Feature.SetFieldAsDateTime()现在使用/返回浮点数秒

兼容性

这修改了C/C++ API和ABI。

如果DateTime/Time字段具有这样的精度,则上述驱动程序的输出现在将包括毫秒。

文档

所有新的/修改的方法都记录在案。MIGRATION_GUIDE.TXT将更新为此RFC的新部分。

测试

对本RFC的各个方面进行了测试:

  • 核心变化

  • 驱动程序更改

实施

实施将由甚至鲁奥完成 (Spatialys ②)

建议的实现位于 https://github.com/rouault/gdal2/tree/subsecond_accuracy 储存库。

更改列表: https://github.com/rouault/gdal2/compare/subsecond_accuracy

投票历史

+DanielM、JukkaR和Ever各一家