Ввести файлы KMZ в карту Leaflet - PullRequest
0 голосов
/ 09 октября 2019

Основываясь на запросе, опубликованном недавно здесь:

Использование файла KMZ в Leaflet Map

Я попадаю в репозиторий GitHub:

https://github.com/engrabid411/kmzol3

откуда я использовал код для своих собственных файлов.

В основном код вообще не работает в репозитории, показывая только пустую карту.

Однако даже если вы реализуете свой собственный файл, он не изменится.

Код выглядит следующим образом:

 var map = new ol.Map({
  layers: [
    new ol.layer.Tile({
      source: new ol.source.OSM()
    })
  ],
  controls: ol.control.defaults({
    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
      collapsible: false
    })
  }),
  target: 'map',
  view: new ol.View({
    center: [0, 0],
    zoom: 2
  })
});

var nestedKMZData = new Array();
var nestedKMZLinks = new Array();
var hasOwnProperty = Object.prototype.hasOwnProperty;

function isEmpty(obj) {
    if (obj == null)return true;
    if (obj.length > 0)return false;
    if (obj.length === 0)return true;
    for (var key in obj) {
        if (hasOwnProperty.call(obj, key)) return false;
    }
    return true;
}
var deferred = $.Deferred();
function readKMZ( url , callback){

    if (!/^(?:f|ht)tps?\:\/\//.test(url)) {
        url = "http://" + url;
    }
    JSZipUtils.getBinaryContent(
        'proxy/index.php?url='+url, 
        function(err, data) {
          if(err) {
            throw err; 
          }

        var zip = new JSZip(data);
        for(f in zip.files){
            var extractData = zip.files[f].asText(); 

            if (window.DOMParser) {
              parser=new DOMParser();
              xmlDoc=parser.parseFromString(extractData,"text/xml");
            } else { // Internet Explorer
              xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
              xmlDoc.async=false;
              xmlDoc.loadXML(extractData); 
            }


            var NetworkLink = xmlDoc.getElementsByTagName('NetworkLink');

            if(isEmpty(NetworkLink) == true){
                nestedKMZData.push(extractData);
                deferred.resolve(nestedKMZData);
            }


            for(var L in NetworkLink){

                if(typeof NetworkLink[L] === "object" ){
                    deferred.notify();
                    var Link = NetworkLink[L].getElementsByTagName('Link');
                    var href = Link[0].getElementsByTagName('href')[0].innerHTML;

                    readKMZ(href);

                }

            }

        }
    }); 
    return deferred.promise();
}

  var data = readKMZ('http://xjubier.free.fr/download/GE/en/TSE_2001_06_21.kmz');
data.done(function(d){ console.log(d);});

После запуска консоль сообщает:

Доступ к XMLHttpRequest в «http://xjubier.free.fr/download/GE/en/TSE_2001_06_21.kmz' из источника» http://localhost' заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

а также:

Uncaught Ошибка: InvalidStateError: Не удалось прочитать свойство 'responseText' из 'XMLHttpRequest': значение доступно только в том случае, если 'responseType' объекта '' 'или' text '(was' arraybuffer)«). в XMLHttpRequest.xhr.onreadystatechange (jszip-utils.js: 93)

По моему скромному мнению, ошибка здесь:

function readKMZ( url , callback){

    if (!/^(?:f|ht)tps?\:\/\//.test(url)) {
        url = "http://" + url;
    }
    JSZipUtils.getBinaryContent(
        'proxy/index.php?url='+url, 
        function(err, data) {
          if(err) {
            throw err; 
          }

, где я не понимаю 'proxy/index.php?url='+url,. Есть ли какое-то решение, чтобы этот код работал? Я также спрашиваю с точки зрения файлов .kmz, размещенных на моем локальном хосте вместо веб-сервера.

1 Ответ

0 голосов
/ 10 октября 2019

1-й код, который вы показываете, предназначен для OpenLayers.

Тогда 2-й код, который вы показываете, кажется, полагается на бэкэнд-сервер PHP в качестве прокси-сервера для загрузки целевого файла KMZ, возможно, для обхода проблемы CORS. .

Похоже, он также содержит собственный алгоритм извлечения вложенных связанных файлов.

Если ваша цель - просто извлечь простой файл KMZ, которым вы управляете, распакуйте его и проанализируйте его KMLсодержимое, тогда вам вообще не нужен такой прокси и пользовательский анализ: - получить файл KMZ в двоичном виде через AJAX (с помощью fetch, jQuery и т. д.) - разархивировать файл (JSZip ...) - найти встроенный контент KML иразобрать его (например, с помощью листовки всеядного существа kml.parse)

...