2012-11-30 4 views
43

Le mie tessere devono aderire a specifiche specifiche?Utilizzo di tile immagine mappa personalizzati in LeafletJS?

Ho un file immagine di grandi dimensioni che vorrei trasformare in una mappa con LeafletJS. Sto per utilizzare la libreria di immagini Python per ridurla in tutte le varie tessere che mi servono.

Tuttavia, non riesco a trovare alcuna informazione sull'utilizzo di mappe personalizzate in Leaflet. Fornisco Leaflet con l'intervallo di informazioni X, Y, Z in qualche modo? Gli do le dimensioni in pixel di ogni piastrella? Lo capisce da solo?

Per porre la mia domanda in una domanda concisa: cosa devo fare per avere file di immagini che possono raddoppiare come riquadri di mappe con LeafletJS e cosa, se non altro, devo fare nel mio front-end sceneggiatura? (oltre l'ovvia specifica del mio URL personalizzato)

risposta

11

Stai cercando un TileLayer. In questo TileLayer, si dà l'URL per il to-be-recuperati immagini per opuscolo con un modello come questo:

http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png 

Quando si è al livello di zoom, x e y specificato, Volantino preleverà automaticamente le piastrelle sull'URL che hai dato.

A seconda dell'immagine che si desidera mostrare, la parte più grande del lavoro sarà comunque nella generazione delle tessere. Le piastrelle devono sempre avere una dimensione di 256x256 px e, se si utilizzano i geodati, la proiezione utilizzata è la proiezione di Mercator. Potrebbe essere necessario del tempo per ottenere gli id ​​delle tessere giuste. Here is an example su come funzionano gli id ​​delle tessere.

+9

Cordiali saluti per chiunque la lettura di questo - piastrelle non c'è bisogno di essere 256x256px. Puoi impostare la lunghezza di un lato di un quadrato nelle opzioni TileLayer: 256 px è l'impostazione predefinita (e in genere ti semplificherà la vita) – thisissami

5

È anche possibile utilizzare le tessere direttamente da un database.

Il volantino del formato specificato è molto flessibile.

Il volantino utilizza solo i titolari di posizione z, x, y per richiedere tessere specifiche.

Ad esempio:

L.tileLayer('http://localhost/tileserver/tile.aspx?z={z}&x={x}&y={y}', { 
    minZoom: 7, maxZoom: 16, 
    attribution: 'My Tile Server' 
}).addTo(map); 

dove Tiles.aspx

Option Strict On 

Partial Class tile 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
     Dim z, x, y As Integer 

     z = CInt(Request.QueryString("z")) 
     x = CInt(Request.QueryString("x")) 
     y = CInt(Request.QueryString("y")) 

     Dim b() As Byte = DB.GetTile(z, x, y) 

     Response.Buffer = True 
     Response.Charset = "" 
     'Response.Cache.SetCacheability(HttpCacheability.NoCache) 
     Response.ContentType = "image/png" 
     Response.AddHeader("content-disposition", "attachment;filename=" & y & ".png") 
     Response.BinaryWrite(b) 
     Response.Flush() 
     Response.End() 
    End Sub 
+1

Esistono anche "plug-in" per Leaflet che eseguiranno il caricamento in cache locale delle informazioni che stato recuperato da una fonte di mappatura esterna (o, da una pagina come quella mostrata). –

+1

Nota che, nel tuo codice, ci sarà bisogno di * alcune * disposizioni per la gestione di una richiesta per una coordinata di tile che non esiste il tuo database Questo potrebbe essere nella tua routine 'DB.GetTile()', che dovrebbe servire una tessera fittizia o organizzare il ritorno di un '404 Not Found'. (In quest'ultimo caso, il volantino può essere programmato per servire una tessera "tessera mancante".) Ho osservato che il volantino * fa * richieste di richieste per, ad esempio, "coordinate negative", e lo fa abbastanza spesso . –

+0

Grazie per i commenti interessanti. Ho notato le richieste di piastrelle che non ho. Credo che 404 sia la risposta appropriata in quanto il volantino può (e dovrebbe) gestire con tanta grazia –