full
This commit is contained in:
27
utils/nearbyPosts.js
Normal file
27
utils/nearbyPosts.js
Normal file
@@ -0,0 +1,27 @@
|
||||
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,
|
||||
}
|
||||
Reference in New Issue
Block a user