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>
    )
};
  • Вопрос задан
  • 416 просмотров
Решения вопроса 1
@EmelyanovKonstantin
GIS архитектура, аналитика, разработка
Посмотри так.
<MarkerClusterGroup>
                {
                    markers
                }
                onMarkerClick={(marker) => console.log(marker, marker.getLatLng())}
</MarkerClusterGroup>

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

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

Похожие вопросы