选择。2:删除冗余属性值

共享字符串表

SpatialJSON响应 may 包含一个 Shared String Table ,这是 may 包含由某些功能的属性引用的字符串。只有表示为JSON字符串的属性才能存储在共享字符串表中(目前,也表示为字符串的时间值,如日期和时间戳,不存储在共享字符串表中)。

如果存在,则显示一个新的 "sharedStrings" 属性在顶级中可用 "FeatureCollection" 对象:

{
  "type": "FeatureCollection",

  "$note": " /* remaining properties go here */ ",

  "schemaInformation": {
    "propertyNames": ["str_1", "num_2", "str_3", "str_4", "bool_5"],
    "geometryName": "the_geom"
  },
  "sharedStrings": {
    "indexes": [0, 2, 3],
    "table": ["Lorem ipsum dolor sit amet,",
              "consetetur sadipscing elitr,",
              "sed diam nonumy eirmod tempor invidunt ut labore",
              "et dolore magna aliquyam erat,",
              "sed diam voluptua."]
  }
}

它包含以下两个属性:

  • "table" -包含共享字符串。它们通过它们在数组中的索引来引用。

  • "indexes" -包含要素属性的从零开始的索引 may 存储在此共享字符串表中。

在SpatialJSON中,要素的属性基本上只存储在数组中(与GeoJSON将属性存储在对象中形成对比)。这个 "indexes" 数组包含这些属性数组中的索引 may 将它们的值存储在共享字符串表中。在要素的属性数组中,这样的值实际上可能是 null ,一个常规的JSON string 或JSON number (整数)。在后一种情况下,属性值实际上存储在共享字符串表中,该值用作共享字符串表的索引。

这些示例显示了如何使用上面的字符串表计算某些功能的属性数组:

/* showing properties array of feature #1 */
properties: ["foo", 23, 2, null, true]

/* gets evaluated to */
properties: {
  "str_1": "foo",
  "num_2": 23,
  "str_3": "sed diam nonumy eirmod tempor invidunt ut labore",
  "str_4": null,
  "bool_5": true
}

/* showing properties array of feature #2 */
properties: [1, 32, "K", 3, false]

/* gets evaluated to */
properties: {
  "str_1": "consetetur sadipscing elitr",
  "num_2": 32,
  "str_3": "K",
  "str_4": "et dolore magna aliquyam erat",
  "bool_5": false
}

如示例所示,不能保证其索引是 sharedStrings.indexes 数组实际上存储在共享字符串表中。

SpatialJSON编写器实现

将哪些字符串添加到共享字符串表完全由SpatialJSON编写器决定。可以使用几种策略。但是,此模块中的当前实现不会尝试创建 optimal 共享字符串表。为了更快,字符串在功能被序列化时被添加。构建最优表可能需要多次迭代特性、计算字符串的频率等。

尽管如此,该模块的SpatialJSON编写器有一些构建共享字符串表的简单规则。即使是在最糟糕的情况下,如果不使用共享的字符串表,它们也会尽量(至少)不使用相同结果所需的(太多)字节。(理论上,有时共享字符串表会向结果中添加一些额外的字节。)然而,对于大多数现实世界的数据集,该策略可以节省中等到大量的字节。

以下是阻止字符串添加到共享字符串表的规则:

  • 字符串的UTF-8编码字节长度小于硬编码的最小长度(当前为2,将来可能可配置)

  • 共享的STIN表已满,即它包含2,147,483,647个条目(不是真正需要的)

  • 字符串的UTF-8编码字节长度(包括引号)小于其指定索引的位数

显然,如果数据集只包含几个不同的大字符串,则可以实现最大的节省。例如,包含枚举值的属性可能就是这种情况。在数据集中使用某个字符串的频率越高,使用共享字符串表可以节省的空间就越多。相反,如果编码特征集中的每个字符串只使用一次(例如,包含随机或类似UUID的字符串的属性),将不会实现节省(事实上,在这种情况下使用共享字符串表将产生更大的结果)。

定制每个请求的共享字符串

默认情况下,当前实现将添加 all 共享字符串表的JSON字符串编码属性。(除了时态值,如日期和时间戳,在JSON中从技术上讲,它们也是字符串。然而,我们预计时间值不会有太多冗余。)与 format_options 参数,可以指定哪些属性可以在共享字符串表中存储值,或者完全跳过创建这样的表。

支持的格式选项为:

  • sharedstrings (默认为 * )-指定 false 或留空(例如, format_options=sharedstrings: )跳过共享字符串表的生成,或 true* 创建一个包含所有JSON字符串编码属性的表(这是默认行为)。或者,逗号分隔的属性名称列表可以指定可以将其值存储在共享字符串表中的属性集。

属性指定逗号分隔的属性名列表时 sharedstrings 格式选项,则适用以下附加规则:

  • 属性名称中的逗号(真的吗?)可以使用反斜杠字符进行转义 \

  • 前缀 re: 可以预先添加到列表中,以便将每个项目指定为 Java Regular Expression :(例如, format_options=sharedstrings:re:adm_.*,\d\d_[a-z]+$ )。请参阅Java Pattern 班级。

    指定无效的正则表达式会导致服务异常。

  • 前缀 glob: 可以预先添加到列表中,以便将每个项目指定为 glob pattern :(例如, format_options=sharedstrings:glob:adm_*,[0-9][0-9]_*name )。看见 glob 模式。

    指定无效的全局模式会导致服务异常。

尽管SpatialJSON共享字符串表功能运行良好,并且通常在其默认配置中为任意数据集保存中等数量的字节,但这不需要指定 sharedstrings 格式选项,此参数为字符串表创建过程的高级微调提供了可靠的句柄。