Mapbox GL JS getBounds()/fitBounds()
Je suis en utilisant Mapbox GL JS v0.14.2 et j'ai cherché haut et bas grâce à la documentation et très peu est clair à ce sujet.
Si vous utilisez la norme API JS, il est très clair à s'adapter carte de marqueurs à l'aide d'un exemple, ils ont fourni (https://www.mapbox.com/mapbox.js/example/v1.0.0/fit-map-to-markers/); toutefois, le programme d'installation lors de l'utilisation de l'api GL est tout à fait différent. L'API GL a getBounds()
( https://www.mapbox.com/mapbox-gl-js/api/#Map.getBounds ), mais parce que vous ne disposez pas d'un nom de couche, comme la norme API JS, donc j'ai du mal à travailler sur la façon d'utiliser getBounds()
à tous.
J'ai trouvé ceci ( Mapbox GL API JS fixer des Limites ), mais ne peut certainement pas être la bonne réponse?
C'est l'essentiel de mon installation; à l'exclusion de configuration JSON et d'autres options.
mapboxgl.accessToken = '<myaccesstoken>';
var markers = <?php echo $programme_json; ?>;
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/richgc/cikyo5bse00nqb0lxebkfn2bm',
center: [-1.470085, 53.381129],
zoom: 15
});
map.on('style.load', function() {
map.addSource('markers', {
'type': 'geojson',
'data': markers
});
map.addLayer({
"id": "markers",
"interactive": true,
"type": "symbol",
"source": "markers",
"layout": {
"icon-image": "venue-map-icon-blue",
'icon-size': 0.5,
"icon-allow-overlap": true
}
});
map.scrollZoom.disable();
});
J'ai essayé ce qui suit:
alert(map.getBounds()); //LngLatBounds(LngLat(-1.4855345239256508, 53.37642500812015), LngLat(-1.4546354760740883, 53.38583247227842))
var bounds = [[-1.4855345239256508, 53.37642500812015],[-1.4546354760740883, 53.38583247227842]]
map.fitBounds(bounds);
Donc je sais comment les fitBounds, mais je n'en suis pas sûr comment les obtenir map.getBounds()
semble juste pour retourner le jeu au centre de gnl/lat.
Marqueurs JSON:
var markers = {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"title":"Site Gallery","url":"\/Freelance\/art-sheffield-2016\/programme\/site-gallery\/","summary":"Duis arcu tortor, suscipit eget, imperdiet nec, imperdiet iaculis, ipsum. Donec id justo. Aenean tellus metus, bibendum sed, posuere ac, mattis non, nunc. Suspendisse feugiat. Etiam rhoncus.","image":"\/Freelance\/art-sheffield-2016\/site\/assets\/files\/1032\/site_gallery.jpg","marker-symbol":"venue-map-icon-blue","colour":"blue"},"geometry":{"type":"Point","coordinates":["-1.466439","53.376842"]}},{"type":"Feature","properties":{"title":"Moore Street Substation","url":"\/Freelance\/art-sheffield-2016\/programme\/moore-street-substation\/","summary":"","image":null,"marker-symbol":"venue-map-icon-green","colour":"green"},"geometry":{"type":"Point","coordinates":["-1.477881","53.374798"]}},{"type":"Feature","properties":{"title":"S1 Artspace","url":"\/Freelance\/art-sheffield-2016\/programme\/s1-artspace\/","summary":"","image":null,"marker-symbol":"venue-map-icon-red","colour":"red"},"geometry":{"type":"Point","coordinates":["-1.459620","53.380562"]}}]};
- "la carte.getBounds() semble juste pour retourner le jeu au centre de gnl/lat" N'est-il pas de retourner le bas-gauche et haut-droit coordonnées de votre boîte englobante?
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez adapter la carte à des marqueurs, vous pouvez créer des limites qui contient tous les marqueurs.
map.setZoom(map.getZoom() - 1)
, mais il ressemble à un petit hack.padding
optionmap.fitBounds(bounds, { padding: '100' });
bounds
objet ne sera pas utile (ce qui est logique).map.fitBounds(bounds, { padding: 100 });
Pour une solution qui fonctionne pour tous les GeoJSON objets, pas seulement un ensemble de marqueurs, découvrez Mapbox est Turf.js.
Ce code a été très utile pour moi: https://bl.ocks.org/danswick/83a8ddff7fb9193176a975a02a896792
Mais juste pour répéter les notions de base dans le cas où le lien meurt:
La
extent
méthode mentionnée dans le rapport de code a été dépréciée en faveur debbox
, mais le résultat est le même.Mapbox propre geojson-mesure plugin fera l'affaire. En supposant que votre
markers
objet est valide GeoJSON, vous pouvez tout simplement passer à lageojsonExtent()
fonction permettant d'obtenir un ensemble de limites que vous pouvez ensuite passer àfitBounds()
.Une fois que vous chargez le geojson-extent.js fichier (par exemple, à l'aide d'un
<script>
balise dans votre code HTML), vous devez être capable de faire cela pour s'adapter à votre carte pour les limites de votre GeoJSONmarkers
objet:Mise à JOUR
GeoJSONLint rapports que votre
markers
objet n'est pas valide GeoJSON parce que les éléments dans chaque position sont interprétées comme des chaînes de caractères, pas des numéros. Si vous supprimez les citations de la lon-lat coordonnées, il devrait fonctionner correctement:JS:
Uncaught Error: Invalid LngLat object: (NaN, 1)
– je crois que c'est valable geoJSON que la carte fonctionne MAIS je suppose quemarkers
est de retour plus que juste coordonnées alors peut-être que j'ai besoin de passer simplement les coordonnées dans la geojsonExtent.