Cíl: Vytvořit aplikaci, která umožní vyhledat místo podle názvu (pomocí externího API) a zobrazit jej na mapě včetně uložení do seznamu. Očekává se, že pro vypracování úkolu logicky propojíte jednotlivé komponenty.
Nejprve do projektu nainstalujte knihovnu Leaflet pro práci s mapami.
npm install leaflet react-leaflet
npm install -D @types/leaflet
Nezapomeňte do souboru s mapou naimportovat základní CSS styl:
import 'leaflet/dist/leaflet.css';
Vaším úkolem je vytvořit alespoň tyto tři komponenty ve složce src/components a následně je propojit na
hlavní obrazovce (Home.tsx):
MyMap.tsx – Vykreslí mapu se všemi místy (špendlíky)CityForm.tsx – Formulář s textovým polem a tlačítkem. Stará se o volání API a
ukládání nového místa.PlaceList.tsx – Scrollovatelný seznam historie vyhledaných míst uvnitř
komponenty IonCard.const [places, setPlaces] = useState<any[]>([]);) by měl
být definován ve vaší rodičovské komponentě (Home.tsx). Teprve z ní se musí stav poslat do všech tří
komponent přes parametry (props).
Může obsahovat komponenty IonInput pro zadání názvu a IonButton. Při kliknutí zavoláte
přes fetch veřejné API Nominatim:
https://nominatim.openstreetmap.org/search?format=json&q=NAZEV_MISTA
Z odpovědi z API (což je pole JSON objektů) si vezměte první prvek a vytáhněte z něj vlastnosti:
display_name (název)lat (zeměpisná šířka) pozor, API vrací text, převeďte na číslo pomocí parseFloat()lon (zeměpisná délka) pozor, API vrací text, převeďte na číslo pomocí parseFloat()Využijte komponenty z react-leaflet. Budete potřebovat minimálně MapContainer,
TileLayer a pak Marker s vloženým textem (Popup).
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
export default function MyMap() {
return (
<MapContainer center={[49.8209, 18.2625]} zoom={8} style={{ height: '70vh', width: '100%' }}>
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<Marker position={[49.8209, 18.2625]}>
<Popup>Ostrava</Popup>
</Marker>
</MapContainer>
);
}
{places.map((place, index) => ( <Marker ... /> ))}
Vykreslete nalezená místa jako Ionic list (IonList a IonItem) a celé to obalte do karty
(IonCard).
Jako rozšíření je možné celou aplikaci rozdělit na dvě záložky pomocí komponenty IonSegment.