我目前正试图在WPF窗口中更新一个程序内的地图,从OpenLayers 3到6.3.1。然而,我遇到了一个问题,鼠标没有传递到地图上。
我正在做的软件在路线图上画了一堆边框(使用Basemap),以显示在给定时间内的运力利用率,并计算出理想的路线之类的东西(类似于谷歌地图)。当我点击地图时,它应该在第二个窗口中显示离我最近的边缘的可用数据,这些方法已经实现了,我只需要找出我点击的位置。
我使用的代码看起来像这样。 (缩短了一些我可能不应该分享的东西)
index.html.s: 列表中的内容。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=edge">
<script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL"></script>
<script src ="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<div id="map" class="map"></div>
<script src="index.js"></script>
</body>
</html>
index.js:
import Map from 'ol/Map.js';
import View from 'ol/View.js';
import TileLayer from 'ol/layer/Tile.js';
import WMTS, {optionsFromCapabilities} from 'ol/source/WMTS.js';
import WMTSCapabilities from 'ol/format/WMTSCapabilities.js';
import {fromLonLat} from 'ol/proj';
import {toLonLat} from 'ol/proj';
import {defaults as defaultInteractions} from 'ol/interaction';
import 'ol-layerswitcher/src/ol-layerswitcher.css';
import LayerSwitcher from 'ol-layerswitcher';
var capabilitiesUrl = 'https://www.basemap.at/wmts/1.0.0/WMTSCapabilities.xml';
var map = new Map({
layers: [],
target: 'map',
view: new View({
center: [0,0],
zoom: 2
}),
interactions: defaultInteractions()
});
var layerSwitcher = new LayerSwitcher();
map.addControl(layerSwitcher);
fetch(capabilitiesUrl).then(function(response) {
return response.text();
}).then(function(text) {
var result = new WMTSCapabilities().read(text);
var options = optionsFromCapabilities(result, {
layer: hidpiLayer,
matrixSet: 'google3857',
style: 'normal'
});
map.addLayer(new TileLayer({
title: 'Basemap',
type: 'base',
source: new WMTS((options))
}));
});
当我在浏览器中运行它时,它的工作没有任何问题, 但在WPF中,我不能拖动地图, 而且它也没有登记任何鼠标点击。拖动不会那么糟糕,因为我仍然可以用键盘移动,但点击对程序的功能至关重要。
我猜测问题出在OpenLayers和WPF之间的通信中,但在OpenLayers 3上它可以工作,所以我真的不知道该从哪里找。
如果有人能给我指出正确的方向,我会非常感激,因为我已经没有办法了。
这里是一个如何处理DoubleClick事件的例子。
.NET
Private WithEvents m_Document As mshtml.HTMLDocument
Private Sub WebBrowserControl_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles WebBrowserControl.Navigated
m_Document = TryCast(Me.WebBrowserControl.Document, mshtml.HTMLDocument)
If m_Document IsNot Nothing Then AddHandler m_Document.ondblclick, AddressOf DoubleClickHandler
End Sub
Private Function DoubleClickHandler() As Boolean
If Mouse.Capture(Me.WebBrowserControl) Then
Dim m_Position As Point = Mouse.GetPosition(Me.WebBrowserControl)
Mouse.Capture(Nothing)
Dim m_Object() As Object = {m_Position.X, m_Position.Y}
Me.WebBrowserControl.InvokeScript("centerMap", m_Object)
Return True
Else
Return False
End If
End Function
另外,不需要捕捉鼠标指针。
Private WithEvents m_Document As mshtml.HTMLDocument
Private Sub WebBrowserControl_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles WebBrowserControl.Navigated
m_Document = TryCast(Me.WebBrowserControl.Document, HTMLDocument)
If m_Document IsNot Nothing Then
Dim m_DocumentEvent As HTMLDocumentEvents2_Event = TryCast(m_Document, HTMLDocumentEvents2_Event)
If m_DocumentEvent IsNot Nothing Then AddHandler m_DocumentEvent.ondblclick, AddressOf DoubleClickEventHandler
End If
End Sub
Private Function DoubleClickEventHandler(ByVal e As IHTMLEventObj) As Boolean
Dim m_Object() As Object = {e.clientX, e.clientY}
Try
Me.WebBrowserControl.InvokeScript("centerMap", m_Object)
Catch
Return False
End Try
Return True
End Function
JavaScript
function centerMap(x, y) {
map.getView().setCenter(map.getCoordinateFromPixel([x, y]));
}