Crearea de tile-uri de tip vector din clădirile OSM folosind D3.js – City Tiles 🏙️

3 min read

#30DayMapChallenge Ziua 3. Poligoane

City Tiles 🏙️

OSM buildings tiles map - page view
poligoane

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

OSM buildings tiles map - zoom out page view
OSM buildings tiles map - zoomed in view
OSM buildings tiles map - gif animation

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *