2016-02-12 6 views
6

Sto utilizzando il pacchetto opuscolo in R per generare una mappa con un numero elevato di cerchi. L'obiettivo è una mappa che posso pubblicare sul mio sito web. Il problema che sto avendo è che aumentando il numero di cerchi, la mappa risultante viene caricata molto lentamente, ricevo avvisi di "script non rispondente" e alla fine congela completamente il mio browser.Come si crea una mappa del volantino con migliaia di segni che non bloccano il browser?

So che questo genere di cose è possibile, perché ho trovato una mappa volantino che funziona come voglio la mia a lavorare:

http://cartologic.com/geoapps/map_viewer/5/ny-crimes-2014-dot-density-map

ho notato sulla mappa qui sopra che i cerchi don sembra "cliccabile" come i cerchi sulla mia mappa e sembra che vengano caricati in blocchi quadrati. Ho la sensazione che queste cose siano legate al mio problema. Sfortunatamente, sono troppo novizio su volantini/javascript per capirlo da solo.

Ecco un esempio giocattolo che illustra il mio problema:

library("leaflet") 
library("htmlwidgets") 

dots <- data.frame(x=c(runif(10000, -93.701281, -93.533053)), 
        y=c(runif(10000, 41.515962, 41.644369))) 

m <- leaflet(dots) %>% 
    addTiles('http://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png') %>% 
    setView(-93.617167, 41.580166, zoom = 12) %>% 
    addCircles(~x, ~y, weight = 1, radius = 5, 
      color = "#FFA500", stroke = TRUE, fillOpacity = 0.1) 

m 

saveWidget(widget = m, file="example.html", selfcontained = TRUE) 
+0

cluster è una buona opzione (https://rstudio.github.io/leaflet/markers.html). Il tuo esempio funziona molto bene! Di quanti punti stai parlando? – MLavoie

+0

@ MLavoie Grazie per il suggerimento. Ho sbagliato le opzioni del cluster e non sono riuscito a ottenere le prestazioni che volevo. Il mio esempio funziona bene a seconda della macchina che utilizzo. Ma aumentando il numero di punti e alla fine raggiungerai un limite. Sto cercando qualcosa di molto più scalabile per realizzare mappe a grande densità di punti. – DWal

risposta

0

Se si desidera aggiungere un gran numero di oggetti vettoriali a una mappa, è raro che può essere fatto facilmente.

Si noti che i dati raster sono suddivisi in riquadri in modo che non sia necessario visualizzare tutte le informazioni contemporaneamente. Per i tuoi dati vettoriali (in questo caso cerchi) devi fare la stessa cosa.

Fondamentalmente quello che mi piace fare è rompere il set di dati di grandi dimensioni in piastrelle più piccole (vettoriali), con gli stessi confini delle tessere raster che si stanno mostrando. Duplica i dati se vuoi che appaia a più livelli di zoom. Mentre mostri il cerchio, immagina di dividere i punti centrali dei cerchi sul bordo della tessera.

Ho un'applicazione simile a questa in cui sostanzialmente partiziono i dati vettoriali sui contorni delle tile e memorizzo le informazioni nei file geojson. Quando ottengo un evento in cui è stata caricata la tessera raster, posso quindi caricare il file vettoriale equivalente come layer geojson (stessa cosa quando il tile raster viene scaricato). In questo modo, puoi limitare la quantità di dati vettoriali che devono essere visualizzati in qualsiasi momento.

Se hai molti punti, non saranno comunque visibili a bassi livelli di zoom, quindi potrebbe essere meglio mostrarli a un livello di zoom appropriato (magari con una rappresentazione diversa a bassi livelli di zoom) come una mappa di calore). Ciò manterrà la quantità di dati mostrati in qualsiasi momento inferiore.

2

mapview può aiutarti qui. Si basa sulla libreria di volantini per set di dati più piccoli, ma usa una speciale funzionalità javascript per dati più grandi.

il tuo esempio con 1 milione. Punti:

library(mapview) 
library(sp) 

dots <- data.frame(x=c(runif(1000000, -93.701281, -93.533053)), 
        y=c(runif(1000000, 41.515962, 41.644369))) 

coordinates(dots) <- ~ x + y 
proj4string(dots) <- "+init=epsg:4326" 

mapview(dots) 

Può ancora prendere un po 'per il rendering, ma una volta reso dovrebbe essere abbastanza reattivo. Nota che mapview è progettato per funzionare con oggetti spaziali *, ecco perché abbiamo bisogno delle chiamate per impostare lo slot delle coordinate e la proiezione.

Per ulteriori informazioni dare un'occhiata qui:

http://environmentalinformatics-marburg.github.io/web-presentations/20150723_mapView.html

Speranza che aiuta.

+0

con la versione mapview_1.0.0 i tuoi punti non vengono visualizzati sulla mappa (anche dopo pochi minuti). La mappa è a posto, ma vuota. Qualsiasi motivo che possa spiegare questo comportamento – MLavoie

+0

@MLavoie nell'esempio precedente con 1 milione. i punti funzionano bene per me con la versione 1.0.0. Se stai provando qualcos'altro, che ne dici di un esempio riproducibile? – TimSalabim

+0

Sto usando esattamente lo stesso esempio e tutto quello che ho è una mappa di Des Moines e la mappa non è a schermo intero (~ 90% del monitor) sul mio laptop. viene caricato anche leaflet_1.0.1.9002. – MLavoie

0

Dal momento che questa domanda ha alcune revisioni, io generalmente descrivono entrambe le soluzioni che ho trovato. Forse se avrò tempo più tardi raccoglierò tutti i file su GitHub.

In primo luogo, ho trovato TileMill. È sufficiente caricare un file di dati di coordinate in TileMill, disegnare nello stesso modo in cui si desidera visualizzarli e visualizzare i riquadri (png). Ospita quelle tessere sul web da qualche parte e caricale con un volantino. Questo processo è stato un po 'troppo manuale per i miei gusti perché TileMill continuava a bloccarsi quando l'ho caricato in file CSV che erano troppo grandi per essere visualizzati sulla mia macchina.

Ho trovato che la soluzione migliore era utilizzare Elaborazione, adattando il codice di Robert Manduca qui: https://github.com/rmanduca/jobmaps. Non uso Python, quindi ho riscritto quelle parti in R e modificato il codice di elaborazione in base alle mie specifiche.