因为 的内容Map
在componentDidMount
-time不可用(https://github.com/PaulLeCam/react-leaflet/issues/106#issuecomment-161594328)你无法FeatureGroup
在那个时候得到的界限,而且 refs
你分配,只有Map
ref 将在this.refs
.
然而,按本GitHub的评论:https://github.com/PaulLeCam/react-leaflet/issues/106#issuecomment-366263225你可以给FeatureGroup
一个onAdd
处理函数:
<FeatureGroup ref="features" onAdd={this.onFeatureGroupAdd}>...
然后您可以使用Map
refs 访问leafletElement
并调用fitBounds
传入事件目标的边界,这将是FeatureGroup
:
onFeatureGroupAdd = (e) => {
this.refs.map.leafletElement.fitBounds(e.target.getBounds());
}
然后,这将FeatureGroup
根据需要将地图“放大”到您的 边界。
更新
我修改了我的 React 组件,以便缩放和中心由查询参数控制。上述解决方案的问题在于MarkerClusterGroup
,例如,如果您通过单击放大 a ,它将更新 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>
并记住给 anyMarkerClusterGroup
的onClusterClick
回调:
<MarkerClusterGroup onAdd={this.onMarkerGroupAdd} onClusterClick={this.onClusterClick}>