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各一家