在 OpenLayers 中创建“控件”时 - 即覆盖地图并在单击时执行操作的按钮,我可以想到至少两种实现方法:
提供您自己的 DOM 元素,并直接与 Map 对象交互
这是我目前的做法。在我目前正在开发的网站上:https ://seacrifog.saeon.ac.za/atlas ,右上角有 2 个小按钮。这些按钮打开包含 DOM 组件树和逻辑的侧面菜单,用于通过对 OpenLayers 地图对象的引用与地图进行交互。
map
通过 render-props 模式包装 OpenLayers 库的组件的所有子组件都可以使用此引用:
class MyMap extends Component {
// Constructor/lifecycle methods/etc.
this.map = new Map(...)
...
render() {
return (
<>
<div ref={this.mapRef} />
{this.props.children({map: this.map})}
</>
)
}
}
Control
然后我发现在不使用 OpenLayers类的情况下构建“控件”非常容易:
<MyMap>
{({map}) => (
<>
{/* Each of these renders a button and other DOM elements */}
<Component1ThatUsesTheMap map={map} />
<Component2ThatUsesTheMap map={map} />
<Component3ThatUsesTheMap map={map} />
</>
)}
</MyMap>
使用 OpenLayers ol/control/Control 类
我从示例中看到,也可以通过定义附加Control
s 将按钮添加到地图中。据我所知,这个例子展示了如何定义将添加到地图中的 DOM 元素,以及如何编写事件处理程序(在本例中为单击)以允许您以您想要的方式与地图交互. 这与我使用初始方法的方式基本相同。
问题
ol/control/Control
使用与不使用此 API定义地图控件有什么好处?我想不出不临时使用Control
类的任何缺点(实际上......使用 React 我可以想到不直接与 DOM 交互的原因,除非我真的需要,以及可能与来自的地图对象交互父组件)。虽然我使用的是 OpenLayers 6,但我认为在这种情况下版本并不重要。