@chauffleet/expo-custom-map
Version:
Open source custom map library for Expo/React Native. Use your own tiles without Google Maps, Mapbox, or API keys. Created by ChaufFleet.
294 lines (278 loc) • 7.42 kB
text/typescript
// src/types/MapTypes.ts
/**
* Configuration spécifique pour les cartes
*/
export interface MapConfiguration {
/** Taille par défaut des tuiles en pixels */
tileSize: number;
/** Niveau de zoom minimum autorisé */
minZoom: number;
/** Niveau de zoom maximum autorisé */
maxZoom: number;
/** Rayon de préchargement des tuiles en nombre de tuiles */
preloadRadius: number;
/** Taille maximum du cache en MB */
maxCacheSize: number;
/** Durée d'animation par défaut en millisecondes */
animationDuration: number;
/** Mode debug activé */
debugMode: boolean;
/** Activer le rendu haute définition */
enableHighDPI: boolean;
}
/**
* Viewport de la carte
*/
export interface MapViewport {
/** Centre de la carte [longitude, latitude] */
center: [number, number];
/** Niveau de zoom actuel */
zoom: number;
/** Rotation de la carte en degrés */
bearing: number;
/** Inclinaison de la carte en degrés */
pitch: number;
/** Largeur du viewport en pixels */
width: number;
/** Hauteur du viewport en pixels */
height: number;
}
/**
* Limites géographiques
*/
export interface GeographicBounds {
/** Limite nord (latitude maximum) */
north: number;
/** Limite sud (latitude minimum) */
south: number;
/** Limite est (longitude maximum) */
east: number;
/** Limite ouest (longitude minimum) */
west: number;
}
/**
* Tuile de carte
*/
export interface MapTile {
/** Coordonnée X de la tuile */
x: number;
/** Coordonnée Y de la tuile */
y: number;
/** Niveau de zoom de la tuile */
z: number;
/** URL de la tuile */
url: string;
/** Taille de la tuile en pixels */
size: number;
/** Timestamp de création/chargement */
timestamp: number;
/** État de chargement */
loading: boolean;
/** Tuile chargée avec succès */
loaded: boolean;
/** Erreur de chargement */
error?: Error;
}
/**
* Gestionnaire de fournisseur de tuiles
*/
export interface TileProviderConfig {
/** Nom du fournisseur */
name: string;
/** Template d'URL avec placeholders {x}, {y}, {z} */
urlTemplate: string;
/** Attribution requise */
attribution?: string;
/** Zoom minimum supporté */
minZoom?: number;
/** Zoom maximum supporté */
maxZoom?: number;
/** Sous-domaines disponibles */
subdomains?: string[];
/** Headers HTTP personnalisés */
headers?: Record<string, string>;
/** Timeout de requête en millisecondes */
timeout?: number;
}
/**
* Événement de changement de région
*/
export interface RegionChangeEventData {
/** Nouvelle région */
region: MapViewport;
/** Changement initié par l'utilisateur */
isUserInteraction: boolean;
/** Changement en cours (pendant le geste) */
isAnimating: boolean;
/** Raison du changement */
reason: 'user' | 'programmatic' | 'animation';
}
/**
* Événement de pression sur la carte
*/
export interface MapPressEventData {
/** Coordonnées géographiques du point pressé */
coordinate: [number, number];
/** Position en pixels sur l'écran */
screenPoint: { x: number; y: number };
/** Type de pression */
type: 'single' | 'double' | 'long';
}
/**
* Styles de carte prédéfinis
*/
export enum MapStyle {
/** Style de rue standard */
STREET = 'street',
/** Style satellite */
SATELLITE = 'satellite',
/** Style hybride (satellite + labels) */
HYBRID = 'hybrid',
/** Style terrain */
TERRAIN = 'terrain',
/** Style sombre */
DARK = 'dark',
/** Style clair */
LIGHT = 'light',
/** Style en niveaux de gris */
GRAYSCALE = 'grayscale',
}
/**
* Options de géolocalisation
*/
export interface GeolocationOptions {
/** Activer la haute précision */
enableHighAccuracy: boolean;
/** Timeout en millisecondes */
timeout: number;
/** Âge maximum de la position en millisecondes */
maximumAge: number;
/** Distance minimale pour déclencher une mise à jour en mètres */
distanceFilter: number;
}
/**
* Résultat de géolocalisation
*/
export interface GeolocationResult {
/** Coordonnées [longitude, latitude] */
coordinate: [number, number];
/** Précision en mètres */
accuracy: number;
/** Altitude en mètres */
altitude?: number;
/** Précision de l'altitude en mètres */
altitudeAccuracy?: number;
/** Cap en degrés */
heading?: number;
/** Vitesse en m/s */
speed?: number;
/** Timestamp de la mesure */
timestamp: number;
}
/**
* Configuration d'animation
*/
export interface AnimationConfig {
/** Durée de l'animation en millisecondes */
duration: number;
/** Fonction d'easing */
easing: 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring';
/** Paramètres du spring (si easing = 'spring') */
springConfig?: {
tension: number;
friction: number;
};
}
/**
* Gestionnaire de couches personnalisées
*/
export interface CustomLayer {
/** ID unique de la couche */
id: string;
/** Type de couche */
type: 'raster' | 'vector' | 'custom';
/** Ordre d'affichage (z-index) */
zIndex: number;
/** Visibilité de la couche */
visible: boolean;
/** Opacité de la couche (0-1) */
opacity: number;
/** Zoom minimum pour afficher la couche */
minZoom?: number;
/** Zoom maximum pour afficher la couche */
maxZoom?: number;
}
/**
* Métriques de performance
*/
export interface MapPerformanceMetrics {
/** FPS actuel */
fps: number;
/** Temps de rendu du frame en millisecondes */
frameTime: number;
/** Temps de chargement des tuiles en millisecondes */
tileLoadTime: number;
/** Taux de réussite du cache (0-1) */
cacheHitRate: number;
/** Utilisation mémoire en MB */
memoryUsage: number;
/** Nombre de tuiles en cache */
cachedTiles: number;
/** Nombre de tuiles en cours de chargement */
loadingTiles: number;
/** Nombre d'erreurs de chargement */
tileErrors: number;
}
/**
* Configuration de débogage
*/
export interface DebugConfig {
/** Afficher les limites des tuiles */
showTileBounds: boolean;
/** Afficher les coordonnées des tuiles */
showTileCoordinates: boolean;
/** Afficher les métriques de performance */
showPerformanceStats: boolean;
/** Afficher les informations de géolocalisation */
showLocationInfo: boolean;
/** Couleur des éléments de debug */
debugColor: string;
/** Taille de police pour le debug */
debugFontSize: number;
}
/**
* Limites d'utilisation
*/
export interface UsageLimits {
/** Nombre maximum de requêtes par minute */
requestsPerMinute: number;
/** Nombre maximum de tuiles en cache */
maxCachedTiles: number;
/** Taille maximum d'une seule tuile en bytes */
maxTileSize: number;
/** Timeout de requête réseau en millisecondes */
networkTimeout: number;
}
/**
* Interface principale pour la configuration complète d'une carte
*/
export interface CompleteMapConfig {
/** Configuration de base */
config: MapConfiguration;
/** Viewport initial */
initialViewport: MapViewport;
/** Fournisseur de tuiles */
tileProvider: TileProviderConfig;
/** Style de carte */
style: MapStyle | string;
/** Options de géolocalisation */
geolocation?: GeolocationOptions;
/** Configuration d'animation */
animation?: AnimationConfig;
/** Couches personnalisées */
customLayers?: CustomLayer[];
/** Configuration de débogage */
debug?: DebugConfig;
/** Limites d'utilisation */
limits?: UsageLimits;
}