Giter VIP home page Giter VIP logo

Comments (3)

rognstad avatar rognstad commented on May 22, 2024 2

I tried calling $_deferredMount() (see https://github.com/soal/vue-mapbox/blob/master/src/components/layer/GeojsonLayer.js#L104) after the map event style.load (which seems like it is emitted after a new style is fully loaded). That seemed to work initially (the layer was visible again), but the watchers on the source data were broken, so changes to the source no longer affected the layer.

I tried a variety of things that didn't work and ended up hitting it with a hammer. I put a key property on each geoJsonLayer, and I update it after style.load, forcing all of the geoJsonLayers to be recreated. Doing this on the map works, too, but that'll mean another map load (which is how usage is billed).

So something like this:

<MglMap
  :mapStyle="mapStyle"
  @load="onMapLoaded"
>
  <MglGeojsonLayer
    :sourceId="tripsGeoJson.data.id"
    :source.sync="tripsGeoJson"
    :replace-source="true"
    :layerId="tripsGeoJson.data.id"
    :layer="tripLineLayer"
    :key="'trips' + mapKey"
  />
</MglMap>

async onMapLoaded(event) {
  event.map.on('style.load', async () => {
    this.mapKey = Date.now();
  });
}

There's probably a cleaner way to do this. If you find it, please share.

from vue-mapbox.

aarepuu avatar aarepuu commented on May 22, 2024

How I do it is I use computed value for the source and use .sync. When this.features change the layer is updated automatically with new content.

<template lang="pug">
.......

 mgl-geojson-layer(
      :layerId="getLayerId"
      :sourceId="getSourceId",
      :source.sync="getSource"
      :layer="getLayer"
)

.......

computed: {
.......
     getSource() {
      return {
        data: {
          type: 'FeatureCollection',
          features: this.features,
        },
      };
    },
.......
}

......

from vue-mapbox.

richdunajewski avatar richdunajewski commented on May 22, 2024

I agree this feels like too much of a hack, but it works! The click handler remains intact which is important in my case.

I tried the suggested method of calling this.map.addLayer() from #146 referencing the geoJsonSource object, but that didn't work. No errors, but the layer wasn't rendered after the style change. I dug a little deeper and found this solution which at least works even if it feels less elegant.

from vue-mapbox.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.