Задать вопрос
GeorgeGeorge
@GeorgeGeorge
Студент

Popup не отображает данные в MarkerClusterGroup react leaflet?

Всем привет! С Сервера приходят данные в json, после получения я отображаю на карте Leaflet. Так как маркеров получается много, то я объединяю их в кластеры с помощью MarkerClusterGroup, кластеры появляются вместе с маркерами, но попапы по клику не отображают информацию, без кластеров все работает нормально. Кто делал подобное? Нужна помощь, гугл не помог(

5dd2b0997550e228718761.jpeg

5dd2b0a5e3846605011593.jpeg

import React, {Component} from "react";
import MapService from "../../services/map-service";

import {Map, TileLayer, Marker, Popup} from "react-leaflet";
import MarkerClusterGroup from 'react-leaflet-markercluster';

import Spinner from "../../spinner";
import ErrorIndicator from "../../error-indicator";

import {ListGroup, ListGroupItem} from "react-bootstrap";

import "./geo-map.css";
import 'react-leaflet-markercluster/dist/styles.min.css';

export default class GeoMap extends Component {

    mapService = new MapService();

    state = {
        data: [],
        loading: true,
        error: false
    };

    componentDidMount() {
        this.updateMap();
    }

    onGeoDataLoaded = (data) => {
        this.setState({
            data: data,
            loading: false,
            error: false
        });
    };

    onError = (error) => {
        this.setState({
            error: true,
            loading: false
        })
    };

    updateMap() {
        this.mapService.getProjects().then(this.onGeoDataLoaded).catch(this.onError);
    }

    render() {

        const {data, loading, error} = this.state;

        const hasData = !(loading || error);
        const errorView = error ? <ErrorIndicator/> : null;
        const spinner = loading ? <Spinner/> : null;
        const mapView = hasData ? <MapView data={data}/> : null;

        return (
            <div className="geo-map">
                {errorView}
                {spinner}
                {mapView}
            </div>
        )
    }
}

const createMarkers = (data) => {
    return data.data.map((item, index) => (
        <Marker key={item.id} position={[item.geoJson.coordinates[1], item.geoJson.coordinates[0]]}>
            <Popup maxWidth="auto">
                <ListGroup variant="flush">
                    <ListGroupItem>
                        <strong>Наименование</strong><br/>
                        {item.name}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Дата закрытия контракта</strong><br/>
                        {item.endDate}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Заказчик</strong><br/>
                        {item.contractor}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Номер договора</strong><br/>
                        {item.contractNumber}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Путь к полевым мат.</strong><br/>
                        {item.dataPathRequest}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Путь к камер. мат.</strong><br/>
                        {item.dataPathResponse}
                    </ListGroupItem>
                    <ListGroupItem>
                        <strong>Путь к паспорту </strong><br/>
                        {item.passportPath}
                    </ListGroupItem>
                </ListGroup>
            </Popup>
        </Marker>
    ))
};

const MapView = (data) => {
    console.log("Data from state", data);
    const markers = createMarkers(data);
    return (
        <Map center={[39.90, 48.98]} zoom={4} maxZoom={22} attributionControl={true} zoomControl={true}
             doubleClickZoom={true} scrollWheelZoom={true} dragging={true} animate={true} easeLinearity={0.35}>
            <TileLayer url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'/>
            <MarkerClusterGroup>
                {
                    markers
                }
            </MarkerClusterGroup>
        </Map>
    )
};
  • Вопрос задан
  • 429 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
@EmelyanovKonstantin
GIS архитектура, аналитика, разработка
Посмотри так.
<MarkerClusterGroup>
                {
                    markers
                }
                onMarkerClick={(marker) => console.log(marker, marker.getLatLng())}
</MarkerClusterGroup>

Если способ не устарел. Можно добавлять инфу из данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽