Skip to content

Verwendung der JSONReader

Jan Tagscherer edited this page Jan 3, 2016 · 1 revision

API der JSON-Reader

Die JSON-Reader können Städte, Flüge, Tweets, Niederschlags-, Temperatur-, Wind- und Wolkenbedeckungsdaten aus entsprechenden JSON-Dateien lesen. Deren API ist folgendermaßen zu verwenden.

Erstellung eines neuen Readers

Ein neuer Reader für eine Datei wird mittels der JSONReaderFactory erstellt:

JsonReader jsonReader = JsonReaderFactory::createReader(QString filename);

Ausgabe von VTK-Daten

Mittels eines Readers können die Daten als vtkPolyData ausgegeben werden:

vtkSmartPointer<vtkPolyData> polyData = jsonReader.getVtkDataSet(int zoomLevel);

Verwendung der Daten

Koordinaten

Die Koordinaten der Punkte befinden sich direkt im vtkPolyData-Objekt. Auf sie kann folgendermaßen zugegriffen werden:

double pointCoordinates[3];
polyData->GetPoint(int index, pointCoordinates); // Values copied into double array

Skalare

Die eigentlichen Daten für die jeweiligen Punkte befinden sich in sogenannten Data-Arrays im vtkPolyData-Objekt. Diese können folgendermaßen verwendet werden. Dafür muss der Name des jeweiligen Arrays bekannt sein. Dieser ergibt sich aus dem Name des Attributs wie hier beschrieben mit einem angehängten s. Beispielsweise ist der Array-Name für Niederschlagsraten precipitationRates.

Zusätzlich existiert in jedem Datensatz das Array priorities mit den Zoomleveln jedes Punkts und in jedem temporalen Datensatz das Array timestamps.

String-Array

vtkSmartPointer<vtkStringArray> stringArray = vtkStringArray::SafeDownCast(
  polyData->GetPointData()->GetAbstractArray(std::string arrayName)
);

stringArray->GetNumberOfValues(); // Number of entries in the array
stringArray->GetValue(int index); // Get a stored string value

32-Bit-Float-Array

vtkSmartPointer<vtkTypeFloat32Array> floatArray = vtkTypeFloat32Array::SafeDownCast(
  polyData->GetPointData()->GetArray(std::string arrayName)
);

floatArray->GetNumberOfComponents(); // Number of entries in the array
floatArray->GetValue(int index); // Get a stored float value

32-Bit-Integer-Array

32-Bit-Integer-Arrays werden hauptsächlich für Timestamps und Zoomlevel verwendet.

vtkSmartPointer<vtkTypeInt32Array> integerArray = vtkTypeInt32Array::SafeDownCast(
  polyData->GetPointData()->GetArray(std::string arrayName)
);

integerArray->GetNumberOfComponents(); // Number of entries in the array
integerArray->GetValue(int index); // Get a stored integer value

Ausnahme: Flugdaten

Flugdaten haben zwei Besonderheiten: Das Array mit den Zielkoordinaten hat den Name destinations. Außerdem sind diese jeweils in Zweier-Tupeln mit Längen- und Breitengrad abgespeichert. Auf diese kann folgendermaßen zugegriffen werden:

vtkSmartPointer<vtkTypeFloat32Array> destinations = vtkTypeFloat32Array::SafeDownCast(
  polyData->GetPointData()->GetArray("destinations")
);

destinations->GetNumberOfComponents(); // Number of entries in the array
destinations->GetTuple2(int index)[0]; // Latitude of the stored destination
destinations->GetTuple2(int index)[1]; // Longitude of the stored destination