Ошибка при попытке сопоставить хороплет с помощью react-leaflet-choropleth: невозможно прочитать свойство «карта» неопределенного

Я пытаюсь сделать хороплет в react, используя react-leaflet-choropleth.

У меня листовка работает нормально.
Теперь, когда я пытаюсь загрузить geojson (crimes_by_district) с помощью библиотеки, я получаю сообщение об ошибке при сопоставлении функций, а именно:

Cannot read property 'map' of undefined

Кажется, я не точно ссылаюсь на правильный массив для сопоставления.

Я просмотрел проблемы в репозитории git и безуспешно пробовал предложения. Мне интересно, возможно, я ссылаюсь на неправильные значения из geoJson, которые я использую.

Ниже мой код:

Leaf.js (отображается в App.js)

import React, { Component } from 'react';
import { Map, TileLayer } from 'react-leaflet';
import classes from './leaf.module.css'
import Choropleth from 'react-leaflet-choropleth'
import geojson from "./assets/crimes_by_district.geojson";
    
const style = {
   fillColor: '#F28F3B',
   weight: 2,
   opacity: 1,
   color: 'white',
   dashArray: '3',
   fillOpacity: 0.5
};
    
class Leaf extends Component {
   render() { 
      return (         
         <Map>
           <Choropleth
             data= {{type: 'FeatureCollection', features: geojson.features}}
             valueProperty = {(feature) => feature.properties.value}
             // visible = {(feature) => feature.id !== active.id}
             scale = {['#b3cde0', '#011f4b']}
             steps = {7}
             mode='e'
             style = {style}
             onEachFeature = {
               (feature, layer) => layer.bindPopup(feature.properties.label)
             }
             ref = {(el) => this.choropleth = el.leafletElement}
           />
         </Map>
      );
   }
}
    
export default Leaf;
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
3
0
393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создайте свой собственный choropleth wrapper, используя ту же библиотеку choropleth, аналогичную расширению, которое вы включаете, поскольку react-leaflet-choropleth кажется устаревшим:

function Choropleth() {
  const { map } = useLeaflet();

  useEffect(() => {
    fetch(
      "https://raw.githubusercontent.com/timwis/leaflet-choropleth/gh-pages/examples/basic/crimes_by_district.geojson"
    )
      .then((response) => response.json())
      .then((geojson) => {
        L.choropleth(geojson, {
          valueProperty: "incidents", // which property in the features to use
          scale: ["white", "red"], // chroma.js scale - include as many as you like
          steps: 5, // number of breaks or steps in range
          mode: "q", // q for quantile, e for equidistant, k for k-means
          style,
          onEachFeature: function (feature, layer) {
            layer.bindPopup(
              "District " +
                feature.properties.dist_num +
                "<br>" +
                feature.properties.incidents.toLocaleString() +
                " incidents"
            );
          }
        }).addTo(map);
      });
  }, []);

  return null;
}

а затем импортируйте его как дочернюю карту:

<Map center = {position} zoom = {11} style = {{ height: "100vh" }}>
        <TileLayer
          attribution='&copy; <a href = "http://osm.org/copyright">OpenStreetMap</a> contributors'
          url = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
   <Choropleth />
</Map>

вы можете расширить его еще больше, передав различные переменные, которые вам нужны в качестве реквизита.

Демо

Другие вопросы по теме