Как использовать get bounds с react-leaflet и данными JSON

RedDeveloper
02.01.2023 20:08
Как использовать get bounds с react-leaflet и данными JSON

Я считаю, что получить границы из библиотеки leaflet Js очень просто, но использование этой функции может быть немного сложным. Поэтому позвольте мне привести пример использования функции get bounds в контексте проекта путем получения местоположения из API (в данном случае данные JSON с долготой и широтой).

Живой проект здесь

В этой статье будут рассмотрены следующие моменты :

  • Определение местоположения пользователя с помощью метода locationfound(e)
  • Добавление компонента внутри карты для получения границ поля карты
  • Сопоставление данных JSON для отображения только тех мест, которые находятся в границах карты.
Aid App platform

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

1 - Определение текущего местоположения пользователя

В этом случае пользователи автоматически определяются с помощью метода определения местоположения для Leaflet проверьте следующий пример или проверьте codesandbox

import React,{useEffect, useState} from 'react';
import {useMapEvents} from 'react-leaflet';

const LocateUser = () => {
    
        const map = useMapEvents({
          locationfound(e) {
           map.panTo(e.latlng, map.setView(e.latlng))
           //save location to user session 
            sessionStorage.setItem('userLocation', JSON.stringify(e.latlng));
            localStorage.setItem('userLocation', JSON.stringify(e.latlng));
            map.loading = false;
            setLoading(false);
          },
        })

        useEffect(() => {
          map.locate()
        }, [map])

        
        
        return null;
      
      };

export default LocateUser;

Если вы заметили, что в дополнение к определению местоположения пользователя я использовал sessionStorage для хранения местоположения пользователя, чтобы не летать к нему ✈️ при каждой загрузке страницы, вы также можете подумать о добавлении загрузчика.

2 - Пользовательский компонент для получения границ карты

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

import {
  MapContainer,
  Marker,
  Popup,
  mapRef,
  TileLayer,
  useMapEvents
} from "react-leaflet";

export default function NameOfYourFunction() {
   
   const [request, setRequest] = React.useState([])
   const mapRef = useRef();
   const [currentBoundaries, setCurrentBoundaries] = useState(null);

// create a const to fetch the requests with axios or fetch 
// useEffect

//this is the component that we will use to get the boundries of the map
const InnerComponent = ({ setBoundaries }) => {
    useMapEvents({
      moveend() {
        const map = mapRef.current;
        if (map != null) {
          const { _southWest, _northEast } = map.getBounds();
          setBoundaries({
            _southWest: [_southWest.lat, _southWest.lng],
            _northEast: [_northEast.lat, _northEast.lng]
          });
        }
      },
      dragend() {
        const map = mapRef.current;
        if (map != null) {
          const { _southWest, _northEast } = map.getBounds();
          setBoundaries({
            _southWest: [_southWest.lat, _southWest.lng],
            _northEast: [_northEast.lat, _northEast.lng]
          });
        }
      }
    });
    return null;
  };
// you will return the map here 
}

3 - Получение данных и возврат карты

После того как у вас есть данные в формате JSON, получите их с помощью Axios или fetch и создайте цикл следующим образом:

let counter = 0;

for (let i = 0; i < request.length; i++) {
  if (request[i].latitude >= mapRef.current.getBounds()._southWest.lat &&
  request[i].latitude <= mapRef.current.getBounds()._northEast.lat &&
  request[i].longitude >= mapRef.current.getBounds()._southWest.lng &&
  request[i].longitude <= mapRef.current.getBounds()._northEast.lng) counter++;
}

Наконец, отобразите данные на карте

  return (
    <>
       <MapContainer center = {position}  zoom = {13} scrollWheelZoom = {true} ref = {mapRef}>
       <LocateUser  />
          <InnerComponent setBoundaries = {setCurrentBoundaries} />
          <TileLayer
            attribution='&copy; <a href = "https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
            url = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
                <Marker key = {request.id} position = {{ lat: request.latitude, lng: request.longitude }} icon = {markerIcon}>
                  <Popup>
                    {request.description} 
                  </Popup>
                </Marker>
        </MapContainer> 
   <div class = "container">
{request.map((request) => {
                if (request.latitude >= mapRef.current.getBounds()._southWest.lat &&
                  request.latitude <= mapRef.current.getBounds()._northEast.lat &&
                  request.longitude >= mapRef.current.getBounds()._southWest.lng &&
                  request.longitude <= mapRef.current.getBounds()._northEast.lng)
                  return (
                        {/* return the UI components here*/}
                )})}
   </div>
</>
)

Чтобы получить более глубокое представление об этом, проверьте GitHub repo

Надеюсь, это помогло 🤓

Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы

19.03.2023 13:43

Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...

Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах

19.03.2023 13:03

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

Библиотека для работы с мороженым
Библиотека для работы с мороженым

19.03.2023 11:50

Лично я попрощался с операторами print() в python. Без шуток.

Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp

19.03.2023 06:15

Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они постоянно обновляют версию (а нам нужно быстро наверстать упущенное!).

Уроки CSS 6
Уроки CSS 6

18.03.2023 11:32

Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.

Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?

18.03.2023 11:16

CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки наряду с HTML и JavaScript.