Я считаю, что получить границы из библиотеки leaflet Js очень просто, но использование этой функции может быть немного сложным. Поэтому позвольте мне привести пример использования функции get bounds в контексте проекта путем получения местоположения из API (в данном случае данные JSON с долготой и широтой).
Живой проект здесь
В этой статье будут рассмотрены следующие моменты :
Прежде всего, позвольте мне провести вас по ситуации, чтобы мы получили четкое представление о том, что мы пытаемся здесь реализовать.
В этом случае пользователи автоматически определяются с помощью метода определения местоположения для 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 для хранения местоположения пользователя, чтобы не летать к нему ✈️ при каждой загрузке страницы, вы также можете подумать о добавлении загрузчика.
Этот фрагмент кода позволит нам использовать границы, когда мы будем получать данные о местоположении.
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='© <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
Надеюсь, это помогло 🤓
19.03.2023 13:43
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем запускать наши php-файлы через localhost на наших компьютерах. Мне с трудом удалось установить его и я решил поделиться этой статьей, чтобы помочь тем,...
19.03.2023 13:03
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после поставщика контекста. Это позволит избежать ненужных повторных рендеров.
19.03.2023 11:50
Лично я попрощался с операторами print() в python. Без шуток.
19.03.2023 06:15
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они постоянно обновляют версию (а нам нужно быстро наверстать упущенное!).
18.03.2023 11:32
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
18.03.2023 11:16
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки наряду с HTML и JavaScript.