gpt4 book ai didi

javascript - OL3 - 检测功能点击时出现问题

转载 作者:行者123 更新时间:2023-11-27 23:30:40 27 4
gpt4 key购买 nike

我的目标是在 OpenLayers 3 中为我的工作创建一个包含多个图层的 map 。人们从 OpenStreetMaps 获取基本信息。另一个是显示区域轮廓的透明层(尚未完成)。第三个,也是我遇到问题的一个,显示了一系列代表 map 上各个感兴趣地点的图标。我从作为单独脚本文件包含的 JS 数据结构加载站点。我已经设法让我的代码添加显示在正确的纬度/经度处的功能。我的下一步是让一个 HTML 框 (div) 在他们单击图标时出现在 map 前面(以显示站点的详细信息)。但是,我无法让它发挥作用。为我的菜鸟编码道歉,但这确实让我难住了,我真的很感激任何帮助。

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="ol.css" type="text/css">
<link rel="stylesheet" href="map.css" type="text/css">
<script src="ol.js" type="text/javascript"></script>
<script src="sites.js" type="text/javascript"></script>
<script type="text/javascript">


function buildLayerFromSites(allSites)
// allSites is just an array of data structures
{
var count, site;
// for each site in the array, make a feature
for (count=0;count<allSites.length;count++)
{
geom = new ol.geom.Point(ol.proj.fromLonLat([allSites[count].longitude,allSites[count].latitude]));
site = new ol.Feature(geom);
site.Name = allSites[count].siteName; // <-- can I assign further details in the structure like this?


var siteStyle = new ol.style.Style({
image: new ol.style.Icon ({
src: 'icon-blue.png',
scale: 0.1,
opacity: 0.9,
})
})
site.setStyle(siteStyle);
siteFeatures[count] = site;
}
siteSource = new ol.source.Vector ({
features: siteFeatures
})
siteLayer = new ol.layer.Vector({
source: siteSource
});
map.addLayer(siteLayer);
}

</script>
<title>Map</title>
</head><body>
...
<div id="map" class="map">
...

<script type="text/javascript">


var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([115.51, -31.57]),
zoom: 8
})
});
buildLayerFromSites(includeSites); // adds the second layer with the sites


// click event handler, basically same as http://openlayers.org/en/v3.12.1/examples/icon.html
map.on('click', function(evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel,
function(feature,layer) {
return feature;
});
if (feature) {
console.log("feature got clicked on"); // do stuff
} else {
console.log("didn't click a feature");
}
});
</script>
</body>
</html>

map 和图标会加载,但是当我单击图标时,无论我如何放大或缩小,它都不会检测到与我单击的图标匹配。问题是,事件处理程序代码与官方示例中的相同,这让我认为这就是我创建功能的方式。另一方面,这些功能显示为图标,只是单击事件似乎不起作用。示例中鼠标光标的变化也发生了类似的奇怪的事情。我猜这是因为我不明白 OL 中数据/函数的结构方式,而且我发现文档没有完全解释它是如何工作的,所以我一直在写这样的片段试图看一下:

var myLayers = map.getLayers();
console.log("keys - " + myLayers.getKeys); // prints out 'function (){return Object.keys(this.B)}' - what does that mean?
var mySource = myLayers.getSource;
console.log("source" + mySource.getProjection); // doesn't work
var features = mySource.getFeatures; // says mySource is undefined

当然,它完全失败了。

如何让它检测对图标/功能的点击,以便我可以告诉 div 在正确的时间出现并显示我的数据?我这样做对吗?我对数据/函数的工作方式不明白什么?我是一个 JS 菜鸟,所以我希望我没有做一些愚蠢的事情,但这给我带来了巨大的问题,我真的需要你的帮助!谢谢大家!

最佳答案

如果其他人遇到此问题:我的解决方案是将功能图标 PNG 图像更改为不透明(无颜色)。

如果您的图像是 PNG 且具有透明度,

where it is transparent it won't be clickable

(我使用的是 OpenLayers v5)。例如,我有一个圆形图像,它的内部是透明的,只是在外部边框上着色。当我将图像更改为中间不透明的图像时(当然它仍然可以是PNG),一切都很好。看起来这就是 OpenLayers 处理图像像素的方式 - 如果可以通过图像看到 map ,那么即使您位于功能上,它也不是“悬停”。

关于javascript - OL3 - 检测功能点击时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607413/

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