MySQL: Afstand-berekeningen met longitude en latitude

MySQL: Afstand-berekeningen met longitude en latitude

Met de komst van de mogelijkheid om met de browser de locatie van een gebruiker te bepalen hebben steeds meer websites locatie ondersteuning. Om deze manier kan informatie die belangrijk is voor de gebruiker worden getoond. Denk hierbij aan slaapplaatsen in de buurt bij Airbnb en restaurants in de buurt bij Whatsfood.

Met MySQL is het mogelijk om een query te schrijven die records selecteert die binnen een bepaalde afstand vanaf een vooraf ingesteld punt liggen. Aan de hand van een voorbeeld zal in dit artikel worden laten zien hoe een MySQL query met afstand-berekening kan worden ingezet.

De database

Stel er is een database tabel "aanbiedingen" die bestaat uit de kolommen: "id", "aanbieding", "latitude" en "longitude". In deze tabel worden aanbiedingen opgeslagen en voorzien van een locatie op de kaart.

De query

Stel je wilt alle aanbiedingen vanaf de locatie van een gebruiker van de website. Aanbiedingen die verder liggen dan 5 kilometer zijn niet belangrijk en hoeven niet getoond te worden. In onderstaand voorbeeld is de gebruiker precies in het midden van Amsterdam op de coördinaten 52.370216, 4.895168 . Deze coördinaten zijn de latitude en longitude van de locatie. (breedte en lengtegraden).

Afstand in miles

SELECT aanbiedingen.*,
(((acos(sin((52.370216*pi()/180)) * 
            sin((latitude*pi()/180))+cos((52.370216*pi()/180)) * 
            cos((latitude*pi()/180)) * cos(((4.895168- longitude)* 
            pi()/180))))*180/pi())*60*1.1515
        ) as afstand 
FROM aanbiedingen
HAVING afstand < 5
ORDER BY afstand ASC

De berekening in bovenstaande query is echter nog niet volledig. De afstand tussen aanbiedingen en de locatie van de gebruiker is nu berekent in Miles in plaats van Kilometers. Door de query uit te breiden kan van de afstand in miles een afstand worden gemaakt in kilometers. 1 mile is 1.6 kilometer, de aanpassing is daarom als volgt:

Afstand in kilometers

SELECT aanbiedingen.*,
(((acos(sin((52.370216*pi()/180)) * 
            sin((latitude*pi()/180))+cos((52.370216*pi()/180)) * 
            cos((latitude*pi()/180)) * cos(((4.895168- longitude)* 
            pi()/180))))*180/pi())*60*1.1515
        ) * 1.6 as km_afstand 
FROM aanbiedingen
HAVING km_afstand < 5
ORDER BY km_afstand ASC

Lees ook

The bullshit of implementing web accessibility

What is WCAG? Before I dive into the details of web accessibility, let me explain in my own words what it actually is. WCAG stands for Web Content Accessibility Guidelines. It’s a set of guidelines designed to ensure that websites and web applications are accessible to everyone, including people with disabilities…

Continue reading

The bullshit of frontend development

Introduction In this blog, I would like to share my opinion on how we, as front-end developers, often make projects unnecessarily complex. We often think we’re doing the right thing, but are we? Where we used to say we could build a website in just a few days, now we provide timelines at the infamous Scrum…

Continue reading

How I added my Porsche EV to Homekit

Since my childhood, I have been passionate about cars and everything related to them. Even at a young age, I knew every model. I spent hours flipping through car magazines searching for new facts and always dreamed of owning an exotic car. Initially, I used to dream of owning a Ferrari, but as I grew older and wiser,…

Continue reading