Вега Простые геопоинты в Веге
Я пытаюсь понять, как работает 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"
}
}
}
]
Я не проверял это с вашими данными, но у меня есть нечто похожее, поэтому оно должно работать.
Удачи!