我应该如何在React-leaflet中使用OverlappingMarkerSpiderfier?

时间:2019-04-04 16:49:22

标签: javascript react-leaflet

我正在将现有的Web应用程序重写为React应用程序。最初,leafletOverlappingMarkerSpiderfier一起用于地图  在地图标记之间进行区分。在新应用中,我正在使用react-leaflet。可以使用所有其他使用的插件进行反应,但是我想为OverlappingMarkerSpiderfier创建一个传单自定义组件。我对创建此组件的想法有些不满。

理想情况下,我想在React渲染循环中调用这样的组件。

return (
  <Map>
    <Spiderfy >
      <Marker>
        <Popup>
        </Popup>
      </Marker>
      <Marker>
        <Popup>
        </Popup>
      </Marker>
    </Spiderfy>
  </Map>
  )

OverlappingMarkerSpiderfier示例显示了正在创建的对象的实例,事件侦听器已添加到地图,所有标记均已添加到OMS实例。我尝试将其压缩到ReactLeaflet类中,但到目前为止没有成功。

class _Spiderfy extends MapLayer {

    constructor(props) {
        super(props)
        this.oms = null
    }

    createLeafletElement ({children, leaflet: {map, ...props}})  {
        let newLayer = L.featureGroup()
        this.oms = new OverlappingMarkerSpiderfier(map);

        var popup = new L.Popup();
        this.oms.addListener('click', function(marker) {
            popup.setContent(marker.desc);
            popup.setLatLng(marker.getLatLng());
            map.openPopup(popup);
        });

        this.oms.addListener('spiderfy', function(markers) {
            map.closePopup();
          });

        return newLayer
    }
}

export default withLeaflet(_Spiderfy);

这是我当前拥有的包装器。它呈现子级(所有标记及其弹出窗口),但是单击地图时不执行事件侦听器。我也不知道如何从子级列表中获取Marker对象并将其添加到oms实例中。

有人建议创建此类或其他类似功能的库吗?

1 个答案:

答案 0 :(得分:1)

您已经足够亲密,这里是一个更新的组件版本,该版本演示了如何将OverlappingMarkerSpiderfier-Leaflet集成到React-Leaflet

class Spiderfy extends MapLayer {

  createLeafletElement(props) {
    const { map } = props.leaflet;
    this.oms = this.createOverlappingMarkerSpiderfier(map);
    const el = L.layerGroup();
    this.contextValue = { ...props.leaflet, layerContainer: el };
    return el;
  }

  componentDidMount() {
    super.componentDidMount();
    this.leafletElement.eachLayer(layer => {
      if (layer instanceof L.Marker) {
        this.oms.addMarker(layer);
      }
    });
  }

  createOverlappingMarkerSpiderfier(map) {
    const oms = new window.OverlappingMarkerSpiderfier(map);
    oms.addListener("spiderfy", markers => {
      markers.forEach(m => m.closePopup())//force to close popup 
      if (this.props.onSpiderfy) this.props.onSpiderfy(markers);
    });
    oms.addListener("unspiderfy", markers => {
      if (this.props.onUnspiderfy) this.props.onUnspiderfy(markers);
    });
    oms.addListener("click", marker => {
      if (this.props.onClick) this.props.onClick(marker);
    });
    return oms;
  }
}

export default withLeaflet(Spiderfy);

缺失部分的列表:

  • 通过OverlappingMarkerSpiderfier.addMarker方法从标记列表初始化
  • 事件处理程序的实现

还有here is a demo供您参考