튜토리얼: React ⚛ + 전단지 🗺
이를 위해 우리는 파리의 관광지를 찾을 수 있는 웹 앱을 만들 것입니다! 🇫🇷 🥖.
https://react-leaflet-example.netlify.app/에서 데모를 확인할 수 있습니다. 🚀
전단지란?
Leaflet은 대화형 지도를 위한 가장 인기 있는 오픈 소스 라이브러리입니다. 지도에 마커를 추가하고 원, 사각형, 선 및 훨씬 더 흥미로운 것들을 만들 수 있습니다. 자세한 내용은 설명서를 확인하십시오. https://leafletjs.com/
우리가 할 일 : 📝
For a sake of visibility, I will put only some part of the code in this article, but feel free to check the source code on Github repo
설치 ⚙️
먼저 이 프로젝트에 대한 종속성을 만들고 설치해 보겠습니다.
npx create-react-app react-leaflet-example --template typescript
npm i -S leaflet react-leaflet
npm i -D @types/leaflet
지도 보기 🗺
이제 필요한 모든 것을 설치했으므로 Map이라는 새 구성 요소를 만들어 보겠습니다. 그리고 설명서에서 시작 코드를 추가합니다.
그것은 MapContainer를 사용하고 우리는 지도를 우리 도시의 중심에 놓기 위해 몇 가지 좌표를 전달합니다.
TileLayer is used to show copyright on the Map
import { MapContainer, TileLayer } from "react-leaflet";
const Map = () => {
const defaultPosition: LatLngExpression = [48.864716, 2.349]; // Paris position
return (
<div className="map__container">
<MapContainer
center={defaultPosition}
zoom={13}
>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
</MapContainer>
</div>
);
};
지도에 마커 표시 📍
지도에는 아직 장소가 없습니다. 이제 몇 가지 기본 장소를 추가해 보겠습니다. 이를 위해 다음 속성을 사용하여 미리 장소 배열을 만들었습니다.
import { LatLngExpression } from "leaflet";
export interface Place {
id: string;
picture: string;
title: string;
description: string;
seeMoreLink: string;
position: LatLngExpression;
}
In my application, I use redux to handle state management of places, show preview modal, etc. I skip how to create/use a store with react-redux. You can check the code on githup repo
이제 장소 배열을 가져오고 각 장소에 대해 Marker 구성 요소를 사용하겠습니다. 마커는 우리 장소의 위치를 소품으로 필요로 합니다. 클릭하여 장소 설명을 표시하는 것과 같은 이벤트도 처리할 수 있습니다.
Marker's options에 대해 자세히 확인
import { MapContainer, TileLayer, Marker, Tooltip } from "react-leaflet";
import { LatLngExpression } from "leaflet";
const Map = ({places}) => {
const defaultPosition: LatLngExpression = [48.864716, 2.349]; // Paris position
const showPreview = (place) => {
// show place's description
}
return (
<div className="map__container">
<MapContainer
center={defaultPosition}
zoom={13}
>
{places.map((place: Place) => (
<Marker
key={place.id}
position={place.position} // 👈
eventHandlers={{ click: () => showPreview(place) }}
>
{/* show place's title on hover the marker */}
<Tooltip>{place.title}</Tooltip>
</Marker>
))}
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
</MapContainer>
</div>
);
};
지도에 새 마커 추가 ➕📍
시원한! 이제 지도에 마커가 있지만 새 장소를 동적으로 추가하는 방법은 무엇입니까? 지도를 클릭할 때 새 장소를 추가하고 싶다고 가정해 보겠습니다.
클릭 시 새 위치를 표시하기 위해 이를 처리하고 상점을 업데이트할 AddMarker라는 새 구성 요소를 만들 것입니다.
이 구성 요소에서는 useMapEvents 후크를 사용합니다.
import { MapContainer, TileLayer, Marker, Tooltip, useMapEvents } from "react-leaflet";
const AddMarker = () => {
const [position, setPosition] = useState(null);
useMapEvents({
click: (e) => {
setPosition(e.latlng); // 👈 add marker
/* CODE TO ADD NEW PLACE TO STORE (check the source code) */
},
});
return position === null ? null : (
<Marker position={position}></Marker>
);
};
const Map = ({places}) => {
/* ... */
return (
<div className="map__container">
<MapContainer
center={defaultPosition}
zoom={13}
>
{/* ... */}
<AddMarker/>
{/* ... */}
</MapContainer>
</div>
);
};
파리를 방문할 때 파리 생제르맹 경기장을 추가합시다 ⚽️
따라서 클릭하면 새 장소를 추가하는 양식이 표시됩니다.
저장하면 새 장소가 지도에 추가됩니다 🎉.
선 그리기 ✏️
지도에 마커를 추가하는 방법을 배웠으므로 이제 각 마커 사이에 선을 그려 보겠습니다.
이를 위해 Polyline 구성 요소를 사용합니다.
이 구성 요소에는 선을 그리기 위한 위치 목록이 필요합니다. 이제 장소로 위치 배열을 만들어 봅시다.
I'll use useEffect to create this array only when places change.
const Map = ({ places }) => {
const [polyLineProps, setPolyLineProps] = useState([]);
useEffect(() => {
setPolyLineProps(places.reduce((prev: LatLngExpression[], curr: Place) => {
prev.push(curr.position);
return prev
;
}, []))
}, [places]);
return (
<MapContainer
center={defaultPosition}
zoom={13}
scrollWheelZoom={false}
style={{ height: "100vh" }}
zoomControl={false}
>
{/* ... */}
<Polyline positions={polyLineProps} /> {/* 👈 */}
{/* ... */}
</ MapContainer>
)
}
결론
이 기사에서는 동적으로 마커를 추가하고 선을 그리는 것과 같이 지도를 표시하고 지도와 상호 작용하는 데 성공했습니다. 더 나아가려면 circle 또는 rectangle 을 그릴 수 있습니다.
그것이 당신 중 일부를 도왔기를 바랍니다.
읽어 주셔서 감사합니다. 😇
Github 👈에서 사용 가능한 소스 코드
출처
Reference
이 문제에 관하여(튜토리얼: React ⚛ + 전단지 🗺), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maj07/tutorial-react-leaflet-d65텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)