RFC 60:OGR中改进的往返

作者:连鲁奥

联系人:even.rouault,网址:spatialys.com

状态:通过、实施

实现版本:2.1

总结

这个RFC定义了如何改进向量格式转换中更好的往返,特别是对于GeoJSON扩展。

理论基础

有些格式的概念没有很好地被OGR抽象建模,但是希望在涉及到重新投影、空间/属性过滤、剪裁等的转换场景中保留这些概念。。。其中目标格式是源格式。

在核心GeoJSON规范之上存在各种扩展:在FeatureCollection、Feature或Geometry级别。

https://github.com/mapbox/carmen/blob/master/carmen-geojson.md

{
    "type": "FeatureCollection",
    "query": ["austin"],
    "features": [
        {
            "type": "Feature",
            "id": "place.4201",
            "text": "Austin",
            "place_name": "Austin, Texas, United States",
            "bbox": [-97.9383829999999, 30.098659, -97.5614889999999, 30.516863],
            "center": [-97.7559964, 30.3071816],
            "geometry": {
                "type": "Point",
                "coordinates": [-97.7559964, 30.3071816]
            },
            "properties": {
                "title": "Austin",
                "type": "city",
                "score": 600000790107194.8
            },
            "context": [
                {
                    "id": "province.293",
                    "text": "Texas"
                },
                {
                    "id": "country.51",
                    "text": "United States"
                }
            ]
        },
        ...
    ]
}

https://github.com/geocoders/geocodejson-spec/blob/master/draft/README.md

{

  // REQUIRED. GeocodeJSON result is a FeatureCollection.
  "type": "FeatureCollection",

  // REQUIRED. Namespace.
  "geocoding": {

    // REQUIRED. A semver.org compliant version number. Describes the version of
    // the GeocodeJSON spec that is implemented by this instance.
    "version": "0.1.0",

    // OPTIONAL. Default: null. The licence of the data. In case of multiple sources,
    // and then multiple licences, can be an object with one key by source.
    "licence": "ODbL",

    // OPTIONAL. Default: null. The attribution of the data. In case of multiple sources,
    // and then multiple attributions, can be an object with one key by source.
    "attribution": "OpenStreetMap Contributors",

    // OPTIONAL. Default: null. The query that has been issued to trigger the
    // search.
    "query": "24 allée de Bercy 75012 Paris",

  },

  // REQUIRED. As per GeoJSON spec.
  "features": [
    // OPTIONAL. An array of feature objects. See below.
  ]
}

https://github.com/geojson/draft-geojson/issues/80#issuecomment-138037554 举几个例子。

{ "type" : "GeometryCollection",
  "geometries" : [
    { "type" : "LineString",
      "extensions" : [ "time", "atemp", "hr", "cad" ],
      "coordinates" : [
        [
          -122.45671039447188,
          37.786870915442705,
          0.4000000059604645,
          "2014-11-06T19:16:06.000Z",
          31.0,
          99,
          0
        ],

变化

OGRFeature

OGRFeature类将添加两个新成员m_pszNativeData(string)和m_pszNativeMediaType(string)。m_pszNativeData将包含原始特征的表示(或表示的一部分),m_pszNativeData将 media type

以下方法将添加到OGRFeature类:

public:
    const char *GetNativeData() const;
    const char *GetNativeMediaType() const;
    void        SetNativeData( const char* pszNativeData );
    void        SetNativeMediaType( const char* pszNativeMediaType );

因此,在GeoJSON的情况下,nativeData将包含GeoJSON特性的完整序列化。møpszNativeMediaType将设置为“application/vnd.geo+json”,如果存在,GeoJSON驱动程序的编写端将从nativeData开始(如果nativeMediaType=“application/vnd.geo+json”,则将其properties成员替换为OGR字段的内容,并修补其几何图形以包含其他json对象。

OGRFeature::Clone()和::SetFrom()方法将传播nativeData和nativeMediaType。

OGRLayer

将使用专用元数据域“NATIVE_DATA”,其中将有“NATIVE_DATA”和“NATIVE_MEDIA_TYPE”项。在GeoJSON的情况下,这将包含FeatureCollection级别的JSON成员(当然不包括features数组)。

驱动程序打开选项和图层创建选项

在读取时支持NATIVE DATA的驱动程序应该公开一个NATIVE_DATA boolean open选项,并在默认情况下禁用它,以免影响性能。默认情况下,ogr2ogr将启用此选项。

在层级别上支持NATIVE DATA的驱动程序应公开本机数据字符串和本机媒体类型字符串层创建选项,以便ogr2ogr可以用源层的本机数据元数据域的内容填充它们。

计算机辅助编程接口

将添加以下功能:

const char CPL_DLL *OGR_F_GetNativeData(OGRFeatureH);
void OGR_F_SetNativeData(OGRFeatureH, const char*);
const char CPL_DLL *OGR_F_GetNativeMediaType(OGRFeatureH);
void OGR_F_SetNativeMediaType(OGRFeatureH, const char*);

SQL结果层

对OGR SQL和SQLite SQL方言实现进行了修改,以将源层(FROM表之一)的本机数据元数据域的内容传播到目标层,并将源功能中的NATIVE DATA和NativeMediaType复制到目标功能中。

SWIG绑定(Python/Java/C#/Perl)更改

新函数将作为GetNativeData()、SetNativeData()、GetNativeMediaType()和SetNativeMediaType()映射到SWIG

驱动程序

GeoJSON驱动程序将被修改以实现这个RFC(读写),因此 * :

  • 声明本机数据打开选项以启用存储层和功能本机数据。

  • 以及NATIVE_DATA和NATIVE_MEDIA_TYPE层创建选项,以便能够在功能收集级别写入NATIVE数据

  • 在写入时使用OGRFeature nativeData。

这样做的结果是,ogr2ogr将能够保留标记在 *** 在下面的片段中:

{
  "type": "FeatureCollection",
  ***"extra_fc_member": "foo",***
  "features":
  [
    {
      "type": "Feature",
      ***"extra_feat_member": "bar",***
      "geometry": {
        "type": "Point",
        ***extra_geom_member": "baz",***
        "coordinates": [ 2, 49, 3, ***100, 101*** ]
      },
      "properties": {
        "a_property": "foo",
      }
    }
  ]
}

其他的驱动程序,如ElasticSearch和MongoDB驱动程序,使用一个ùjson OGR字段进行往返,可能会被升级以从这个RFC的机制中受益。

公用事业

ogr2ogr将被修改为在图层和要素级别自动复制nativeData。如果不希望这样做,将添加-noNativeData标志以避免这样做。

默认情况下,ogr2ogr将使用NATIVE_DATA=YES open选项打开数据源,以便可以存储nativeData的驱动程序这样做。如果输出数据源支持本机数据和本机媒体类型层创建选项,则它将使用源层本机数据元数据域的内容感受它们。

文档

所有新的方法/功能都记录在案。

测试套件

将扩展与GeoJSON和ogr2ogr相关的测试

兼容性问题

没什么严重的。可能存在的脚本可能需要添加-noNativeData来获取以前的行为。

实施

该实现将由Even Rouault(Spatialys)完成,并由Mapbox赞助。

建议的实现位于https://github.com/rouault/gdal2/tree/rfc60_native_data ,在拉取请求中 https://github.com/OSGeo/gdal/pull/75

投票历史

+来自HowardB,KurtS,TamasS,JukkaR和Ever