28 lines
939 B
JavaScript
28 lines
939 B
JavaScript
function haversineMeters(lat1, lon1, lat2, lon2) {
|
|
const toRad = (deg) => (deg * Math.PI) / 180
|
|
const dLat = toRad(lat2 - lat1)
|
|
const dLon = toRad(lon2 - lon1)
|
|
const a =
|
|
Math.sin(dLat / 2) ** 2 +
|
|
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) ** 2
|
|
return 6371000 * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
|
}
|
|
|
|
function filterPostsByDistance(posts, viewerLat, viewerLng, radiusMeters) {
|
|
const parsedLat = parseFloat(viewerLat)
|
|
const parsedLng = parseFloat(viewerLng)
|
|
if (!Number.isFinite(parsedLat) || !Number.isFinite(parsedLng)) return []
|
|
|
|
return posts.filter((post) => {
|
|
const postLat = parseFloat(post.lat)
|
|
const postLng = parseFloat(post.lng)
|
|
if (!Number.isFinite(postLat) || !Number.isFinite(postLng)) return false
|
|
return haversineMeters(parsedLat, parsedLng, postLat, postLng) <= radiusMeters
|
|
})
|
|
}
|
|
|
|
module.exports = {
|
|
haversineMeters,
|
|
filterPostsByDistance,
|
|
}
|