Слой KML в Openlayers не работает на localhost - PullRequest
4 голосов
/ 07 сентября 2011

У меня странная проблема с рендерингом файла KML в OpenLayers.Вроде бы легко, но это не так.Я начал с примера отсюда Пример OpenLayers .Я хотел добавить свой собственный KML.Это не сработало.Я создал локальную копию примера с абсолютными URL-адресами следующим образом:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <link rel="stylesheet" href="http://openlayers.org/dev/theme/default/style.css" type="text/css" />
    <link rel="stylesheet" href="http://openlayers.org/dev/examples/style.css" type="text/css" />
    <script src="http://openlayers.org/dev/OpenLayers.js"></script>            
    <style type="text/css">
        html, body {
            height: 100%;
        }
        #map {
            width: 100%;
            height: 80%;
            border: 1px solid black;
        }
        .olPopup p { margin:0px; font-size: .9em;}
        .olPopup h2 { font-size:1.2em; }
    </style>
    <script type="text/javascript">


        var lon = 5;
        var lat = 40;
        var zoom = 5;
        var map, select;

        function init(){
            map = new OpenLayers.Map('map');

            var wms = new OpenLayers.Layer.WMS(
                "OpenLayers WMS",
                "http://vmap0.tiles.osgeo.org/wms/vmap0",
                {layers: 'basic'}
            );

            var sundials = new OpenLayers.Layer.Vector("KML", {
                projection: map.displayProjection,
                strategies: [new OpenLayers.Strategy.Fixed()],
                protocol: new OpenLayers.Protocol.HTTP({
                    url: "http://openlayers.org/dev/examples/kml/sundials.kml",
                    format: new OpenLayers.Format.KML({
                        extractStyles: true,
                        extractAttributes: true
                    })
                })
            });

            map.addLayers([wms, sundials]);
            alert("deded");
            select = new OpenLayers.Control.SelectFeature(sundials);

            sundials.events.on({
                "featureselected": onFeatureSelect,
                "featureunselected": onFeatureUnselect
            });

            map.addControl(select);
            select.activate();   
            map.zoomToExtent(new OpenLayers.Bounds(68.774414,11.381836,123.662109,34.628906));
        }
        function onPopupClose(evt) {
            select.unselectAll();
        }
        function onFeatureSelect(event) {
            var feature = event.feature;
            // Since KML is user-generated, do naive protection against
            // Javascript.
            var content = "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description;
            if (content.search("<script") != -1) {
                content = "Content contained Javascript! Escaped content below.<br>" + content.replace(/</g, "&lt;");
            }
            popup = new OpenLayers.Popup.FramedCloud("chicken", 
                                     feature.geometry.getBounds().getCenterLonLat(),
                                     new OpenLayers.Size(100,100),
                                     content,
                                     null, true, onPopupClose);
            feature.popup = popup;
            map.addPopup(popup);
        }
        function onFeatureUnselect(event) {
            var feature = event.feature;
            if(feature.popup) {
                map.removePopup(feature.popup);
                feature.popup.destroy();
                delete feature.popup;
            }
        }
    </script>
  </head>
  <body onload="init()">
      <h1 id="title">KML Layer Example</h1>

      <div id="tags">
          kml, popup, feature
      </div>

      <p id="shortdesc">
          Demonstrates loading and displaying a KML file on top of a basemap.
    </p>

    <div id="map" class="smallmap"></div>

    <div id="docs"></div>
  </body>
</html>

Он не отображает.Я попытался изменить URL KML на мою локальную копию sundial.kml (url: "http://openlayers.org/dev/examples/kml/sundials.kml", -> url: "/sundials.kml, но она тоже не сработала. У меня нет идеи почему.

Наконец, я хочу добавить свои собственные файлы KML, но они тоже не показывают. Что мне делать?

Заранее спасибо Rafal

Ответы [ 2 ]

9 голосов
/ 10 сентября 2011

Причина, по которой ваша локальная копия sundials.kml не будет отображаться, заключается в том, что вы используете OpenLayers.Protocol.HTTP, который не будет загружать адрес вида file://directory/file.kml.

Но я 'Я не знаю, почему ваш размещенный код не отображается.В настоящее время я борюсь с той же проблемой.Все, что я могу вам сказать, это то, что еще не работает.

Документация Openlayers объясняет, как слой GML можно использовать для загрузки слоя KML.К сожалению, фрагмент кода, который они приводят в документации, не соответствует их фактическому примеру , который использует векторный слой, как и большинство их других примеров KML (и GML).

Я скопировалкод примера в любом случае, но изменил векторный слой на var layer = new OpenLayers.Layer.GML("GML", "gml/polygon.xml"); согласно документации.Затем я сделал локальные копии Openlayers.js, polygon.xml и .css таблиц стилей и изменил URL, чтобы они указывали на мои локальные копии.Так что все локально.

<!DOCTYPE html> 
<html> 
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> 
        <meta name="apple-mobile-web-app-capable" content="yes"> 
        <title>GML Doesn't Render</title> 
        <link rel="stylesheet" href="defaultstyle.css" type="text/css"> 
        <link rel="stylesheet" href="examplesstyle.css" type="text/css"> 
        <script src="OpenLayers.js"></script> 
        <script type="text/javascript">
            var map;

            function init(){
                map = new OpenLayers.Map('map');
                var wms = new OpenLayers.Layer.WMS(
                    "OpenLayers WMS", "http://vmap0.tiles.osgeo.org/wms/vmap0",
                    {layers: 'basic'}
                );

                var layer = new OpenLayers.Layer.GML("GML", "gml/polygon.xml");

                map.addLayers([wms, layer]);
                map.zoomToExtent(new OpenLayers.Bounds(
                    -3.92, 44.34, 4.87, 49.55
                ));
            }
        </script> 
    </head> 
    <body onload="init()"> 
        <div id="map" class="smallmap"></div> 
    </body> 
</html> 

Это не работает.

Я также попробовал предложение из документации:

var layer = new OpenLayers.Layer.GML("KML", "kml/lines.kml", {
   format: OpenLayers.Format.KML,
   formatOptions: {
       'extractStyles': true
   }
});

Это не работает.

Существует даже конкретный пример загрузки «локально хранящихся векторных данных GML на базовой карте».Он использует тот же код, что и документация, поэтому, разумеется, он не работает.Я не могу гиперссылку на нее, потому что у меня пока недостаточно репутации, чтобы создать три гиперссылки, но вы можете найти ее, если поищете в примерах «GML».

Openlayers имеет функцию безопасности, которая усложняет задачу.загружать данные и javascript из совершенно разных мест (и обходной путь, называемый proxyhost, если вам действительно нужно это сделать).Но я не понимаю, как это могло бы быть связано, когда все URL-адреса указывают на localhost.

Пожалуйста, будьте осторожны, это мой первый пост!

РЕДАКТИРОВАТЬ: Оказывается, что а)это функция безопасности браузера, а не OpenLayers, и б) она не позволяет скрипту на локальном хосте загружать любые другие файлы на локальный хост, даже если вы не в сети.Chrome / Chromium имеет параметр командной строки -allow-file-access-from-files.Используя этот параметр, приведенные выше примеры работают.Другие обходные пути (Google их) кажутся хитрыми.

0 голосов
/ 22 января 2015

Эта ветка старая, но я знаю, что она все еще будет рассматриваться.

Попробуйте установить проекцию при создании слоя KML. Это сработало для меня.

    var kmllayer = new OpenLayers.Layer.Vector("KML", {
            projection: map.displayProjection,
...