在OpenLayers中创建“控件”时-即按钮可以覆盖地图并在单击时可以执行操作,我可以想到至少两种实现方法:
提供您自己的DOM元素,并直接与Map Object交互
这是我目前的做法。在我目前正在使用的网站上: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})}
</>
)
}
}
然后我发现无需使用OpenLayers Control
类即可轻松构建“控件”:
<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类
我从the example看到,也可以通过定义其他Control
来向地图添加按钮。据我所知,此示例显示了如何定义将添加到Map中的DOM元素,以及如何编写eventHandlers(在这种情况下为click),该事件处理程序将允许您以您希望的方式与地图进行交互。基本上与我最初使用的方法相同。
问题
与不使用此API相比,使用ol/control/Control
定义地图控件有什么好处吗?我不认为不立即使用Control
类有任何弊端(实际上...使用React,我可以想到不直接与DOM进行交互的原因,除非我确实需要,以及可能进行交互与来自父组件的地图对象)。尽管我使用的是OpenLayers 6,但在这种情况下,我认为版本并不重要。