1.0.1 • Published 1 month ago

@smkdev/geolocation v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
1 month ago

@smkdev/geolocation 🌍

npm version License: MIT Downloads

Biblioteca Node.js completa para geolocalização com mapas interativos, WebSockets em tempo real e funcionalidades de geocodificação. Perfeita para integração entre apps React Native (Expo) e frontends Next.js.

🚀 Instalação

npm install @smkdev/geolocation

⚡ Início Rápido

Servidor Completo

import { GeoLocationLib } from '@smkdev/geolocation';

const geoLib = new GeoLocationLib({
    port: 3001,
    cors: {
        origin: ["http://localhost:3000", "exp://192.168.1.100:19000"] // Next.js + Expo
    }
});

await geoLib.start();
console.log('🌍 Servidor de geolocalização rodando!');

Usando Apenas os Serviços

import { createServices } from '@smkdev/geolocation';

const services = createServices();

// Calcular distância entre dois pontos
const distance = services.geolocation.calculateDistance(
    { lat: -23.5505, lng: -46.6333 },  // São Paulo
    { lat: -22.9068, lng: -43.1729 }   // Rio de Janeiro
);
console.log(`Distância: ${Math.round(distance/1000)}km`);

// Geocodificação
const locations = await services.geocoding.geocode('São Paulo, Brasil');
console.log('Coordenadas:', locations[0]);

📱 Integração React Native + Next.js

React Native (Cliente)

import { io } from 'socket.io-client';
import * as Location from 'expo-location';

const useRealTimeTracking = (serverUrl) => {
    const [socket, setSocket] = useState(null);

    useEffect(() => {
        const newSocket = io(serverUrl);
        setSocket(newSocket);

        const startTracking = async () => {
            const { status } = await Location.requestForegroundPermissionsAsync();
            if (status === 'granted') {
                await Location.watchPositionAsync({
                    accuracy: Location.Accuracy.High,
                    timeInterval: 5000, // 5 segundos
                    distanceInterval: 10 // 10 metros
                }, (location) => {
                    newSocket.emit('location_update', {
                        userId: 'user123',
                        latitude: location.coords.latitude,
                        longitude: location.coords.longitude,
                        timestamp: Date.now()
                    });
                });
            }
        };

        startTracking();
        return () => newSocket.close();
    }, [serverUrl]);

    return socket;
};

Next.js Frontend (Visualização)

import { useEffect, useState } from 'react';
import { io } from 'socket.io-client';

export default function TrackingPage() {
    const [users, setUsers] = useState(new Map());

    useEffect(() => {
        const socket = io('http://seu-backend.com:3001');

        socket.on('location_update', (data) => {
            setUsers(prev => {
                const updated = new Map(prev);
                updated.set(data.userId, {
                    ...data,
                    lastUpdate: new Date()
                });
                return updated;
            });
        });

        socket.on('user_disconnected', (data) => {
            setUsers(prev => {
                const updated = new Map(prev);
                updated.delete(data.userId);
                return updated;
            });
        });

        return () => socket.close();
    }, []);

    return (
        <div>
            <h1>📍 Rastreamento em Tempo Real</h1>
            {Array.from(users.values()).map(user => (
                <div key={user.userId} style={{ 
                    padding: '10px', 
                    border: '1px solid #ccc', 
                    margin: '5px',
                    borderRadius: '5px'
                }}>
                    <strong>👤 {user.userId}</strong><br/>
                    📍 Lat: {user.latitude.toFixed(6)}<br/>
                    📍 Lng: {user.longitude.toFixed(6)}<br/>
                    🕐 {user.lastUpdate.toLocaleTimeString()}
                </div>
            ))}
        </div>
    );
}

🌐 APIs Disponíveis

WebSocket Events

// Enviar (cliente → servidor)
socket.emit('location_update', locationData);
socket.emit('location_share', { userId, latitude, longitude, message });
socket.emit('join_room', { userId, roomId });

// Receber (servidor → cliente)
socket.on('location_update', handleLocationUpdate);
socket.on('user_connected', handleUserConnected);
socket.on('geofence_alert', handleGeofenceAlert);

REST Endpoints

// Geocodificação
GET /api/geocoding/forward?q=São Paulo, Brasil
GET /api/geocoding/reverse?lat=-23.5505&lng=-46.6333

// Cálculos de distância
POST /api/geolocation/distance
{
    "from": {"lat": -23.5505, "lng": -46.6333},
    "to": {"lat": -23.5506, "lng": -46.6334}
}

🎯 Funcionalidades

  • WebSocket em tempo real com Socket.IO
  • Mapas interativos com Leaflet.js
  • Geocodificação com rate limiting inteligente
  • Cálculos geográficos (distância, bearing, geofencing)
  • Interface web pronta para demonstrações
  • Segurança e monitoramento integrados
  • Compatível com React Native, Next.js, Vue, Angular
  • Pronto para produção com logs e métricas

🔧 Configuração Avançada

import { GeoLocationLib } from '@smkdev/geolocation';

const geoLib = new GeoLocationLib({
    port: 3001,
    cors: {
        origin: process.env.ALLOWED_ORIGINS?.split(',') || ["*"]
    },
    security: {
        rateLimit: {
            windowMs: 15 * 60 * 1000, // 15 minutos
            max: 100 // máximo 100 requests por IP
        }
    },
    geocoding: {
        providers: ['openstreetmap', 'nominatim'],
        cacheTimeout: 60 * 60 * 1000, // 1 hora
        maxRequestsPerMinute: 60
    }
});

📖 Documentação Completa

Para documentação completa, exemplos avançados e guias de implementação, visite:

📄 Licença

MIT © smkdev


🌍 Construa aplicações de geolocalização em tempo real de forma simples e rápida!