Schlagwort-Archive: YQL

Geodaten auf Karte einzeichnen


Wenn man Daten visualisieren will, geht es sehr oft darum Geodaten zu verarbeiten und zu modifizieren.

Die Geodaten holen wir uns über die YQL aus Placemarker. Die Koordinaten liegen dann in Form von 2 floats (Breiten– und Längengrad) vor.

Beim Zeichnen der Koordinaten auf einer (Welt-) Karte ergibt sich zunächst das Problem, dass man eine Kugeloberfläche nicht verzerrungsfrei auf einer ebenen Fläche abbilden kann. Es gibt sehr viele verschiedene Möglichkeiten, wie man mit dem Problem umgehen kann. Einen guten Überblick liefert diese Seite.

Ich habe mich für die (meiner Meinung nach) einfachsten Möglichkeit der Plate Carrée („plane square“ oder Plattkarte) Projektion entschieden.

Hier kann man die Längen- und Breitenkoordinaten direkt in x- und y Koordinaten umrechnen.

float x = map(longitude, -180, 180, 0, width);
float y = map(latitude, 90, -90, 0, height);
Mehr Info zur „Plattkarte“ gibt es auf Wikipedia.

Für diese Projekton hat Till Nagel eine eigene Placemarker-Klasse geschrieben, die ich für mein Projekt leicht verändert habe.

class PlaceMarker {

String name;
float lat;
float lng;

PlaceMarker(String name, float lat, float lng) {
this.name = name;
this.lat = lat;
this.lng = lng;
}

float getX() {
return map(lng, -180, 180, 0, width);
}

float getY() {
return map(lat, 90, -90, 0, height);
}

void display(int results) {

// Equirectangular projection
float x = map(lng, -180, 180, 0, width);
float y = map(lat, 90, -90, 0, height);
}

String toString() {
return name + " (" + lat + ", " + lng + ")";
}
}

Geodaten und mehr mit Yahoo Query Language


Das wollten wir doch immer schon. Geodaten mit beliebigen Suchbegriffen verbinden und noch vieles mehr. Ein Service von Yahoo, nämlich die YQL (Yahoo Query Language) macht es möglich. Es handelt sich dabei um eine an die Syntax von SQL angelehnte Abfragesprache, die mittlerweile sehr vielen Datenbanken abfragen durchführen kann. Eine gute englischsprachige Erklärung zur YQL gibt es von Till Nagel.

Wir nutzen die YQL, um Ortskoordinaten abzufragen. Ein Account bei Yahoo ist dafür nicht einmal nötig.

Info über Datenbanken und eine Abfragekonsole zum Testen der Anfragen gibt es unter: http://developer.yahoo.com/yql/console/

Dort findet man unter den Beispielabfragen:

select * from geo.places where text=“vienna“

Als Antwort auf die Anfrage bekommt man folgende XML Datei:
Sie enhält im Tag centroid die gewünschten Daten, nämlich den mit latitude getagden Breitengrad und den mit longitude getagden Längengrad.

Diese wollen wir nun mit Processing auslesen. Dafür verwenden wir das Processing Objekt XMLElement (ab Processing 2.0 nur noch XML).

Folgende Processing Funktion gibt uns Längen- und Breitengrad zu einem gesuchten Ort zurück.

XMLElement xmlResponse;

void getLoc(String loc) {

// Da die Daten aus Twitter stammen, enthalten sie teilweise Leerzeichen und Beistriche, ersetzt werden müssen,
//um keine Fehlermeldung zu provozieren.
loc=loc.replace(' ', '_');
loc=loc.replace(",", "%2C");
println ("loc: "+loc);

//Es ist nicht sicher, dass der Ortsname auch tatsächlich existiert. Dann würde das Programm abbrechen.
// Um das zu vermeiden wird hier ein try catch Block verwendet.
try {

//Abfrage
String restUrl="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20geo.places%20where%20text%3D%22"+loc+"%22&diagnostics=true";

//Abfangen der Antwort
xmlResponse = new XMLElement(this, restUrl);

//Analyse der Antwort
XMLElement[] placeXMLElements = xmlResponse.getChildren("results/place");
// println("Found " + placeXMLElements.length + " places");
if (placeXMLElements.length>0) {
String name = placeXMLElements[0].getChild(2).getContent();

//Auslesen der Geodaten
float lat = new Float(placeXMLElements[0].getChild(10).getChild(0).getContent());
float lng = new Float(placeXMLElements[0].getChild(10).getChild(1).getContent());
}
}
catch (NullPointerException e) {
println("Couldn't launch request: " + e);
};
}

Link zum Placemarker Projekt: http://developer.yahoo.com/geo/placemaker/