При создании «элементов управления» в OpenLayers - т. Е. Кнопок, которые накладываются на карту и которые выполняют действия при нажатии, я могу придумать как минимум два способа достижения таких целей:
Предоставление собственных элементов DOM и взаимодействиенепосредственно с объектом карты
Это мой текущий подход. На веб-сайте, над которым я сейчас работаю: https://seacrifog.saeon.ac.za/atlas, есть две маленькие кнопки в правом верхнем углу. Эти кнопки открывают боковые меню, которые содержат деревья компонентов DOM и логику для взаимодействия с картой через ссылку на объект карты OpenLayers.
Эта ссылка map
доступна всем дочерним элементам компонента, который переносит OpenLayersбиблиотека с помощью шаблона render-props:
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>
Использование OpenLayersol / control / Control class
Я вижу из примера , что можно добавлять кнопки на карту, определяя также дополнительные Control
s. Насколько я могу судить, этот пример показывает, как определить элементы DOM, которые будут добавлены на карту, и как написать eventHandlers (в этом случае щелкните), который позволит вам взаимодействовать с картой так, как вы хотите,По сути, это то же самое, что и мой первоначальный подход.
Вопрос
Есть ли какая-то польза от определения элементов управления картой с использованием ol/control/Control
по сравнению с этим API? Я не могу думать о каких-либо недостатках, связанных с неприменением класса Control
(и на самом деле ... с использованием React. Я могу подумать о причинах НЕ взаимодействовать напрямую с DOM, если мне это действительно не нужно, а также о потенциальном взаимодействии собъект карты из родительского компонента). Хотя я использую OpenLayers 6, я не думаю, что версия имеет значение в этом случае.