Вега Простые геопоинты в Веге

Я пытаюсь понять, как работает Vega, пробуя что-то в его интеграции с Kibana. (используя 6.3).

Я хотел бы, во-первых, понять, как все работает, начав с показа простых географических точек на карте. Моя конечная цель - уметь рисовать фигуры и географические точки.

Я использую инструмент построения Vega Graph, предоставленный Kibana.

Как выглядят данные

{
  "_index": "myindex",
  "_type": "mytype",
  "_id": "some_data_id",
  "_version": 1,
  "_score": null,
  "_source": {
    // other fields ...
    "location": {
      "geoPosition": {
        "lon": -120.40713879154383,
        "lat": 34.930076722390865
      },
      "country": "country_name",
      "geoArea": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -120.4093517762316,
              34.92910658338185
            ],
            [
              -120.4049810371925,
              34.92909830256884
            ],
            [
              -120.4049258068561,
              34.93102254256107
            ],
            [
              -120.40934245466,
              34.9310551422129
            ],
            [
              -120.4093517762316,
              34.92910658338185
            ]
          ]
        ]
      }
    }
    // other fields ...
  }
}

Моя жалкая попытка

{
  "$schema": "https://vega.github.io/schema/vega/v3.0.json"
  "config": {
    "kibana": { "type": "map", "delayRepaint": false }
  }
  "data": [ 
    {
      "name": "points"
      "url": {
        "index": "myindex"
        "body": {
          "_source": ["location"]
          "query": {
            "match_all": {}
          }
        }
      }
      "format": { "type": "json", "property": "hits.hits" }
    }
  ]
  "transform": {
    "type": "geopoint"
    "fields": ["geoPosition.lat", "geoPosition.lon"]
  }
  "marks": [
    {
      "type": "symbol"
      "from": { data: "points" }
      "encode": {
        "update":{
          "x": { "field": "x" }
          "y": { "field": "y" }
        }
      }
    }
  ]
}

Текущий результат

  • Элемент списка
  • Карта показывает правильно
  • Точки, кажется, показывают, но в (0, 0) я думаю - Посмотрите в верхнем левом углу, синие точки должны быть геопоинт
    точки сверху слева

Мои дополнительные вопросы

  • Я не уверен, как правильно использовать Vega для отладки. Я смотрел на VEGA_DEBUG.view.getState(), VEGA_DEBUG.view._runtime а также VEGA_DEBUG.view.data('points') но я не могу правильно понять поток данных. Где я могу увидеть выходные данные преобразования, чтобы убедиться, что они "чистые"? В основном этот вопрос может быть how would you have debugged this simple issue

1 ответ

Вау, это старый вопрос... Vega/Elastic просто не поддерживается, так что обидно, что никто не мог добраться до этого раньше.

Шаг, который вы пропускаете, - это шаг, в котором вы переводите широту / долготу в координаты (x,y), которые Vega может использовать для карты.

Эта секция:

"transform": {
    "type": "geopoint"
    "fields": ["geoPosition.lat", "geoPosition.lon"]
}

Должно быть что-то вроде этого:

transform: [
    {
      from: points              // The name of your data object
      type: geopoint
      projection: projection
      fields: ["geoPosition.lat", "geoPosition.lon"]
    }
    {
      type: "formula", expr: "[datum.x, datum.y]", as: "center"
    }
    {
      type: "formula", expr: "{x:datum.center[0], y:datum.center[1]}", as: "centerDict"
    }
]

Это даст вам объект centerDict, представляющий объект [x, y], который Vega отобразит правильно. Это также добавит point.x а также point.y которые индивидуально представляют значения х и у.

Если у вас есть, что вы можете сделать это

"marks": [
    {
      "type": "symbol"
      "from": { data: "points" }
      "encode": {
        "update":{
          "x": "datum.x"
          "y": "datum.y"
        }
      }
    }
  ]

Я не проверял это с вашими данными, но у меня есть нечто похожее, поэтому оно должно работать.

Удачи!

Другие вопросы по тегам