Маркеры маршрута на Картах Google — это небольшие значки или символы, расположенные вдоль маршрута для обозначения определенных мест или достопримечательностей. Они служат визуальными подсказками, помогающими пользователям ориентироваться и понимать маршрут.
В этом уроке мы научимся анимировать маркер местоположения на картах маршрутов Google в React js. Вы можете выполнить следующие шаги, чтобы понять функциональность анимации маркеров маршрута Google.
На первом этапе вам нужно будет использовать данную команду для установки новой платформы React.
Избегайте этого шага, если проект уже создан.
npx create-react-app my-react-app
Заходим в папку приложения.
cd my-react-app
@googlemaps/js-api-loader – это удобная библиотека JavaScript, которая предлагает простой способ динамической загрузки API JavaScript Карт Google. .
Эта библиотека опубликована как пакет npm и может быть установлена с помощью команды npm:
npm i @googlemaps/js-api-loader --legacy-peer-deps
–legacy-peer-deps — это параметр, который можно передать команде npm при установке пакетов.
Установка Bootstrap через менеджер пакетов npm позволяет достаточно комфортно управлять проектом.
npm i bootstrap
Теперь создайте новую папку comComponents/. Затем создайте файл MapRoute.js и добавьте приведенный ниже код в файл comComponents/MapRoute.js.
import React from 'react'
function MapRoute() {
return (
<div></div>
)
}
export default MapRoute
Обновите файл comComponents/MapRoute.js, используя приведенный ниже код.
import React, { useState, useRef, useEffect } from "react";
const MapRoute = () => {
const mapRouteRef = useRef(null);
const [routeMap, setRouteMap] = useState(null);
useEffect(() => {
const googleMap = evokeGMap();
setRouteMap(googleMap);
}, []);
useEffect(() => {
if (!routeMap) return;
const routeMapOptions = new window.google.maps.Polyline({
strokeOpacity: 0,
icons: [
{
icon: {
path: "M 0,-0.2 0,0.2",
strokeOpacity: 0.9,
strokeColor: "red",
scale: 4,
},
offset: "0",
repeat: "12px",
},
],
});
const mapDirService = new window.google.maps.DirectionsService();
const mapDirRenderer = new window.google.maps.DirectionsRenderer({
polylineOptions: routeMapOptions,
});
const routeHeight = new window.google.maps.LatLng(35.1234126, -111.3345235);
const beachPoint = new window.google.maps.LatLng(
35.6543201223223,
-111.42119253516212,
);
const rotueReq = {
origin: routeHeight,
destination: beachPoint,
travelMode: "WALKING",
};
mapDirService.route(rotueReq, function (response, status) {
if (status == "OK") {
mapDirRenderer.setDirections(response);
mapDirRenderer.setRouteMap(routeMap);
moveRouteMarker(routeMap, response.routes[0].overview_path);
}
});
}, [routeMap]);
const evokeGMap = () => {
return new window.google.maps.Map(mapRouteRef.current, {
center: new window.google.maps.LatLng(45.5543234, -131.5643268),
zoom: 13,
});
};
const moveRouteMarker = async (map, routeCoord) => {
const marker = new window.google.maps.Marker({
position: routeCoord[0],
routeMap,
icon: {
url: "https://ibb.co/s1KrjvN",
scaledSize: new window.google.maps.Size(35, 35),
},
zIndex: 99,
optimized: false,
});
for (let i = 0; i < routeCoord.length; i++) {
await animateMarker(marker, marker.getPosition(), routeCoord[i], 0.06);
}
};
const animateMarker = async (marker, moveFrom, moveTo, t, delta = 100) => {
return new Promise((resolve) => {
const routeLat = (moveTo.lat() - moveFrom.lat()) / delta;
const routeLong = (moveTo.lng() - moveFrom.lng()) / delta;
let delay = 12 * t,
count = 0;
for (let i = 0; i < delta; i++) {
(function (data) {
setTimeout(function () {
let lat = marker.position.lat();
let lng = marker.position.lng();
lat += routeLat;
lng += routeLong;
marker.setPosition(new window.google.maps.LatLng(lat, lng));
count++;
if (count === delta) {
resolve(marker);
}
}, delay * data);
})(i);
}
});
};
return <div ref={mapRouteRef} style={{ width: 700, height: 350 }} />;
};
export default MapRoute;
Перейдите в папку src/, найдите и откройте файл App.js и импортируйте компонент MapRoute в этот основной входной файл.< /а>
Убедитесь, что вы определили свой ключ API Google Map, чтобы карта работала безупречно.
import React, { useState, useEffect } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import MapRoute from "./components/MapRoute";
import { Loader } from "@googlemaps/js-api-loader";
function App() {
const [mapLoader, setMapLoader] = useState(false);
useEffect(() => {
const options = {
apiKey: "YOUR_GOOGLE_MAP_API_KEY",
version: "weekly",
libraries: ["geometry"],
};
new Loader(options)
.load()
.then(() => {
setMapLoader(true);
})
.catch((error) => {
console.error("Something ain't working; try again later.", error);
});
}, []);
return (
<div className="container mt-3">
<h2 className="mb-3">React Animate Google Map Route Marker Example</h2>
{!mapLoader ? <div>Loading...</div> : <MapRoute />}
<p>
To make the Google map work; add{" "}
<strong>YOUR_GOOGLE_MAP_API_KEY</strong> in <strong>src/App.js</strong>{" "}
entry.
</p>
</div>
);
}
export default App;
Теперь мы готовы протестировать только что созданную функцию.
В командной строке скопируйте и вставьте приведенную ниже команду и нажмите Enter.
npm start
После запуска сервера; ваше приложение будет видно в браузере:
http://localhost:3000