2009-04-30 14 views
7

Dopo aver sperimentato l'approccio client per il clustering di un gran numero di marcatori Google, ho deciso che non sarebbe stato possibile per il mio progetto (social network con oltre 28.000 utenti).Server Side Clustering Markers Google - Python/Django

Esistono esempi di clustering delle coordinate sul lato server, preferibilmente in Python/Django?

Il modo in cui vorrei che questo funzioni è di indicizzare gradualmente i marker in base alla loro prossimità (raggio) e livello di zoom.

In altre parole, quando un nuovo utente si registra, viene automaticamente assegnato a un determinato "gruppo" di marker vicini tra loro, aumentando così il contatore del "gruppo". Quello che viene inviato al server è solo un piccolo numero di "gruppi". Solo quando il livello di zoom/scala della mappa è 1: 1 - gli utenti effettivi vengono visualizzati sulla mappa.

In questo modo il lato client dovrà occuparsi solo di 10-50 marker per richiesta/livello di zoom.

risposta

-5

ho scritto un post sul mio approccio utilizzando Python e Django qui:

http://www.quanative.com/2010/01/01/server-side-marker-clustering-for-google-maps-with-python/

+2

Sembra che il link sia ora rotto. Modifica la risposta per correggere il collegamento o rimuoverlo, nonché riassumere le informazioni nel link. Se dovesse rompersi di nuovo, questa risposta continuerà ad essere utile. –

+0

collegamento non funzionante :( – nivcaner

+0

Dominio scaduto, non mi interessa l'arte nativa americana – twig

0

Un modo per farlo sarebbe definire una griglia con una dimensione unitaria in base al livello di zoom. Quindi raccogli tutti gli oggetti all'interno di una griglia di lat, lon con una cifra decimale. Un esempio è 42.2x73.4. Quindi un punto al 42.2003x73.4021 cade in quella cella della griglia. Quella cella è delimitata da 42.2x73.3 e 42.2x73.5.

Se vi sono uno o più punti in una cella della griglia, si posiziona un marcatore al centro di tale griglia.

Quindi collegare l'evento zoomend e modificare di conseguenza la dimensione della griglia e ridisegnare i marker.

http://code.google.com/apis/maps/documentation/reference.html#GMap2.zoomend

+0

Non sarebbe lento quando l'intera mappa deve essere visibile e hai 30k di indicatori da caricare? – Franek

2

This è un servizio a pagamento che utilizza il clustering di server-side, ma non sono sicuro di come funziona. Immagino che utilizzino i tuoi dati solo per generare i marker da mostrare a ogni livello di zoom.

Aggiornamento:This tutorial dimostra una funzione di clustering lato server di base. È scritto in PHP per l'API di mappe statiche, ma potresti usarlo come punto di partenza.

+0

Conosco il loro servizio ma voglio avere il pieno controllo del codice. – Franek

+0

il tutorial è utile ma l'algoritmo potrebbe essere troppo lento per 28.000 punti. il clustering basato su una griglia è maldestro ma molto più veloce ovviamente. – Tom

+0

@ Tom - un algoritmo del genere sarebbe decisamente troppo lento sul lato client, ma penso che potrebbe essere possibile sul lato server. –

0

Si potrebbe semplicemente eliminare i decimali in base al livello di zoom. questo funzionerebbe per te?

I nostri indici geografici sono basati sui numeri di morton: http://www.rooftopsolutions.nl/article/231 (auto promozione spudorata).

Se si desidera una maggiore precisione rispetto al sistema 10-base, il numero di Morton vi permetterà di aumentare il livello di zoom su un sistema numerico 2-base, semplicemente facendo qualcosa di simile:

GROUP BY (Morton XOR (-precisione))

Maggiore è la precisione, più elementi saranno raggruppati.

0

Sto utilizzando Django e Python per raggruppare immobili e annunci di noleggio, e la fonte può essere trovata here.

Spero che aiuti!

1

Si potrebbe voler dare un'occhiata alle DBSCAN e OPTICS pagine su wikipedia, questi sguardi molto adatto per i luoghi di clustering su una mappa C'è anche una pagina su Cluster Analysis che mostra tutti i possibili algoritmi che puoi usare, la maggior parte sarebbe banale da implementare usando la lingua che preferisci.

Con 28k + punti, si potrebbe voler saltare django e saltare direttamente in C/C++, e sicuramente non aspettarsi che questo venga calcolato in tempo reale in risposta alle richieste web.

Problemi correlati