2017-03-15 7 views
0

私はJSON入力がほぼ正しいgeojsonですが、正しい形式に変換するためにjqを使用しようとしています。私の入力は、いくつかのアイテムに "Path"というカスタムジオメトリタイプを使用しています。これらのアイテムの座標内には、余分なデータ(SVGにレンダリングするためのラインカーブデータ)が保存されています。私はこのデータをドロップしたくないので、 "Path"タイプのすべてのジオメトリアイテムを "LineString"に変更し、これらのアイテム内の余分な座標を "プロパティ"オブジェクト(ジオメトリアイテム)を使用してデータを保持します。内部の条件文を使用している私をトリップだ入力を有効なgeojsonに変換するための大きいjq式の中の条件

{ 
    "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 
      ] 
     ] 
     } 
    } 
    ] 
} 

一部:ここ

{ 
    "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 
      ] 
     ] 
     } 
    } 
    ] 
} 

私はにこれを変換したいのですがどのような大まかです:

ここで入力の小さな例です。より大きなjqフォーマット式。各機能について、geometry.type == "Path"であるかどうかを確認しようとしています。そうであれば、各座標から最初の項目を取り除き(必要ありません)、最後の2つの項目を除くすべての項目をpropertiesCurves配列内のオブジェクトへの座標、 "coordinates"配列内の位置と余分なデータを示します。 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
  1. 多くの人が、「cat FILE」の代わりに「jq ... FILE」と書くことをお勧めします。 jq ... '

  2. 「初期」は必要ありません。 | 'ここで

  3. は、以下のような結果を生成し、あなたのJQフィルタの変形である:

 

{ 
    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" 
     } 
    } 
    ] 
} 
関連する問題