2013-03-14 26 views
5

Ho alcuni dati che vengono raccolti tramite un dispositivo GPS installato in un'automobile. Quindi i dati che ho sono praticamente sdraiati su/intorno alla strada/strada. Ogni coordinata ha un certo valore. Il formato dei dati è qualcosa di simile.100k o più marker su google maps senza cluster

lat   | long  | value 
--------------------------------- 
12.979155 | 77.644925 | 6 
--------------------------------- 
12.97916833 | 77.64493667 | 2 
--------------------------------- 
12.97917167 | 77.64492167 | 8 

Il mio compito è quello di tracciare questi lat a lungo su google map. Sembra un compito abbastanza facile quando parliamo di posizionare 10, 100 o 1000 marker. Ma come ho accennato sopra stiamo raccogliendo i dati per guida e la distanza tra due lat-long o due punti sarà in pochi piedi (diciamo 2-3 piedi).

Quindi alla fine del sondaggio, avrò 90-100k lat-long per una piccola parte di una città e potrei arrivare a un milione per un'intera città.

Ho provato ad aggiungere 9-10k marker e il relativo woking fine ma quando sto provando a caricare 40k, 50k, 60k, il mio browser è molto lento e questo è il messaggio di errore con cui sto finendo.

Uncaught RangeError: Maximum call stack size exceeded  main.js:1 

Sono stato googling molto su di esso, ma io non sono in grado di trovare alcun esempio o tutorial che mi porterà a mettere 1 milione marcatore utilizzando tecnologie che conosco un po '. (Che è asp.net). Trovato questo esempio http://www.scribblemaps.com/markerComplex/ di Jonathan Wagner, ma non sono in grado di capirlo e implementarlo nel mio codice esistente che va così.

// Per recuperare lat-long dal server MSSQL.

function PushValues(ParameterID) { 
     a = ParameterID.slice(5); 
    var CityID = $('#ddlCity').val().split('|'); 
    $.ajax({ 
     type: "POST", 
     url: "index.aspx/PushLatLong", 
     data: "{CityID:'" + CityID[0] + "',OperatorID:'" + $('#ddlOperator').val() + "',ParameterID:'" + ParameterID.slice(4) + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, 
     cache: false, 
     success: function (response) { 
      GooglePlaces = response.d.split('#'); 
      if (GooglePlaces != "Blank") { 
       HasValues = 1; 
      } else { 
       HasValues = 0; 
      } 

     }, 
     Error: function (r) { 

     } 
    }); 
} 

// Inserisce valori in Google Map.

function PlaceValues() { 
    var options = { zoom: 3, center: new google.maps.LatLng(37.09, -95.71), mapTypeId: google.maps.MapTypeId.ROADMAP }; 
    var map = new google.maps.Map(document.getElementById('map'), options); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < GooglePlaces.length; i = i + 2) { 
     ltlg = new google.maps.LatLng(GooglePlaces[i], GooglePlaces[i + 1]); 
     var marker = new google.maps.Marker({ 
      position: ltlg, 
      map: map, 
      title: 'Place number', 
      icon: "img/GoogleIcons/" + legendfirstvalue[1] 
     }); 
     bounds.extend(ltlg); 
    } 
    map.fitBounds(bounds) 
    $('#DivLoadImage').hide(); 
} 

un'altra cosa che vorrei menzionare è che il colore del marcatore dipende dal valore di lat-lunga. Quindi avrò più marcatori di colore. Avrei potuto facilmente provare a clustare il marcatore ma, quindi non sarò in grado di vedere il colore del marcatore fino a quando non mi avvicinerò alla zona. Quindi non c'è modo che io possa usare Clustring.

Sono sicuro che ci saranno milioni di errori nel mio codice. Sono disposto a cambiare il mio approccio se necessario. Here è la demo dell'applicazione.

+0

http://coeindia.in/test/harry/index.html non funziona – Kiquenet

+0

Questo era un url dal mio vecchio sito Web dei datori di lavoro. Potrebbero aver fatto dei cambiamenti nelle directory. – Ravi

risposta

1

Il più vicino possibile ottenere (senza clustering) è utilizzare le tabelle di fusione per archiviare i dati e recuperarli da lì - che probabilmente è qualcosa di simile che il tuo esempio sta già utilizzando - e poiché il suo flash può renderli molto più velocemente rispetto al normale può realizzare.

Le tabelle di fusione stessa renderanno i marcatori sul lato server ai riquadri e li recupereranno.

L'API di Google Maps consente di eseguire il rendering i dati contenuti in Google Fusion Tables come uno strato su una mappa utilizzando l'oggetto FusionTablesLayer.

Esempio su di esso in this link.

Insieme Fusiontables che vorrei fare qualcosa di simile il rendering basato viewport che in pratica significa disegnando soltanto marcatori visibili a finestra - non proprio "la tecnica di clustering", ma molto utile quando si stanno prendendo in considerazione velocità di rendering.Per saperne di più su di loro google docs (fusiontables) e viewport marker management. La stessa pagina contiene anche un collegamento più dettagliato a Fusiontables api e tutorial.

Se alla fine si decide di creare un cluster sul lato server, occorre prepararsi a svolgere un'attività non semplice, ma se lo si fa, implementare qualcosa di simile al clustering basato sulla griglia. (Anche spiegato withing stessa pagina - dannatamente buoni collegamenti?)

anche notare che:

Solo i primi 100.000 righe di dati in una tabella sono mappati o inclusi nei risultati della query.

Per maggiori informazioni, see from here.

Cin cin.

+0

@Mauno V. Ho esaminato i dettagli che hai menzionato sopra. Ci sono alcune limitazioni con la tavola della fusione. Ci sono restrizioni nel recupero e caricamento dei dati più uno può memorizzare solo 250 mb di dati per utente. Non penso secondo i miei requisiti, sarà l'opzione giusta per me. – Ravi

+0

Beh, deve avere alcuni limiti ofc. Ma con il giusto design può funzionare .. Hai controllato o chiesto ottieni di più se lo acquisti per lavoro e paghi in contanti? Credo che Google abbia bisogno anche di guadagnare un po 'di soldi, così hanno stabilito dei limiti. :) –

0

La tabella Fusion è la soluzione ideale per i dati di grandi dimensioni. Queste tabelle possono essere visualizzate e modificate utilizzando GmapGIS.

Problemi correlati