234 lines
5.2 KiB
Markdown
234 lines
5.2 KiB
Markdown
|
|
# 🗺️ **Opções de Mapas para Expo Go**
|
||
|
|
|
||
|
|
## ✅ **Componentes de Mapa Compatíveis**
|
||
|
|
|
||
|
|
### **1. react-native-maps (RECOMENDADO) ⭐**
|
||
|
|
|
||
|
|
**Instalação:**
|
||
|
|
```bash
|
||
|
|
npx expo install react-native-maps
|
||
|
|
```
|
||
|
|
|
||
|
|
**Vantagens:**
|
||
|
|
- ✅ **100% compatível** com Expo Go
|
||
|
|
- ✅ **Suporte nativo** para iOS e Android
|
||
|
|
- ✅ **Desenho de rotas** com `Polyline`
|
||
|
|
- ✅ **Marcadores customizados** com `Marker`
|
||
|
|
- ✅ **Controles de mapa** completos
|
||
|
|
- ✅ **Performance nativa** excelente
|
||
|
|
|
||
|
|
**Exemplo de uso:**
|
||
|
|
```tsx
|
||
|
|
import MapView, { Marker, Polyline } from 'react-native-maps';
|
||
|
|
|
||
|
|
<MapView style={styles.map}>
|
||
|
|
{/* Marcadores */}
|
||
|
|
<Marker coordinate={coordinate} />
|
||
|
|
|
||
|
|
{/* Rotas */}
|
||
|
|
<Polyline
|
||
|
|
coordinates={routeCoordinates}
|
||
|
|
strokeColor="#3B82F6"
|
||
|
|
strokeWidth={4}
|
||
|
|
/>
|
||
|
|
</MapView>
|
||
|
|
```
|
||
|
|
|
||
|
|
**Funcionalidades:**
|
||
|
|
- 🎯 **Marcadores interativos** com `onPress`
|
||
|
|
- 🛣️ **Rotas curvas** com `Polyline`
|
||
|
|
- 📍 **Localização do usuário** com `showsUserLocation`
|
||
|
|
- 🧭 **Controles de mapa** (zoom, compass, scale)
|
||
|
|
- 🏢 **Tipos de mapa** (standard, satellite, hybrid)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### **2. @rnmapbox/maps (Mapbox)**
|
||
|
|
|
||
|
|
**Instalação:**
|
||
|
|
```bash
|
||
|
|
npx expo install @rnmapbox/maps
|
||
|
|
```
|
||
|
|
|
||
|
|
**Vantagens:**
|
||
|
|
- ✅ **Rotas curvas** do Mapbox
|
||
|
|
- ✅ **Navegação em tempo real**
|
||
|
|
- ✅ **Estilo de mapa** personalizado
|
||
|
|
- ✅ **Geocoding** integrado
|
||
|
|
- ✅ **APIs avançadas** do Mapbox
|
||
|
|
|
||
|
|
**Exemplo:**
|
||
|
|
```tsx
|
||
|
|
import Mapbox from '@rnmapbox/maps';
|
||
|
|
|
||
|
|
<Mapbox.MapView style={styles.map}>
|
||
|
|
<Mapbox.ShapeSource id="routeSource" shape={routeGeoJSON}>
|
||
|
|
<Mapbox.LineLayer id="routeLine" />
|
||
|
|
</Mapbox.ShapeSource>
|
||
|
|
</Mapbox.MapView>
|
||
|
|
```
|
||
|
|
|
||
|
|
**Funcionalidades:**
|
||
|
|
- 🛣️ **Rotas inteligentes** com Mapbox Directions
|
||
|
|
- 🎨 **Estilos customizados** de mapa
|
||
|
|
- 📍 **Geocoding** de endereços
|
||
|
|
- 🚗 **Navegação turn-by-turn**
|
||
|
|
- 🌍 **Mapas offline** e customizados
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
### **3. react-native-web-maps (Web)**
|
||
|
|
|
||
|
|
**Instalação:**
|
||
|
|
```bash
|
||
|
|
npm install react-native-web-maps
|
||
|
|
```
|
||
|
|
|
||
|
|
**Vantagens:**
|
||
|
|
- ✅ **Compatível com web**
|
||
|
|
- ✅ **API similar** ao react-native-maps
|
||
|
|
- ✅ **Fallback** para web
|
||
|
|
- ✅ **Sem dependências nativas**
|
||
|
|
|
||
|
|
**Exemplo:**
|
||
|
|
```tsx
|
||
|
|
import { MapView, Marker } from 'react-native-web-maps';
|
||
|
|
|
||
|
|
<MapView style={styles.map}>
|
||
|
|
<Marker coordinate={coordinate} />
|
||
|
|
</MapView>
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 **Implementação Atual**
|
||
|
|
|
||
|
|
### **DeliveryMap com react-native-maps**
|
||
|
|
|
||
|
|
O componente atual usa `react-native-maps` com:
|
||
|
|
|
||
|
|
#### **Funcionalidades Implementadas:**
|
||
|
|
- 🗺️ **Mapa nativo** com `MapView`
|
||
|
|
- 🎯 **Marcadores customizados** com `CustomPin`
|
||
|
|
- 🛣️ **Rotas otimizadas** com `Polyline`
|
||
|
|
- 🧠 **Algoritmo TSP** (Caixeiro Viajante)
|
||
|
|
- 📍 **Centro de distribuição** destacado
|
||
|
|
- 🔄 **Otimização automática** de rotas
|
||
|
|
|
||
|
|
#### **Estrutura do Mapa:**
|
||
|
|
```tsx
|
||
|
|
<MapView
|
||
|
|
ref={mapRef}
|
||
|
|
style={styles.map}
|
||
|
|
provider={Platform.OS === 'android' ? PROVIDER_GOOGLE : undefined}
|
||
|
|
initialRegion={initialRegion}
|
||
|
|
showsUserLocation={centerOnUser}
|
||
|
|
showsMyLocationButton={centerOnUser}
|
||
|
|
showsCompass={true}
|
||
|
|
showsScale={true}
|
||
|
|
>
|
||
|
|
{/* Marcadores das entregas */}
|
||
|
|
{mapMarkers.map((marker) => (
|
||
|
|
<Marker
|
||
|
|
key={marker.id}
|
||
|
|
coordinate={marker.coordinate}
|
||
|
|
title={marker.title}
|
||
|
|
description={marker.description}
|
||
|
|
onPress={handleMarkerPress}
|
||
|
|
>
|
||
|
|
<CustomPin number={marker.number} size={40} />
|
||
|
|
</Marker>
|
||
|
|
))}
|
||
|
|
|
||
|
|
{/* Rotas otimizadas */}
|
||
|
|
{mapPolylines.map((polyline) => (
|
||
|
|
<Polyline
|
||
|
|
key={polyline.id}
|
||
|
|
coordinates={polyline.coordinates}
|
||
|
|
strokeColor={polyline.strokeColor}
|
||
|
|
strokeWidth={polyline.strokeWidth}
|
||
|
|
lineDashPattern={polyline.lineDashPattern}
|
||
|
|
geodesic={true}
|
||
|
|
/>
|
||
|
|
))}
|
||
|
|
</MapView>
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🚀 **Como Usar**
|
||
|
|
|
||
|
|
### **1. Instalar dependência:**
|
||
|
|
```bash
|
||
|
|
npx expo install react-native-maps
|
||
|
|
```
|
||
|
|
|
||
|
|
### **2. Importar no componente:**
|
||
|
|
```tsx
|
||
|
|
import MapView, { Marker, Polyline } from 'react-native-maps';
|
||
|
|
```
|
||
|
|
|
||
|
|
### **3. Usar o DeliveryMap:**
|
||
|
|
```tsx
|
||
|
|
<DeliveryMap
|
||
|
|
deliveries={deliveries}
|
||
|
|
onDeliveryPress={handleDeliveryPress}
|
||
|
|
showRoute={true}
|
||
|
|
centerOnUser={true}
|
||
|
|
/>
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔧 **Configurações**
|
||
|
|
|
||
|
|
### **app.json (Expo):**
|
||
|
|
```json
|
||
|
|
{
|
||
|
|
"expo": {
|
||
|
|
"plugins": [
|
||
|
|
[
|
||
|
|
"expo-location",
|
||
|
|
{
|
||
|
|
"locationWhenInUseDescription": "Permitir que $(PRODUCT_NAME) use sua localização para mostrar rotas de entrega."
|
||
|
|
}
|
||
|
|
]
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### **Metro Config:**
|
||
|
|
```js
|
||
|
|
// metro.config.js
|
||
|
|
config.resolver = {
|
||
|
|
...resolver,
|
||
|
|
platforms: ['ios', 'android', 'native', 'web'],
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📱 **Compatibilidade**
|
||
|
|
|
||
|
|
| Plataforma | react-native-maps | @rnmapbox/maps | react-native-web-maps |
|
||
|
|
|------------|-------------------|----------------|----------------------|
|
||
|
|
| **Expo Go** | ✅ **Sim** | ✅ **Sim** | ✅ **Sim** |
|
||
|
|
| **iOS** | ✅ **Sim** | ✅ **Sim** | ✅ **Sim** |
|
||
|
|
| **Android** | ✅ **Sim** | ✅ **Sim** | ✅ **Sim** |
|
||
|
|
| **Web** | ❌ **Não** | ❌ **Não** | ✅ **Sim** |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎉 **Recomendação Final**
|
||
|
|
|
||
|
|
**Use `react-native-maps`** porque:
|
||
|
|
|
||
|
|
1. ✅ **100% compatível** com Expo Go
|
||
|
|
2. ✅ **Performance nativa** excelente
|
||
|
|
3. ✅ **API simples** e intuitiva
|
||
|
|
4. ✅ **Suporte oficial** da comunidade
|
||
|
|
5. ✅ **Funcionalidades completas** de mapa
|
||
|
|
6. ✅ **Fácil manutenção** e debug
|
||
|
|
|
||
|
|
**Resultado:** Mapa funcional com rotas, marcadores e otimização em qualquer ambiente! 🗺️✨
|