更大的jq表达式中的条件,将输入转换为有效的geojson

时间:2017-03-15 14:44:34

标签: geojson jq

我有一个几乎但不太正确的JSON输入geojson,我尝试使用jq将其转换为正确的格式。我的输入是使用自定义几何类型" Path"在某些项目上,在这些项目的坐标内,它存储了一些额外的数据(用于渲染到SVG的线条曲线数据)。我不想删除这些数据,因此我的目标是更改所有类型的几何项目" Path"进入" LineString",并将这些项目中的额外坐标删除为"属性"对象(在几何项上)保存数据。

以下是输入的一个小例子:

{
  "type": "FeatureCollection",
  "features": [
    {
      "id": 16683828,
      "properties": {
        "facility": "hallway"
      },
      "type": "Feature",
      "geometry": {
        "type": "Path",
        "coordinates": [
          [
            0,
            379.64,
            289.412
          ],
          [
            3,
            379.629,
            289.768,
            379.346,
            290.059,
            378.986,
            290.066
          ],
          [
            1,
            373.156,
            290.066
          ],
          [
            1,
            373.156,
            298.5
          ],
          [
            1,
            373.156,
            299.469
          ],
          [
            4
          ]
        ]
      }
    }
  ]
}

这里大概是我要将其转化为:

{
  "type": "FeatureCollection",
  "features": [
    {
      "properties": {
        "facility": "hallway",
        "id": 16683828
      },
      "type": "Feature",
      "geometry": {
        "type": "LineString",
        "properties": {
          "curves": [
            {
              "coordinate_position": 1,
              "control_points": [379.629, 289.768, 379.346, 290.059]
            }
          ]
        },
        "coordinates": [
          [
            379.64,
            289.412
          ],
          [
            378.986,
            290.066
          ],
          [
            373.156,
            290.066
          ],
          [
            373.156,
            298.5
          ],
          [
            373.156,
            299.469
          ]
        ]
      }
    }
  ]
}

绊倒我的部分是在更大的jq格式表达式中使用条件。对于每个功能,我都会尝试检查geometry.type ==" Path",如果是这样,请从每个坐标中删除第一个项目(我不需要它),以及然后将除坐标中最后两个项之外的所有项移动到properties.curves数组中的一个对象中,注意"坐标中的位置"数组和额外数据。如果geometry.type!=" Path",我只想将几何项目复制到我的输出中。

这是我到目前为止的脚本,包括从geometry: {开始的错误条件逻辑:

cat input.json | jq '. | 
{
    type: .type,
    features: [
        .features[] | {
            type: .type,
            properties: {
                display_name: .properties.display_name,
                id: .id
            }
            geometry: {
                if .geometry.type == "Path" then
                    type: "LineString"
                else
                    type: .geometry.type
                end
            }
        }
    ]
}'

当然,这里不起作用的是直接在对象内部的条件。我最好的猜测是我需要使用更多的jq管道,但我还没有能够弄清楚如何将它与正确的格式纠缠在一起。

1 个答案:

答案 0 :(得分:1)

  1. 很多人会建议写“jq ... FILE”而不是'cat FILE | jq ...'

  2. 您不需要初始'。 |'

  3. 以下是jq过滤器的变体,它产生如下所示的结果:

  4. {
        type: .type,
        features: [
            .features[] | {
                type: .type,
                properties: {
                    display_name: .properties.facility,
                    id: .id
                },
                geometry: {
                    type: (if .geometry.type == "Path" then "LineString"
                           else .geometry.type
                           end)
                }
            }
        ]
    }
    

    输出:

    {
      "type": "FeatureCollection",
      "features": [
        {
          "type": "Feature",
          "properties": {
            "display_name": "hallway",
            "id": 16683828
          },
          "geometry": {
            "type": "LineString"
          }
        }
      ]
    }