ניתוח ובדיקותפלטפורמות CRM ונתוניםכלי שיווק

חשב או שאילתה מרחק מעגל גדול בין נקודות קו רוחב וקו אורך באמצעות נוסחת Haversine (דוגמאות PHP, JavaScript, Java, Python, MySQL, MSSQL)

החודש, תכנתתי ב-PHP וב-MySQL עבור GIS. תוך כדי חקירת הנושא, התקשיתי למצוא חישובים גיאוגרפיים כדי למצוא את המרחק בין שני מיקומים, אז רציתי לשתף אותם כאן.

מפת טיסה אירופה עם מרחק מעגל גדול

הדרך הפשוטה לחישוב מרחק בין שתי נקודות היא באמצעות הנוסחה הפיתגוראית לחישוב ההיפוטנוזה של משולש (A² + B² = C²). זה ידוע בשם מרחק אוקלידי.

זו התחלה מעניינת, אבל היא לא חלה על גיאוגרפיה מכיוון שהמרחק בין קווי הרוחב והאורך הם לא מרחקים שווים זה מזה. ככל שמתקרבים לקו המשווה, קווי הרוחב מתרחקים זה מזה. אם אתה משתמש במשוואת משולש פשוטה, היא עשויה למדוד מרחק במדויק במיקום אחד ושגוי במיקום השני בגלל העקמומיות של כדור הארץ.

מרחק מעגל גדול

המסלולים שנסעו למרחקים ארוכים מסביב לכדור הארץ ידועים כמרחק המעגל הגדול. כלומר... המרחק הקצר ביותר בין שתי נקודות בכדור שונה מהנקודות במפה שטוחה. שלב את זה עם העובדה שקווי רוחב וקו אורך אינם במרחק שווה... ויש לך חישוב קשה.

הנה הסבר וידאו נהדר על האופן שבו המעגלים הגדולים עובדים.

פורמולת האברסין

המרחק באמצעות עקמומיות כדור הארץ משולב בנוסחה של Haversine, המשתמשת בטריגונומטריה כדי לאפשר את העקמומיות של כדור הארץ. כאשר אתה מוצא את המרחק בין 2 מקומות על פני כדור הארץ (בקו עף), קו ישר הוא למעשה קשת.

זה ישים בטיסה אווירית - האם אי פעם הסתכלת על מפת הטיסות בפועל ושמת לב שהן מקושתות? הסיבה לכך היא שטיסה בקשת בין שתי נקודות קצרה יותר מאשר ישירות למיקום.

PHP: חישוב מרחק בין 2 נקודות רוחב ואורך

הנה נוסחת ה-PHP לחישוב המרחק בין שתי נקודות (יחד עם המרה של מייל מול קילומטר) מעוגלת לשני מקומות עשרוניים.

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)); 
}

המשתנים הם:

  • $Latitude1 – משתנה עבור קו הרוחב של המיקום הראשון שלך.
  • $ Longitude1 – משתנה עבור קו האורך של המיקום הראשון שלך
  • $Latitude2 – משתנה עבור קו הרוחב של המיקום השני שלך.
  • $ Longitude2 – משתנה עבור קו האורך של המיקום השני שלך.
  • $unit - ברירת המחדל קילומטרים. זה יכול להיות מעודכן או להעביר בתור קילומטרים.

Java: חשב מרחק בין 2 נקודות קו רוחב וקו אורך

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

המשתנים הם:

  • קו רוחב 1 – משתנה עבור קו הרוחב של המיקום הראשון שלך.
  • קו אורך1 – משתנה עבור קו האורך של המיקום הראשון שלך
  • קו רוחב 2 – משתנה עבור קו הרוחב של המיקום השני שלך.
  • קו אורך2 – משתנה עבור קו האורך של המיקום השני שלך.
  • יחידה - ברירת המחדל קילומטרים. זה יכול להיות מעודכן או להעביר בתור קילומטרים.

JavaScript: חשב מרחק בין 2 נקודות קו רוחב וקו אורך

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);
    }
}

המשתנים הם:

  • קו רוחב 1 – משתנה עבור קו הרוחב של המיקום הראשון שלך.
  • קו אורך1 – משתנה עבור קו האורך של המיקום הראשון שלך
  • קו רוחב 2 – משתנה עבור קו הרוחב של המיקום השני שלך.
  • קו אורך2 – משתנה עבור קו האורך של המיקום השני שלך.
  • יחידה - ברירת המחדל קילומטרים. זה יכול להיות מעודכן או להעביר בתור קילומטרים.

פייתון: חשב מרחק בין 2 נקודות קו רוחב וקו אורך

הנה נוסחת פייתון לחישוב המרחק בין שתי נקודות (יחד עם המרה של מייל מול קילומטר) מעוגלת לשני מקומות עשרוניים. קרדיט לבן שלי, ביל קאר, מדען נתונים עבור פתח INSIGHTS, עבור הקוד.

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)

המשתנים הם:

  • קו רוחב 1 – משתנה עבור המיקום הראשון שלך רוחב.
  • קו אורך1 – משתנה עבור המיקום הראשון שלך אורך
  • קו רוחב 2 – משתנה עבור המיקום השני שלך רוחב.
  • קו אורך2 – משתנה עבור המיקום השני שלך אורך.
  • יחידה - ברירת המחדל קילומטרים. זה יכול להיות מעודכן או להעביר בתור קילומטרים.

MySQL: אחזור כל הרשומות בטווח על ידי חישוב מרחק במיילים באמצעות קו רוחב וקו אורך

שימוש בסוגי נתונים מרחביים ב-MySQL הוא דרך יעילה ונוחה יותר לעבוד עם נתונים גיאוגרפיים, כולל חישוב מרחקים בין נקודות. MySQL תומך בסוגי נתונים מרחביים כגון POINT, LINESTRING, ו POLYGON, יחד עם פונקציות מרחביות כמו ST_Distance.

כשאתה משתמש ב- ST_Distance פונקציה ב-MySQL עם נתונים גיאוגרפיים המיוצגים כ POINT קואורדינטות, זה לוקח בחשבון את העקמומיות של פני כדור הארץ. המודל הכדורי המשמש את ST_Distance משתמש בנוסחה של Haversine. קירוב זה מתאים לרוב המטרות המעשיות אך עשוי להכניס אי דיוקים קלים למרחקים ארוכים מאוד.

כך תוכל לחשב מרחקים בין שתי נקודות באמצעות סוגי נתונים מרחביים:

  1. צור טבלה עם סוג נתונים מרחביים: ראשית, צור טבלה עם א POINT עמודה לאחסון נקודות גיאוגרפיות. לדוגמה:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

הכנס את הנקודות הגיאוגרפיות שלך לטבלה זו באמצעות ה- POINT בַּנַאִי:

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. חשב מרחק באמצעות ST_Distance: ניתן לחשב את המרחק בין שתי נקודות באמצעות ה- ST_Distance פוּנקצִיָה. הנה שאילתה לדוגמה לחישוב המרחק בין שתי נקודות:
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;

חלף 1 ו 2 עם המזהים של שתי הנקודות שברצונך לחשב את המרחק ביניהן.

  1. תוֹצָאָה: השאילתה תחזיר את המרחק בין שתי הנקודות במיילים.

שימוש בסוגי נתונים מרחביים וב- ST_Distance הפונקציה מספקת דרך יעילה ומדויקת יותר לעבוד עם נתונים גיאוגרפיים ב-MySQL. זה גם מפשט את חישוב המרחקים בין נקודות, ומקל על הניהול והשאילתה של הנתונים שלך.

MySQL: אחזור כל הרשומות בטווח על ידי חישוב מרחק בקילומטרים באמצעות קו רוחב וקו אורך

כברירת מחדל ST_Distance מחזירה את המרחק במטרים, אז אתה פשוט צריך לעדכן את השאילתה עבור קילומטרים:

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: STDistance

אם אתה משתמש ב-Microsoft SQL Server, הם מציעים פונקציה משלהם, STDistance לחישוב המרחק בין שתי נקודות באמצעות סוג הנתונים גיאוגרפיה.

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

טיפ כובע למנש סהו, מייסד ואדריכל בכיר ב יון שלוש.

Douglas Karr

Douglas Karr הוא CMO של פתח INSIGHTS ומייסד ה Martech Zone. דאגלס סייע לעשרות סטארט-אפים מצליחים של MarTech, סייע בבדיקת נאותות של למעלה מ-5 מיליארד דולר ברכישות והשקעות של Martech, וממשיך לסייע לחברות ביישום ואוטומציה של אסטרטגיות המכירות והשיווק שלהן. דאגלס הוא מומחה ודובר בטרנספורמציה דיגיטלית ומוכר בינלאומי ב-MarTech. דאגלס הוא גם מחבר שפורסם של מדריך Dummy וספר מנהיגות עסקית.

מאמרים נוספים

לחצן חזרה למעלה
סְגוֹר

זוהה חסימת מודעות

Martech Zone הוא מסוגל לספק לך תוכן זה ללא עלות מכיוון שאנו מייצרים רווח מהאתר שלנו באמצעות הכנסות ממודעות, קישורי שותפים וחסויות. נשמח אם תסיר את חוסם המודעות שלך בזמן שאתה צופה באתר שלנו.