Как использовать 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 
}

С помощью приведенного выше кода мы сможем перетащить карту и получить границы по долготе и широте, и не стесняйтесь console.info & оставить комментарий ниже, если все пойдет не так 😅

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 в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.