You are not logged in.

  • Login

1

Friday, May 28th 2010, 5:34pm

Karte mit Ballung der Benutzer zeigen

Hallo,

ich würde in einem Projekt gern folgendes realisieren:
Es werden statistische Daten von Nutzern gesammelt, hauptsächlich IP, Land, Region. Diese Daten sollen einmal stündlich genutzt werden, um eine Karte zu rendern, auf der die Verteilung der Nutzer sichtbar wird. Nehmen wir an, 10 Benutzer aus Berlin, 5 aus Hamburg, 2 aus München. Dann soll eine Karte zu sehen sein, auf der in Berlin die größte Menge (z.B. als großer Punkt) verzeichnet ist, in Hamburg die zweitgrößte Menge, in München die kleinste Menge.

Ich überlege nun, mit welcher Technologie ich das realisiere. Ich dachte an OpenStreetMap oder GoogleMaps. Die Karte soll lediglich den deutschsprachigen Raum zeigen. Die Mengen auf der Karte müssen nicht dynamisch (Hover-Effekt mit Anzeige der Menge) sein, wenn es dennoch geht, wehre ich mich natürlich nicht dagegen :) Programmiert wird in Ruby...

Hat jemand schon einmal ähnliches realisiert?

Edit: Ich sehe gerade, dass die Karte im Forum ähnlich gemacht ist. Wird die live generiert oder wird die Karte in gewissen Abständen gerendert? Welche Daten braucht die Google API dafür?

2

Friday, May 28th 2010, 8:08pm

Die Karte im Forum ist Teil des Gmap Plugins, das ich entwickelt habe.
Die Karte ist nicht performant - alles wird live berechnet und die Informationen werden gruppiert nach dem Location String (also Usereingabe) - nicht nach Koordinate.
Alles also eher suboptimal ;)

Willst du es clientseitig mit JavaScript gruppieren, machst du das sehr einfach mit dem Google Maps Marker Manager
Man kann es auch serverseitig Clustern - entweder direkt in MySQL oder mit anderen Tools: "Google Maps" cluster server
Zum serverseitigen Clustering habe ich auch mal ne kommerzielle Anwendung entwickelt, bin gerade auf dem Sprung, aber ich kann dir hier sicherlich noch mehr erzählen ;)

3

Friday, May 28th 2010, 8:35pm

Mir würde es vollkommen ausreichen, wenn ich servseitig clustere, dann einmal pro Stunde ein Bild rendere und das anzeige. Mehr brauche ich gar nicht. Ich werde mir das mal anschauen. Falls du mehr Zeit hast, erzähl ruhig mehr ;)

Danke schonma!

4

Saturday, May 29th 2010, 11:29am

Also auf jeden Fall solltest du alles erstmal in Koordinaten umrechnen.
Dazu gibts eine HTTP API von Google, der man einfach einen Suchstring wie "Berlin" als Parameter übergibt und man als Rückgabe eine Koordinate erhält.
Siehe dazu http://code.google.com/apis/maps/documentation/geocoding/

Danach musst du die Benutzer irgendwie clustern. Am einfachsten machst du das indem du einfach die Koordinate nach Kommastellen rundest:

SQL Code

1
... GROUP BY ROUND(coord, 0)


Aber den Punkt zeigst du natürlich Gleichzeitig im Mittel an:

SQL Code

1
SELECT AVG(coord), COUNT(userID) FROM ...


Je nach DBMS musst du das Query natürlich noch anpassen. MySQL hat eigene Geo Spatial Keys.

Wenn das Gruppieren durch Runden zu ungenau ist (schon blöd, wenn Koordinate 9.1 und 9.2 seperate Bubbles machen) musst du die Karte in richtige Cluster unterteilen.
Dazu würde ich aber empfehlen das in einer Scriptsprache zu machen.

5

Saturday, May 29th 2010, 12:18pm

Also umrechnen brauche ich dir nicht. Ich nutze die Maxmind GeoLiteCity DB (lokal installiert) um IPs zu tracen. Ich bekomme daraus schon folgende Daten

city: Wismar
latitude: 53.9000015258789
country_code: DE
longitude: 11.4666996002197
country_code3: DEU
country_name: Germany
region: "12"

Die clustere ich dann. Und wie genau bekomme ich die auf die Karte? Naja, ich probier das heut Abend mal...

Social bookmarks