Как мне использовать OverlappingMarkerSpiderfier с реактивной листовкой? - PullRequest
1 голос
/ 04 апреля 2019

Я переписываю существующее веб-приложение в приложение React. В оригинале листовка используется для карт вместе с OverlappingMarkerSpiderfier создать различие между маркерами карты. В новом приложении я использую Reaction-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 Ответ

1 голос
/ 07 апреля 2019

Вы были достаточно близко, вот обновленная версия компонента, которая демонстрирует, как интегрировать 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 метода
  • реализация обработчиков событий

И здесь приведена демонстрационная версия для справки

...