OPENLAYERS 6, как получить границы нескольких кмл файла - PullRequest
0 голосов
/ 18 октября 2019

Как я могу получить границы нескольких кмл файлов? я могу легко получить один файл kml, но я немного растерялся ... чтобы получить границы всех файлов kml, которые есть на карте ...

вот код (напишите в контексте файла php)

сначала я определяю необходимый файл kml и переменную js для источников и слоев (то есть: src_expe_pro0 expe_pro0 ...)

$pro_kml .= '
   var src_expe_pro'.$j.' =new ol.source.Vector({
      url: "http://www.grottes-et-karsts-de-chine.org/gkc_kml_file/pro_kml_file/'.strtolower($pro_id).'.kml",
      format: new ol.format.KML()
   });
   var expe_pro'.$j.' = new ol.layer.Vector({
      source:src_expe_pro'.$j.'
    });';   
   $layers_pro_kml .= "expe_pro".$j.",
   ";

позже я помещаю это в карту (так$ layer_pro_kml может быть одним или несколькими слоями)

...
         layers: [
            fond_carte,
            '.$layers_pro_kml.'
            expe_markers
         ],
...

и вот идет туман ... сейчас я просто использую это, кто работает, беря границу первого слоя kml

   expe_pro0.once("change", function(e){
      var extension = src_expe_pro0.getExtent();
      map.getView().fit(extension);
   });

так что на самом деле вопрос в том, как работать с массивами (расширением), чтобы уменьшить на один массив, мы дадим мне границы всех слоев kml? есть ли в API функции или я должен играть с массивами ?? или, может быть, простой способ?

Любой совет

Спасибо

С советом Майка (спасибо) я использую это и его работу отлично ..

      var extension = ol.extent.createEmpty();
      map.getLayers().forEach(function(layer){
         if(!layer.values_.id) {
            layer.once("change", function(e){
               ol.extent.extend(extension, layer.getSource().getExtent());
               map.getView().fit(extension);
            });
         }
      });

1 Ответ

1 голос
/ 18 октября 2019

Попробуйте что-нибудь подобное. Источники могут загружаться в любом порядке, поэтому было бы проще повторно установить их при каждой загрузке.

     // before opening map set listeners for vectors loading
     // and use extents to fit the map
     var extension = ol.extent.createEmpty();
     [
        fond_carte,
        '.$layers_pro_kml.'
        expe_markers
     ].forEach(function(layer) {
       if (layer.getSource().getExtent) {
         layer.getSource().on("addfeature", function(e){
           ol.extent.extend(extension, layer.getSource().getExtent());
           map.getView().fit(extension);
         });
       }
     });
     // then open the map to load the vectors
     map.setView(
       new ol.View({
         center: [0,0],
         zoom: 0
       })
     );
...