我有一个几乎但不太正确的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管道,但我还没有能够弄清楚如何将它与正确的格式纠缠在一起。
答案 0 :(得分:1)
很多人会建议写“jq ... FILE”而不是'cat FILE | jq ...'
您不需要初始'。 |'
以下是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"
}
}
]
}