Closed gabacode closed 2 years ago
Sei sempre bravo!
Domanda: ma quello è l'indirizzo di esempio o la base che usi?
Se mi mandi URL della base che usi, ti faccio un ciao mondo
Domanda: ma quello è l'indirizzo di esempio o la base che usi?
Ciao @aborruso, grazie! L'indirizzo di esempio è esattamente la base che sto usando. Funziona, ma solo se il dispositivo è online.
Caro @gabacode vari modi per farlo.
Un esempio a caldo, è quello di usare il mitico gdal2tiles
, che prende una source in grado di essere gestita da GDAL (praticamente tutte) e le converte in tile.
Per usare un TMS come sorgente, lo devi descrivere. Si fa tramite un file XML.
Nel tuo caso qualcosa come
<GDAL_WMS>
<Service name="TMS">
<ServerUrl>https://basemaps.cartocdn.com/light_all/${z}/${x}/${y}.png</ServerUrl>
</Service>
<DataWindow>
<UpperLeftX>-20037508.34</UpperLeftX>
<UpperLeftY>20037508.34</UpperLeftY>
<LowerRightX>20037508.34</LowerRightX>
<LowerRightY>-20037508.34</LowerRightY>
<TileLevel>18</TileLevel>
<TileCountX>1</TileCountX>
<TileCountY>1</TileCountY>
<YOrigin>top</YOrigin>
</DataWindow>
<Projection>EPSG:3857</Projection>
<BlockSizeX>256</BlockSizeX>
<BlockSizeY>256</BlockSizeY>
<BandsCount>3</BandsCount>
<UserAgent>Mozilla/5.0</UserAgent>
<ZeroBlockHttpCodes>204,404,403</ZeroBlockHttpCodes>
<Cache/>
</GDAL_WMS>
Poi lanci gdal2tiles
su questo
gdal2tiles.py -z 1-2 --profile=mercator input.wms
Nella cartella vengono scaricare le tiles, come in questo esempio di output.
Con l'opzione -z 1-2
scarichi i primi due livelli di zoom.
Se vuoi ridurre all'area di interesse, devi modificare le coordinate del file di definizione.
Ma gdal2tiles
è davvero fantastico! Grazie, Andrea! Letteralmente, "ciao mondo" :)
Una cosa non capisco: i valori UpperLeft
e LowerRight
(es: 20037508.34) che unità di misura sono, e in che relazione si trovano con una boundary box di questo tipo, ad esempio:
NW: [47.091783746462156, 6.62662136853768]
SE: [35.493691935511414, 18.52038159909892]
?
Ciao @gabacode il cambio di coordinate non si fa da lì (errore mio).
Fammi capire come evitarti di scaricare il mondo e torno da te
Caro @gabacode , riprendo da dove ci eravamo lasciati.
La tua sorgente, secondo le modalità di GDAL, può essere definita con questo file XML (che nei miei esempi è carto.wms
)
<GDAL_WMS>
<Service name="TMS">
<ServerUrl>https://basemaps.cartocdn.com/light_all/${z}/${x}/${y}.png</ServerUrl>
</Service>
<DataWindow>
<UpperLeftX>-20037508.34</UpperLeftX>
<UpperLeftY>20037508.34</UpperLeftY>
<LowerRightX>20037508.34</LowerRightX>
<LowerRightY>-20037508.34</LowerRightY>
<TileLevel>18</TileLevel>
<TileCountX>1</TileCountX>
<TileCountY>1</TileCountY>
<YOrigin>top</YOrigin>
</DataWindow>
<Projection>EPSG:3857</Projection>
<BlockSizeX>256</BlockSizeX>
<BlockSizeY>256</BlockSizeY>
<BandsCount>3</BandsCount>
<UserAgent>Mozilla/5.0</UserAgent>
<ZeroBlockHttpCodes>204,404,403</ZeroBlockHttpCodes>
<Cache/>
</GDAL_WMS>
È una mappa globale, e il suo sistema di coordinate è metrico ed è il così detto Google Mercator, definito sopra nel tag Projection
, ovvero EPSG:3857
.
Se cambio le coordinate qui, faccio un errore, perché questo file definisce la fonte, non come tagliarla. E la fonte è globale, quindi non ha senso modificare le coordinate.
La tua coppia di coordinate è in gradi decimali (definisce l'Italia), in coordinate geografiche, definito EPSG:4326
. Devi riportarle al sistema della tua fonte, ma questa non la issue per parlarne. In ogni caso cerca "from latitude longitude to google mercator".
A partire dalla descrizione della tua fonte potremmo creare una singola immagine enorme di output e poi dividerla in tasselli. Lo strumento di GDAL per derivare mappe è gdal_translate. Per creare un'immagine dal tuo input, ritagliata sulle tue coordinate, il comando è:
gdal_translate -of TIF -projwin 737672.12 5957068.41 2061679.45 4231175.95 carto.wms out.tif
NON LO LANCIARE, verrebbe un singolo file enorme. Quei numeri che vedi sono le tue coordinate, nel sistema di coordinate del tuo input. In questo ordine: ulx uly lrx lry, ovvero x e y upper left, e x e y lower right.
Ma GDAL ha uno special file di output (e input), quello virtuale, ovvero un file che descrive l'output, ma non lo materializza. Creiamolo per il tuo caso:
gdal_translate -of VRT -projwin 737672.12 5957068.41 2061679.45 4231175.95 carto.wms out.vrt
È ancora una volta un file XML (vedi sotto), che descrive un'immagine ritagliata sulle tue coordinate, a partire dal tuo input globale. Puoi lanciare gdal2tiles, su questo input: ti verranno generate le tiles soltanto per quest'area.
Scaricare l'Italia ti prenderà un po' di tempo. Ti consiglio di fare prima qualche test con i livelli di zoom bassi.
Potrai stoppare quando vuoi, e non aspettare che sia tutto completo, perché hai l'opzione -e, --resume Resume mode. Generate only missing files.
Ad esempio questo è il comando per il livelli di zoom 6 e 7:
gdal2tiles.py -z 6-7 -e --profile=mercator out.vrt
Fammi sapere
<VRTDataset rasterXSize="2217158" rasterYSize="2890147">
<SRS>PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]]</SRS>
<GeoTransform> 7.3767166479906440e+05, 5.9716428339481353e-01, 0.0000000000000000e+00, 5.9570684424476009e+06, 0.0000000000000000e+00, -5.9716428339481353e-01</GeoTransform>
<Metadata>
<MDI key="CACHE_PATH">./gdalwmscache/6b8470809fd2dc24e6b8afffa76c05eb</MDI>
</Metadata>
<Metadata domain="IMAGE_STRUCTURE">
<MDI key="INTERLEAVE">PIXEL</MDI>
</Metadata>
<VRTRasterBand dataType="Byte" band="1">
<ColorInterp>Red</ColorInterp>
<SimpleSource>
<SourceFilename relativeToVRT="1">carto.wms</SourceFilename>
<SourceBand>1</SourceBand>
<SourceProperties RasterXSize="67108864" RasterYSize="67108864" DataType="Byte" BlockXSize="256" BlockYSize="256" />
<SrcRect xOff="34789723" yOff="23578838" xSize="2217158" ySize="2890147" />
<DstRect xOff="0" yOff="0" xSize="2217158" ySize="2890147" />
</SimpleSource>
</VRTRasterBand>
<VRTRasterBand dataType="Byte" band="2">
<ColorInterp>Green</ColorInterp>
<SimpleSource>
<SourceFilename relativeToVRT="1">carto.wms</SourceFilename>
<SourceBand>2</SourceBand>
<SourceProperties RasterXSize="67108864" RasterYSize="67108864" DataType="Byte" BlockXSize="256" BlockYSize="256" />
<SrcRect xOff="34789723" yOff="23578838" xSize="2217158" ySize="2890147" />
<DstRect xOff="0" yOff="0" xSize="2217158" ySize="2890147" />
</SimpleSource>
</VRTRasterBand>
<VRTRasterBand dataType="Byte" band="3">
<ColorInterp>Blue</ColorInterp>
<SimpleSource>
<SourceFilename relativeToVRT="1">carto.wms</SourceFilename>
<SourceBand>3</SourceBand>
<SourceProperties RasterXSize="67108864" RasterYSize="67108864" DataType="Byte" BlockXSize="256" BlockYSize="256" />
<SrcRect xOff="34789723" yOff="23578838" xSize="2217158" ySize="2890147" />
<DstRect xOff="0" yOff="0" xSize="2217158" ySize="2890147" />
</SimpleSource>
</VRTRasterBand>
</VRTDataset>
Funziona alla grande! Grazie, @aborruso! Che bel tool che mi hai fatto scoprire. Certo, 100MB di mappa a zoom 11 sono un pò tanti da shippare con l'app. Probabilmente darò la possibilità agli utenti di scaricarsele on demand. Preparo ricetta!
Preparo ricetta!
Qui una guida https://tansignari.opendatasicilia.it/ricette/tansignari/come_scrivere_una_ricetta/
Il repo è questo https://github.com/opendatasicilia/tansignari-md
Sto terminando lo sviluppo di un'app che utilizza la geolocalizzazione a partire da un Point del GPS e restituisce il codice regionale (tramite @turf/boolean-point-in-polygon) e una FeatureCollection delle Regioni Italiane.
L'app poi carica la mappa tramite UrlTile all'indirizzo esempio
https://basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png
.Esiste un modo per scaricare progammaticamente tutte le tiles ad un determinato zoom incluse nella bbox del territorio italiano così da poter caricare le tiles via local storage con LocalTile se il dispositivo è offline e non ha ancora avuto modo di caricare le tiles nella cache? Ho provato con jTileDownloader e Mobile Atlas Creator ma senza avere risultati.