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
JavaScript
;
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;