Я считаю, что получить границы из библиотеки 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 }
С помощью приведенного выше кода мы сможем перетащить карту и получить границы по долготе и широте, и не стесняйтесь 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='© <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
Надеюсь, это помогло 🤓
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.