Analyse en testenCRM- en dataplatformsmarketing tools

Bereken of vraag grootcirkelafstand tussen punten van lengte- en breedtegraad met behulp van de Haversine-formule (PHP, JavaScript, Java, Python, MySQL, MSSQL-voorbeelden)

Deze maand heb ik geprogrammeerd in PHP en MySQL voor GIS. Tijdens het onderzoek naar het onderwerp had ik moeite met het vinden ervan geografische berekeningen om de afstand tussen twee locaties te vinden, dus ik wilde ze hier delen.

Vluchtkaart Europa Met Grote Cirkelafstand

De eenvoudige manier om een ​​afstand tussen twee punten te berekenen, is door de Pythagoras-formule te gebruiken om de hypotenusa van een driehoek (A² + B² = C²) te berekenen. Dit staat bekend als de Euclidische afstand.

Dat is een interessant begin, maar het is niet van toepassing op geografie, aangezien de afstand tussen de lengte- en breedtegraden niet gelijke afstanden van elkaar. Naarmate je dichter bij de evenaar komt, gaan de breedtegraadlijnen verder uit elkaar liggen. Als u een eenvoudige triangulatievergelijking gebruikt, kan deze de afstand op de ene locatie nauwkeurig meten, maar op de andere locatie verkeerd vanwege de kromming van de aarde.

Grote Cirkel Afstand

De routes over lange afstanden rond de aarde staan ​​bekend als de Great Circle Distance. Dat wil zeggen... de kortste afstand tussen twee punten op een bol verschilt van de punten op een platte kaart. Combineer dat met het feit dat lengte- en breedtegraden niet op gelijke afstand van elkaar liggen... en je hebt een moeilijke berekening.

Hier is een fantastische video-uitleg over hoe Great Circles werken.

De Haversine-formule

De afstand die gebruik maakt van de kromming van de aarde is opgenomen in de Haversine-formule, die trigonometrie gebruikt om rekening te houden met de kromming van de aarde. Wanneer je de afstand tussen 2 plaatsen op aarde (hemelsbreed) zoekt, is een rechte lijn eigenlijk een boog.

Dit is van toepassing bij luchtvluchten - heb je ooit naar de daadwerkelijke kaart van vluchten gekeken en gemerkt dat ze gebogen zijn? Dat komt omdat vliegen in een boog tussen twee punten korter is dan rechtstreeks naar de locatie.

PHP: Bereken de afstand tussen 2 punten van breedte- en lengtegraad

Hier is de PHP-formule voor het berekenen van de afstand tussen twee punten (samen met Mile vs. Kilometer-conversie) afgerond op twee decimalen.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

De variabelen zijn:

  • $Breedtegraad1 – een variabele voor de breedtegraad van uw eerste locatie.
  • $Lengtegraad1 – een variabele voor de lengtegraad van uw eerste locatie
  • $Breedtegraad2 – een variabele voor de breedtegraad van uw tweede locatie.
  • $Lengtegraad2 – een variabele voor de lengtegraad van uw tweede locatie.
  • $eenheid – de standaard is mijl. Dit kan worden bijgewerkt of doorgegeven als kilometer.

Java: Bereken de afstand tussen 2 breedte- en lengtegraden

public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
    double theta = longitude1 - longitude2;
    double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit.equals("miles")) {
        return Math.round(distance, 2);
    } else if (unit.equals("kilometers")) {
        return Math.round(distance * 1.609344, 2);
    } else {
        return 0;
    }
}

De variabelen zijn:

  • breedtegraad1 – een variabele voor de breedtegraad van uw eerste locatie.
  • lengtegraad1 – een variabele voor de lengtegraad van uw eerste locatie
  • breedtegraad2 – een variabele voor de breedtegraad van uw tweede locatie.
  • lengtegraad2 – een variabele voor de lengtegraad van uw tweede locatie.
  • eenheid – de standaard is mijl. Dit kan worden bijgewerkt of doorgegeven als kilometer.

JavaScript: Bereken de afstand tussen 2 breedte- en lengtegraden

function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
    let theta = longitude1 - longitude2;
    let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit == 'miles') {
        return Math.round(distance, 2);
    } else if (unit == 'kilometers') {
        return Math.round(distance * 1.609344, 2);
    }
}

De variabelen zijn:

  • breedtegraad1 – een variabele voor de breedtegraad van uw eerste locatie.
  • lengtegraad1 – een variabele voor de lengtegraad van uw eerste locatie
  • breedtegraad2 – een variabele voor de breedtegraad van uw tweede locatie.
  • lengtegraad2 – een variabele voor de lengtegraad van uw tweede locatie.
  • eenheid – de standaard is mijl. Dit kan worden bijgewerkt of doorgegeven als kilometer.

Python: afstand berekenen tussen 2 punten van breedte- en lengtegraad

Hier is de Python-formule voor het berekenen van de afstand tussen twee punten (samen met de conversie van mijlen naar kilometers), afgerond op twee decimalen. Met dank aan mijn zoon, Bill Karr, een datawetenschapper voor INZICHTEN openen, voor de code.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

De variabelen zijn:

  • breedtegraad1 – een variabele voor je eerste locatie's breedte.
  • lengtegraad1 – een variabele voor je eerste locatie's lengte
  • breedtegraad2 – een variabele voor je tweede locatie breedte.
  • lengtegraad2 – een variabele voor je tweede locatie lengte.
  • eenheid – de standaard is mijl. Dit kan worden bijgewerkt of doorgegeven als kilometer.

MySQL: alle records binnen een bereik ophalen door de afstand in mijlen te berekenen met behulp van breedte- en lengtegraad

Het gebruik van ruimtelijke gegevenstypen in MySQL is een efficiëntere en gemakkelijkere manier om met geografische gegevens te werken, inclusief het berekenen van afstanden tussen punten. MySQL ondersteunt ruimtelijke gegevenstypen zoals POINT, LINESTRING en POLYGON, samen met ruimtelijke functies zoals ST_Distance.

Wanneer u gebruik maken van de ST_Distance functie in MySQL met geografische gegevens weergegeven als POINT coördinaten, het houdt rekening met de kromming van het aardoppervlak. Het bolvormige model dat wordt gebruikt door ST_Distance maakt gebruik van de Haversine-formule. Deze benadering is geschikt voor de meeste praktische doeleinden, maar kan voor zeer lange afstanden kleine onnauwkeurigheden met zich meebrengen.

Zo kunt u afstanden tussen twee punten berekenen met behulp van ruimtelijke gegevenstypen:

  1. Maak een tabel met het ruimtelijke gegevenstype: Maak eerst een tabel met a POINT kolom om geografische punten op te slaan. Bijvoorbeeld:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Voer uw geografische punten in deze tabel in met behulp van de POINT constructeur:

INSERT INTO locations (name, coordinates)
VALUES
    ('Point A', POINT(40.7128, -74.0060)), -- New York City
    ('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
  1. Bereken afstand met behulp van ST_Distance: U kunt de afstand tussen twee punten berekenen met behulp van de ST_Distance functie. Hier is een voorbeeldquery om de afstand tussen twee punten te berekenen:
SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

vervangen 1 en 2 met de ID's van de twee punten waarvan u de afstand wilt berekenen.

  1. Resultaat: De zoekopdracht retourneert de afstand tussen de twee punten in mijlen.

Gebruik maken van ruimtelijke gegevenstypen en de ST_Distance functie biedt een efficiëntere en nauwkeurigere manier om met geografische gegevens in MySQL te werken. Het vereenvoudigt ook het berekenen van afstanden tussen punten, waardoor het eenvoudiger wordt om uw gegevens te beheren en op te vragen.

MySQL: alle records binnen een bereik ophalen door de afstand in kilometers te berekenen met behulp van breedte- en lengtegraad

Standaard ST_Distance retourneert de afstand in meters, dus u hoeft alleen maar de zoekopdracht voor kilometers bij te werken:

SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

Microsoft SQL Server Geografische afstand: STDistance

Als u Microsoft SQL Server gebruikt, bieden ze hun eigen functie, STAfstand voor het berekenen van de afstand tussen twee punten met behulp van het gegevenstype Geografie.

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

Hoedtip voor Manash Sahoo, oprichter en senior architect bij Ion Drie.

Douglas Karr

Douglas Karr is CMO van INZICHTEN openen en de oprichter van de Martech Zone. Douglas heeft tientallen succesvolle MarTech-startups geholpen, heeft geholpen bij het due diligence-onderzoek van meer dan $ 5 miljard aan Martech-overnames en -investeringen, en blijft bedrijven helpen bij het implementeren en automatiseren van hun verkoop- en marketingstrategieën. Douglas is een internationaal erkend expert en spreker op het gebied van digitale transformatie en MarTech. Douglas is ook een gepubliceerde auteur van een Dummie's-gids en een boek over zakelijk leiderschap.

Gerelateerde artikelen

Terug naar boven knop
Sluiten

Adblock gedetecteerd

Martech Zone kan u deze inhoud gratis aanbieden omdat we inkomsten genereren met onze site via advertentie-inkomsten, gelieerde links en sponsoring. We zouden het op prijs stellen als u uw adblocker zou verwijderen terwijl u onze site bekijkt.