我通过互联网上的杂项脚本和渲染算法开发了OpenStreetMaps的画布可视化。除此之外,我还有一个Kinetic Stage,可以绘制Openlayers功能无法绘制的自定义对象。
Openlayers提供了许多我想要使用的功能,因此我试图切换到这个框架。我目前仍然坚持事件传播,因为我不知道如何将事件传播给Openlayers。
的的index.html 的
<div id="canvasdiv">
<div id="KineticDiv"> </div>
<div id="OLMapDiv"> </div>
</div>
的的style.css 的
#KineticDiv {
position: absolute;
z-index: 1000;
}
#OLMapDiv {
position: absolute;
width: 1000px;
height: 600px;
z-index: 0;
}
的 ol.js 的
function OpenLayersMap(divname) {
var osmLayer = new OpenLayers.Layer.OSM("Open Street Maps",
["http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
"http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
"http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"]);
]);
var gmLayer = new OpenLayers.Layer.Google("Google Maps");
var proj = new OpenLayers.Projection("EPSG:4326");
OpenLayers.ImgPath = "/static/img/";
this.map = new OpenLayers.Map({
div: divname,
allOverlays: false,
theme: null,
controls: [
new OpenLayers.Control.Attribution(),
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.ScaleLine(),
new OpenLayers.Control.MousePosition({
displayProjection: proj
}),
new OpenLayers.Control.KeyboardDefaults()
]
});
this.map.addLayers([osmLayer, gmLayer]);
this.map.setCenter(
new OpenLayers.LonLat(8.56, 50).transform(proj, this.map.getProjectionObject()), 10
);
}
OpenLayersMap.prototype = {
constructor: OpenLayersMap
}
的 main.js 的
function main() {
var self = this;
this.olmap = new OpenLayersMap("OLMapDiv");
this.kinetic = new KineticStage("KineticDiv");
$("div#canvasdiv").bind("mouseout", function(event){
// TODO self.olmap.mouseOut(event);
}).bind("mouseup", function(event){
// TODO self.olmap.mouseUp(event);
}).bind("mousedown", function(event){
// TODO self.olmap.mouseDown(event);
}).bind("mousewheel", function(event, delta){
// TODO self.olmap.mouseWheel(event, delta);
}).bind("touchmove", function(event){
// TODO self.olmap.touchMove(event);
}).bind("touchstart", function(event){
// TODO self.olmap.touchStart(event);
}).bind("touchend", function(event){
// TODO self.olmap.touchEnd(event);
});
}
由于Kinetic Stage的z-index较高,因此可以识别事件。只有在击中动能形状时才会停止事件传播!
Openlayers中是否有接受事件的合适方法? (我找到了OpenLayers.Events.triggerEvent,但我没有成功)
提前致谢...
答案 0 :(得分:0)
我想出了一个几乎令人满意的解决方案。用户只需要处理几个事件。用
替换TODOself.olmap.map.events.handleBrowserEvent(event);
启用地图上的拖放功能。以下是如何处理鼠标滚轮事件的示例:
// main.js
$("div#canvasdiv").bind("mousewheel", function(event, delta){
self.olmap.zoom(event, delta);
})
// ol.js
zoom : function(event, delta) {
if(this.zoomExpireTime && this.zoomExpireTime == 0) {
this.zoomExpireTime = event.timeStamp - 1;
}
if(this.zoomExpireTime < event.timeStamp) {
this.map.zoomTo(this.map.getZoom() + delta);
this.zoomExpireTime = event.timeStamp + 500;
}
}
无法使用OpenLayers的控件,因为它们只对点击事件做出反应,而不是对mousedown事件做出反应。我试图将mousedown事件转换为点击事件,但随后拖放不再起作用。因此,我做了一个解决方法,只将控件提升到顶部,如下所示:
var z = parseInt($("div#KineticDiv").css("z-index")) + 100;
$("div[id=OpenLayers\\.Control\\.LayerSwitcher_8]").css("z-index", z);
$("div[id=OpenLayers\\.Control\\.LayerSwitcher_8]").appendTo($("div#canvasdiv"));
$("div[id=OpenLayers\\.Control\\.PanZoomBar_9]").css("z-index", z);
$("div[id=OpenLayers\\.Control\\.PanZoomBar_9]").appendTo($("div#canvasdiv"));
所以这是我的第一个临时解决方案,但我认为有可能改进它...