2017-06-16 4 views
2

Situation: Ich habe eine Arbeitsstelle, wo MapboxGL beim Eingeben einer Adresse einen Punkt auf der Karte markiert und eine Polygonebene abfragt (queryRenderedFeatures) und die Polygonfunktion anzeigt, die den Punkt enthält.MapboxGL: Abfrage von gerenderten Objekten nach mehreren Geocodes

Dies funktioniert; Wenn ich dann jedoch eine zweite Adresse geokodieren möchte, die die Kartenansicht ändert, schlägt sie ein zweites Mal fehl, weil map.queryRenderedFeatures ein leeres Array zurückgibt.

var userDistrictsGeoJson; 

map.on('load', function() { 
    //add layers from Mapbox account 
    addLayers(); //details left out of example, but this works. 
    // Listen for geocoding result 
    // This works the first time through, but fails if the user searchs for a second address because queryRenderedFeatures is working with a smaller set of features 
    geocoder.on('result', function(e) { 
    //need to clear geojson layer and 
    userDistrictsGeoJson = { 
     "type": "FeatureCollection", 
     "features": [] 
    }; 

    map.getSource('single-point').setData(e.result.geometry); 
    //project to use (pixel xy coordinates instead of lat/lon for WebGL) 
    var point = map.project([e.result.center[0], e.result.center[1]]); 

    var features = map.queryRenderedFeatures(point, { layers: ['congress-old'] }); 

    var filter = featuresOld.reduce(function(memo, feature){ 
     // console.log(feature.properties); 
     memo.push(feature.properties.GEOID); 
     return memo; 
    }, ['in', 'GEOID']); 

    map.setFilter('user-congress-old', filter); 

    var userCongressOldGeoJson = map.querySourceFeatures('congressional-districts', { 
     sourceLayer: 'congress_old', 
     filter: map.getFilter('user-congress-old') 
    }); 

    userDistrictsGeoJson.features.push(userCongressOldGeoJson[0]); 

    var bbox = turf.bbox(userDistrictsGeoJson); 
    var bounds = [[bbox[0], bbox[1]], [bbox[2], bbox[3]]]; 

    map.fitBounds(bounds, { 
     padding: 40 
    }); 

    }); //geocoder result 
}); //map load 

So wie ich schon sagte, alles, was ‚Ergebnis‘ auf dem Geocodes läuft Ereignis arbeitet das erste Mal durch, aber es scheint, dass auf das zweite Mal durch (Benutzer sucht neue Adresse, aber nicht neu geladen Karte) queryRenderedFeatures gibt eine kleinere Teilmenge von Features zurück, die die Kacheln, auf denen der Geocoder landet, nicht enthält.

Alle Vorschläge werden sehr geschätzt.

Antwort

1

Ich löste dies durch Auslösen des Abfragecodes einmal auf "moveend" -Ereignis.

So, jetzt ist die Syntax:

geocoder.on('result', function(e){ 
    map.once('moveend', function(){ 
     .... rest of code 
    } 
} 

ich dachte ich, das versucht hatte, bevor die Frage der Veröffentlichung, aber jetzt scheint für mich zu arbeiten.

Verwandte Themen