Поскольку содержимое Map
недоступно в componentDidMount
время (https://github.com/PaulLeCam/react-leaflet/issues/106#issuecomment-161594328), вы не можете получить границы FeatureGroup
в этот момент и из всех refs
, которые вы назначаете, только Map
ссылка будет доступна в this.refs
.
Однако, согласно этому комментарию GitHub: https://github.com/PaulLeCam/react-leaflet/issues/106#issuecomment-366263225 вы можете дать FeatureGroup
onAdd
функцию обработчика:
<FeatureGroup ref="features" onAdd={this.onFeatureGroupAdd}>...
и затем вы можете использовать Map
ссылки для доступа к leafletElement
и вызова fitBounds
с границами цели входящего события, которая будет FeatureGroup
:
onFeatureGroupAdd = (e) => {
this.refs.map.leafletElement.fitBounds(e.target.getBounds());
}
Это затем "масштабирует" карту в соответствии с вашими FeatureGroup
, как вам нужно.
Обновление
Я изменил свой компонент React так, чтобы масштабирование и центр управлялисьпо параметрам запроса. Проблема с вышеупомянутым решением состояла в том, что если вы увеличите, например, MarkerClusterGroup
, щелкнув по нему, он обновит масштаб в URL-адресе, повторно отобразит карту и повторно вызовет onFeatureGroupAdd
, таким образом отменяя все качества кластера маркеров.
Мне нужно было получить доступ к уровню увеличенияМне нужно держать хорошо нарисованный круг в границах, затем обновить URL с правильным уровнем масштабирования и центром.
onDrawCircle = (e) => {
...
var targetZoom = this.refs.map.leafletElement.getBoundsZoom(e.layer.getBounds());
// Call function to update url here:
functionToUpdateUrl(targetZoom, e.layer.getBounds().getCenter());
}
}
Для того, чтобы иметь возможность контролировать всю карту, я также называю functionToUpdateUrl
вОбработчики событий onZoomEnd
и onDragEnd
, например:
onChangeView = (e) => {
functionToUpdateUrl(e.target._zoom, this.refs.map.leafletElement.getCenter());
}
и один для обработки щелчков кластера:
onClusterClick = (e) => {
// This time we want the center of the layer, not the map?
functionToUpdateUrl(e.target._zoom, (e.layer ? e.layer.getBounds().getCenter() : e.target.getBounds().getCenter()));
}
Затем при рендеринге элемента Map передайте следующие свойства:
<Map
center={center}
ref='map'
zoom={zoom}
maxZoom={18}
onZoomEnd={this.onChangeView}
onDragEnd={this.onChangeView}
>
....
</Map>
И не забудьте дать любому MarkerClusterGroup
s onClusterClick
обратный вызов:
<MarkerClusterGroup onAdd={this.onMarkerGroupAdd} onClusterClick={this.onClusterClick}>