#30DayMapChallenge Ziua 3. Poligoane
City Tiles 🏙️

Aceasta este o hartă care conține tile-uri de tip vector din clădirile OSM, create folosind D3.js și Nextzen, și am pregătit-o pentru #30DayMapChallenge de pe Twitter în 2021. Puteți afla mai multe despre provocare și celelalte hărți ale mele în această postare.
Puteți urmări un clip care prezintă funcționalitatea pe YouTube.
Scop: O hartă cu poligoane.
Live: https://maptheclouds.com/playground/30-day-map-challenge/polygons/
Tweet: https://twitter.com/maptheclouds/status/1455980347066302471
Cod: https://github.com/alexaac/map-challenges/tree/master/polygons
Descriere:
Vizualizarea reprezintă centrul istoric al Timișoarei, din România.
Date: OSM Buildings,  Nextzen
Tag-uri: #D3js #Nextzen #OSMBuildings #VectorTiles
Inspirație:
https://osmbuildings.org/documentation/data/
https://www.nextzen.org/
Tile-uri de tip vector din clădirile OSM folosind D3.js și Nextzen – procesul



Provocări: Pentru această hartă am vrut să testez încărcarea de tile-uri de tip vector din surse diferite. În acest scop folosesc câteva layere pentru a desena harta de bază, de la Nextzen, și adaug un layer de clădiri deasupra, de la OSM Buildings. Pentru a obține datele mă conectez la API-uri specifice de date și le primesc tile cu tile, folosind d3.tile.
Mai întâi, încarc datele pentru straturile de bază: layer-ele de background, water, earth și roads. Apoi încarc stratul de deasupra, clădirile. După aceea folosesc D3.js atât pentru a le stiliza cât și pentru a le vizualiza.
const buildings = g
        .selectAll('g.buildings')
        .data(tiles.features)
        .enter()
        .append('path')
        .style('fill', '#3288bd')
        .style('fill-opacity', 1)
        .attr('d', path)
        .style('stroke-width', 0.1)
        .style('stroke', '#000');Totuși încărcarea de tile-uri din surse diferite s-a dovedit a fi un proces mai complicat. Cea mai mare provocare pe care a ridicat-o această hartă a fost să încarc toate tile-urile folosind API-ul de la Nextzen înainte de a încărca clădirile. Altfel unele tile-uri de clădiri ar fi fost acoperite de tile-uri de bază.
Pnetru a rezolva această problemă am folosit mai întâi Promise.all și async pentru a obține datele de bază cu d3.tile. apoi am încărcat clădirile doar după ce toate layer-urile pentru background layers se aflau deja în pagină. Mai mult, toate tile-urile de la API-ul de la Nextzen API au trebuit să fie încărcate înainte de a le stiliza, pentru a preveni aceeași problemă de suprapunere.
  return Promise.all(promises)
    .then((data) => {
      // Wait for the Nextzen tiles to complete, then render the OSM tiles
      renderBuildings();
      return data;
    })
    .catch((error) => console.log(error));
};TODO: să adaug zoom mai lin, să creez un layout pentru tipărire.
Ca o concluzie, trebuie să spun că mi-a plăcut să lucrez la această hartă și am învățat mai multe despre preluarea de tile-uri de tip vector prin API-uri pentru a face hărți utilizând D3.js.