10

次のように Mapbox GL JS マップを設定しています。

mapboxgl.accessToken = 'pk.my_token';
var cityBoundaries   = new mapboxgl.GeoJSONSource({ data: 'http://domain.com/city_name.geojson' } );
var map              = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v8',
  center: [cityLongitude,cityLatitude],
  zoom: 13
});

次に、次のように読み込まれた後、その GeoJSON データをマップに読み込みます。

map.on('style.load', function(){
  map.addSource('city', cityBoundaries);
  map.addLayer({
    'id': 'city',
    'type': 'line',
    'source': 'city',
    'paint': {
      'line-color': 'blue',
      'line-width': 3
    }
  });
});

この時点で、 で指定した場所を中心とするマップがあり、new mapboxgl.Mapズーム レベルは 13 です。そのため、GeoJSON データの一部のみがマップ上に表示されます。GeoJSON データ全体が表示されるように、地図の中心を再設定して再ズームしたいと考えています。

Mapbox JS では、GeoJSON データを にロードしてfeatureLayerから、マップをその境界に合わせることでこれを行います。

map.fitBounds(featureLayer.getBounds());

Mapbox GL JSのfitBounds ドキュメント[[minLng, minLat], [maxLng, maxLat]]は、境界が の形式で必要であることを示しています。

このGeoJSONレイヤーのミックス/最大緯度と経度の値を決定する方法はありますか?

4

4 に答える 4

8

Based on the 'Obtaining a bounding box' section of this post, I've come up with this process...

map.on('style.load', function(){
  $.getJSON('http://citystrides.dev/city_name.geojson', function(response){
    var boundingBox = getBoundingBox(response);
    var cityBoundary = new mapboxgl.GeoJSONSource({ data: response } );

    map.addSource('city', cityBoundary);
    map.addLayer({
      'id': 'city',
      'type': 'line',
      'source': 'city',
      'paint': {
        'line-color': 'blue',
        'line-width': 3
      }
    });
    map.fitBounds([[boundingBox.xMin, boundingBox.yMin], [boundingBox.xMax, boundingBox.yMax]]);
  })
});

function getBoundingBox(data) {
  var bounds = {}, coords, point, latitude, longitude;

  for (var i = 0; i < data.features.length; i++) {
    coords = data.features[i].geometry.coordinates;

    for (var j = 0; j < coords.length; j++) {
      longitude = coords[j][0];
      latitude = coords[j][1];
      bounds.xMin = bounds.xMin < longitude ? bounds.xMin : longitude;
      bounds.xMax = bounds.xMax > longitude ? bounds.xMax : longitude;
      bounds.yMin = bounds.yMin < latitude ? bounds.yMin : latitude;
      bounds.yMax = bounds.yMax > latitude ? bounds.yMax : latitude;
    }
  }

  return bounds;
}

Here's a walkthrough of what the code is doing, for anyone out there who needs a detailed explanation:

  • map.on('style.load', function(){
    • When the map loads, let's do the stuff in this function.
  • $.getJSON('http://citystrides.dev/city_name.geojson', function(response){
    • Get the city's GeoJSON data. This is an asynchronous call, so we have to put the all the code that uses this data (the response) inside this function.
  • var boundingBox = getBoundingBox(response);
    • Get the bounding box of this GeoJSON data. This is calling the , function(){ that appears after the 'map on style load' block.
  • var cityBoundary = new mapboxgl.GeoJSONSource({ data: response } );
    • Build Mapbox's GeoJSON data.
  • map.addSource('city', cityBoundary);
    • Add the source to Mapbox.
  • map.addLayer({
    • Add the layer to Mapbox.
  • map.fitBounds([[boundingBox.xMin, boundingBox.yMin], [boundingBox.xMax, boundingBox.yMax]]);
    • Adjust the map to fix the GeoJSON data into view.
  • function getBoundingBox(data) {
    • This function iterates over the returned GeoJSON data, finding the minimum and maximum latitude and longitude values.

One thing to note in the getBoundingBox function is this line:

coords = data.features[i].geometry.coordinates;

In the original post, linked above, this line was written as coords = data.features[i].geometry.coordinates[0]; because their data for the list of coordinates was an array of arrays. My data isn't formatted that way, so I had to drop the [0]. If you try this code & it blows up, that might be the reason.

于 2016-02-28T17:07:22.253 に答える
2

とにかくMapbox束によって維持されているturf-extentライブラリを使用します。https://www.npmjs.com/package/turf-extentはノード モジュール リンクです。あなたのコードでは、単純にインポート(ES6)するか、次のように要求します。

ES6/Webpack: import extent from 'turf-extent';
Via script tag: `<script src='https://api.mapbox.com/mapbox.js/plugins/turf/v2.0.2/turf.min.js'></script>`

次に、応答を関数にフィードします。次に例を示します。

ES6/Webpack: let orgBbox = extent(response);
Normal: var orgBbox = turf.extent(geojson);

次に、配列値を使用してマップの中心を設定できます。

center: [orgBbox[0], orgBbox[1]]

または、必要に応じて、境界に合わせて:

map.fitBounds(orgBbox, {padding: 20});

以下は、webpack またはブラウザーを使用していない場合に備えて、通常の html タグで turf.min.js を使用した例です: https://bl.ocks.org/danswick/83a8ddff7fb9193176a975a02a896792

ハッピーコーディングとマッピング!

于 2016-11-25T17:21:16.960 に答える
2

図書館を利用できますturf.js。機能がありbboxます:

const bbox = turf.bbox(foo);

https://turfjs.org/docs/#bbox

于 2019-08-07T10:01:20.147 に答える