使用 JMESPath 过滤 geoJSON 数据不起作用

filtering geoJSON data using JMESPath not working

我正在尝试从如下所示的 geoJSON 数据结构中过滤一些数据:

 "features": [
 {
      "type": "Feature",
      "properties": {
        "@id": "node/7071544593",
        "addr:city": "Joensuu",
        "addr:housenumber": "12",
        "addr:postcode": "80100",
        "addr:street": "Siltakatu",
        "addr:unit": "C 33",
        "alt_name": "Crasman Oy Joensuu",
        "alt_name_1": "Crasman Oy",
        "name": "Crasman Joensuu",
        "short_name": "Crasman",
        "website": "https://www.crasman.fi"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          29.7621398,
          62.6015236
        ]
      },
      "id": "node/7071544593"
    },
    {
      "type": "Feature",
      "properties": {
        "@id": "node/7117872562",
        "amenity": "car_rental",
        "operator": "avis"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          29.7630643,
          62.6036656
        ]
      },
      "id": "node/7117872562"
    }
]

我想做的是遍历这个特征数组,查看属性对象以检查它是否包含网站,如果是,那么我可以从几何对象打印它的坐标。 这是我试过的:

Features[*].properties[?contains(@,'website')=='true'].geometry.coordinates

它给了我空值

试试这个:

features[?contains(keys(properties),'website')].geometry.coordinates

例如:

$ jp "features[?contains(keys(properties),'website')].geometry.coordinates" <input.json
[
  [
    29.7621398,
    62.6015236
  ]
]

关于您的示例为何不起作用:

  • 标识符区分大小写,因此您需要 features,而不是 Features
  • properties 是对象,不是数组,因此不能对其应用过滤器表达式。
  • 即使可以,您也不想 properties 过滤。您正在尝试过滤整个 features.
  • contains 测试数组是否包含项目(或者字符串是否包含子字符串),而不是对象是否具有键。您可以使用 keys() 获取数组中对象的键。
  • 你不需要比较contains()true的结果,它已经是一个布尔值。
  • 即使您尝试与 true 进行比较,您也需要使用反引号:`true`,而不是引号 'true'.