gpt4 book ai didi

javascript - Openlayers 中的 KML 层在本地主机上不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 05:07:20 26 4
gpt4 key购买 nike

我在 OpenLayers 中渲染 KML 文件时遇到奇怪的问题。这似乎很容易,但事实并非如此。我从这里的一个例子开始 OpenLayers example .我想添加自己的 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>

它不渲染。我试图将 KML url 更改为 sundial.kml 的本地副本(url:“http://openlayers.org/dev/examples/kml/sundials.kml”,-> url:“/sundials.kml,它也没有用。我不知道为什么。

最后我想添加我自己的 KML 文件,但它们也不显示。我该怎么办?

提前致谢拉法尔

最佳答案

sundials.kml 的本地副本无法呈现的原因是您使用的是 OpenLayers.Protocol.HTTP,它不会加载地址属于file://directory/file.kml

但我不知道为什么您发布的代码无法呈现。我目前正在努力解决同样的问题。我只能告诉你还有什么是行不通的。

Openlayers documentation解释了如何使用 GML 图层加载 KML 图层。不幸的是,他们在文档中提供的代码片段与他们实际的 example 不匹配。 ,它像大多数其他 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
}
});

它不起作用。

甚至还有加载“ basemap 上本地存储的 GML 矢量数据”的具体示例。它使用与文档相同的代码,因此,不用说,它不起作用。我无法超链接到它,因为我还没有足够的声誉来制作三个超链接,但如果您搜索“GML”的示例,您可以找到它。

Openlayers 有一个安全功能,可以让从完全不同的位置加载数据和 javascript 变得困难(如果你真的必须这样做,还有一个称为“proxyhost”的解决方法)。但是当所有 URL 都指向本地主机时,我看不出这将如何参与。

请保持温柔,这是我的第一篇文章!

编辑:事实证明 a) 它是一种浏览器安全功能,而不是 OpenLayers,并且 b) 它不允许本地主机上的脚本加载本地主机上的任何其他文件,即使您处于离线状态。 Chrome/Chromium 有一个命令行参数 -allow-file-access-from-files。使用此参数,上述示例有效。其他解决方法(谷歌搜索)似乎很棘手。

关于javascript - Openlayers 中的 KML 层在本地主机上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7331997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com