Alternative OpenLayers che supportano più funzionalità lato client [chiuso]


14

Sto prendendo in considerazione architetture diverse per un sistema che utilizzerà idealmente il rendering lato client per le funzionalità di punta e deve essere privo di plug-in. Ho usato questa applicazione sviluppata in risposta a questa domanda per testare il mio laptop (che è abbastanza capace - quad-core 2.6 ghz cpu, 4 gb di memoria, non sotto nessun altro carico, Firefox 8) con diversi numeri di punti in OpenLayers e è notevolmente in ritardo a 500 e inizia a lottare per oltre 1.000. Le funzioni generate casualmente non sembrano avere gestori di eventi e usano tutti la stessa simbologia.

Mi aspetto di mostrare fino a 1.000 funzionalità, con un massimo di 10 simboli diversi, tutti con gestori click e mouse-over e su piattaforme meno capaci.

Speravo in migliori prestazioni sul lato client, soprattutto dopo aver visto questo esempio di GIS Cloud : so che funziona in modo diverso (tela HTML5 vs. SVG) ma la differenza nelle prestazioni è davvero notevole.

Le mie domande chiave (se saresti così gentile) sono:

  1. L'applicazione generatrice di punti casuali è rappresentativa delle prestazioni in altre applicazioni OpenLayer che hai scritto / utilizzato?
  2. Esiste un'API di mappatura Web alternativa comprovata e gratuita che supporti i servizi WMS (che devo utilizzare) ed è più veloce con le funzionalità lato client, senza utilizzare Flash / Silverlight / altri plug-in?
  3. Qualche altro suggerimento su cosa dovrei indagare?

Affidarsi principalmente al rendering sul lato server è un'opzione, ma sia io che il client vorremmo evitarlo a causa delle preoccupazioni sul ridimensionamento dei numeri degli utenti e sulla reattività dell'interfaccia utente.


Sul mio desktop dual core di 5 anni, RAM da 3 GB che utilizza quell'app su Firefox 8 (durante il download di una ISO distro Linux da 1 GB), 1.000 punti disegnano praticamente all'istante, senza difficoltà ... 10.000 impiegano circa 1,5 secondi.
user2856

@LukePinner è che basta disegnare rapidamente * e fare una panoramica / zoom uniformemente? Il recupero dei dati e il disegno delle funzionalità va bene anche per me, ma è l'interazione della mappa il problema.
tomfumb

Ho appena provato la tua app sul mio ipad2 e ha gestito ben 1000 punti. Con 10K punti ci vogliono un paio di secondi per eseguire il rendering inizialmente, ma poi fa abbastanza bene. Se lo desideri, puoi sempre sottoclassare la classe di livelli OL Vector e implementarne una personalizzata. Posso indicarti un esempio.
unicoletti,

Sì, nessun problema panning / zoom. 1K punti rallenta un po 'sul mio netbook Atom da 1,6 Ghz :)
user2856

Risposte:


23

La risposta alla prima domanda è . Stai usando OL con una configurazione praticamente comune. Ci sono trucchi che puoi usare per migliorare le prestazioni, ci penserò più avanti.

La risposta alla domanda 2 è forse (soprattutto per quanto riguarda la solidità). Puoi cercare in questo sito un elenco di alternative (una che mi viene in mente in questo momento è Leaflet ).

Risposta alla domanda 3: iniziare con la misurazione:

Ho modificato una copia locale dell'app in modo che il renderer sia esplicitamente specificato nell'elenco delle opzioni per il livello Vector. Durante i test avrei omesso il renderer di Canvas e quindi ricaricato la pagina dell'esperimento con un altro:

var pts = new OpenLayers.Layer.Vector("Points", {renderers: ["Canvas", "SVG", "VML"]});

Ho aggiunto un timer alla funzione di ridisegno in modo che stampi quanto tempo ha impiegato a disegnare :

function redraw() {
var start = (new Date).getTime();
[...]
var diff = (new Date).getTime() - start;
console.log("redraw completed in "+diff+"ms");

Successivamente ho provato diverse esecuzioni sia su Chrome 17 che su Firefox 8.0.1 su OSX SL disegnando le funzionalità 1000 e 5000. Con mia sorpresa, il renderer SVG è in media il 20% più veloce del renderer Canvas! (Nota: su Windows js il tempo non è preciso come in OSX, quindi i risultati potrebbero essere meno coerenti).

Questo e il tuo dirlo

è l'interazione della mappa che è il problema

, IMHO, ci dice che l'hotspot è nella gestione vettoriale delle funzionalità. Mentre lavoravo su una mia app, di recente ho dato un'occhiata a questo e ho deciso di sottoclassarlo e quindi liberarlo da tutto il codice complicato che non serve a nulla per semplici punti. Devo ammettere che sono diventato abbastanza selvaggio e ho persino rimosso la dipendenza da OpenLayers.Geometry.Point e la mia versione ora funziona su semplici oggetti js con attributi x, y.

Le opzioni sono, in ordine decrescente di beneficio / costo:

La prima opzione è quella di filtrare i punti visibili sul lato server configurando un'opzione di strategia sul livello vettoriale come il seguente:

 strategies: [new OpenLayers.Strategy.Refresh({force:true}), new OpenLayers.Strategy.BBOX({ratio:2, resFactor: 3})],

In questo modo, quando si ingrandisce il numero di funzioni disegnate sul lato client, si limiterà a quelle visibili in quella misura, invece di tutte.

Come seconda opzione potresti prendere in considerazione la possibilità di scrivere un vettore / rendering personalizzato . Un esempio di implementazione personalizzata, ridotta e più veloce è disponibile sulla mia pagina github qui . Sebbene non sia adatto a tutti gli usi, dovrebbe essere sufficiente per dare un'idea approssimativa di ciò che sto suggerendo.

La terza opzione per quando l'utente è completamente ridotto è l'implementazione di un qualche tipo di clustering lato server in modo che i punti di chiusura vengano uniti in uno solo, riducendo di nuovo il numero di funzionalità disegnate.


Mille grazie per la risposta dettagliata e approfondita. Molto probabilmente guarderò al clustering lato server, si spera in combinazione con una strategia di memorizzazione nella cache in modo che l'operazione avvenga solo quando necessario. Una delle opzioni per il lato server è MapGuide, quindi l'approccio per il recupero e il raggruppamento dei punti potrebbe essere totalmente personalizzato. Mi divertirò anche con le opzioni di rendering per vedere che differenza fa.
tomfumb

1
Ho aggiunto un link a un esempio vettoriale / canvas rendere che uso in un mio proj.
unicoletti,

Wow, l'esempio messo a nudo fa una differenza enorme, è davvero impressionante. Sono passato dalle
lotte

Ho modificato il primo esempio (swingley.appspot.com) per utilizzare il renderer OL Canvas e un riempimento solido per i punti, e le prestazioni di zoom e panoramica sono in realtà molto simili a TagCanvas e TagVector. Ho anche implementato nuovamente la funzionalità di hit test che hai rimosso nelle tue modifiche in modo da poter testare le prestazioni comparative: l'approccio Tag * è stato quasi del 20% più veloce nell'identificare quale caratteristica è stata colpita (su 5000). Dato lo sforzo significativo nella scrittura / aggiornamento delle classi personalizzate e prestazioni simili (nei miei test), penso che vedrò cosa può fare OL vaniglia
tomfumb

Questo perché hit-test ridisegna tutte le funzionalità in un'altra tela, quindi vengono disegnate due volte con ogni aggiornamento.
unicoletti,

0

Usando UTFGrid e TileMill puoi visualizzare punti illimitati con prestazioni piuttosto buone. La visualizzazione di n punti casuali è una specie di esempio inventato che non funzionerebbe in quella situazione o con GISCloud o qualsiasi magia simile, tuttavia - poiché gli hack di prestazioni vettoriali di solito richiedono la conoscenza dell'intero set di dati e alcune pre-elaborazioni: sia TileMill che GISCloud fanno molta piastrellatura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.