UNPKG

rs-react-native-map-clustering

Version:

React Native Map Clustering both for Android and iOS with TypeScript support

74 lines (73 loc) 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createBoundsChecker = exports.processInChunks = exports.windowMarkers = void 0; /** * Utility for handling large marker datasets with virtual windowing * Only processes markers that are within the visible region or just outside it */ const windowMarkers = (markers, region, bufferFactor = 0.5 // Buffer factor determines how much outside the visible region we should process ) => { if (!markers.length) return []; // Calculate region boundaries with buffer const latBuffer = region.latitudeDelta * bufferFactor; const lngBuffer = region.longitudeDelta * bufferFactor; const minLat = region.latitude - region.latitudeDelta / 2 - latBuffer; const maxLat = region.latitude + region.latitudeDelta / 2 + latBuffer; const minLng = region.longitude - region.longitudeDelta / 2 - lngBuffer; const maxLng = region.longitude + region.longitudeDelta / 2 + lngBuffer; // Filter markers to only include ones in the viewable region plus buffer return markers.filter((marker) => { // Always include clusters as they represent multiple points if (marker.properties.cluster) return true; const lat = marker.geometry.coordinates[1]; const lng = marker.geometry.coordinates[0]; return lat >= minLat && lat <= maxLat && lng >= minLng && lng <= maxLng; }); }; exports.windowMarkers = windowMarkers; /** * Chunk processing for very large marker arrays * Processes large arrays in smaller chunks to avoid UI blocking */ const processInChunks = (items, processor, chunkSize = 100) => { return new Promise((resolve) => { const result = []; let index = 0; function processNextChunk() { const chunk = items.slice(index, index + chunkSize); index += chunkSize; if (!chunk.length) { resolve(result); return; } // Process this chunk const chunkResult = chunk.map(processor); result.push(...chunkResult); // Schedule next chunk with a small delay to allow UI updates if (index < items.length) { setTimeout(processNextChunk, 0); } else { resolve(result); } } processNextChunk(); }); }; exports.processInChunks = processInChunks; /** * Returns a function that can be used to efficiently test if a point (marker) * is within the current visible map bounds */ const createBoundsChecker = (region, bufferFactor = 0.5) => { const latBuffer = region.latitudeDelta * bufferFactor; const lngBuffer = region.longitudeDelta * bufferFactor; const minLat = region.latitude - region.latitudeDelta / 2 - latBuffer; const maxLat = region.latitude + region.latitudeDelta / 2 + latBuffer; const minLng = region.longitude - region.longitudeDelta / 2 - lngBuffer; const maxLng = region.longitude + region.longitudeDelta / 2 + lngBuffer; return (lat, lng) => lat >= minLat && lat <= maxLat && lng >= minLng && lng <= maxLng; }; exports.createBoundsChecker = createBoundsChecker;