Аналитика жана тестирлөөCRM жана маалымат платформаларыМаркетинг куралдары

Haversine формуласын колдонуу менен кеңдик жана узундук чекиттеринин ортосундагы чоң тегерек аралыкты эсептеңиз же сураңыз (PHP, JavaScript, Java, Python, MySQL, MSSQL мисалдары)

Бул айда мен ГИС үчүн PHP жана MySQL тилдеринде программалоо менен алектендим. Теманы изилдеп жүрүп, табуу кыйынга турду географиялык эсептөөлөр эки жердин ортосундагы аралыкты табуу үчүн, мен аларды бул жерде бөлүшкүм келди.

Учуунун узактыгы менен Европанын учуу картасы

Эки чекиттин ортосундагы аралыкты эсептөөнүн жөнөкөй жолу - үч бурчтуктун гипотенузасын эсептөө үчүн Пифагор формуласы (A² + B² = C²). Бул белгилүү Евклид аралык.

Бул кызыктуу башталыш, бирок географияга тиешеси жок, анткени кеңдик менен узундуктун сызыктарынын ортосундагы аралык бирдей аралыкта эмес. Экваторго жакындаган сайын кеңдик сызыктары бири-биринен алыстайт. Эгерде сиз жөнөкөй триангуляция теңдемесин колдонсоңуз, ал Жердин ийрилигинен улам бир жерде аралыкты так, экинчи жерде туура эмес өлчөө мүмкүн.

Чоң тегерек аралык

Жердин айланасында узак аралыктарды басып өткөн жолдор Улуу Айлананын Дистанциясы деп аталат. Башкача айтканда... шардагы эки чекиттин ортосундагы эң кыска аралык жалпак картадагы чекиттерден айырмаланат. Муну кеңдик менен узундуктун сызыктары бирдей эмес экендиги менен айкалыштырсаңыз… жана сизде кыйын эсептөө бар.

Бул жерде Great Circles кандайча иштей тургандыгы жөнүндө фантастикалык видео түшүндүрмө бар.

Гаверсин формуласы

Жердин ийрилигин колдонуучу аралык Жердин ийрилигине жол берүү үчүн тригонометрияны колдонгон Гаверсин формуласына киргизилген. Жердеги 2 жердин ортосундагы аралыкты таап жатканда (карга учуп баратканда), түз сызык чындыгында дога болуп саналат.

Бул абада учууда колдонулат – сиз качандыр бир жолу каттамдардын чыныгы картасын карап көрүп, алардын аркалуу экенин байкадыңыз беле? Себеби эки чекиттин ортосундагы аркада учуу түз жерге караганда кыскараак.

PHP: Кеңдик менен Узундуктун 2 пунктунун ортосундагы аралыкты эсептөө

Бул жерде эки чекиттин ортосундагы аралыкты эсептөө үчүн РНР формуласы (Mile vs. Kilometre конверсиясы менен бирге) эки ондук белгиге тегеректелет.

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 – биринчи жайгашкан жериңиздин кеңдиги үчүн өзгөрмө.
  • $Узундук1 – биринчи жайгашкан жериңиздин узундугу үчүн өзгөрмө
  • $Latitude2 – экинчи жайгашкан жериңиздин кеңдиги үчүн өзгөрмө.
  • $Узундук2 – экинчи жайгашкан жериңиздин узундугу үчүн өзгөрмө.
  • $бирдик – демейки болуу ми. Бул жаңыртылышы же катары өтүшү мүмкүн километр.

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 – экинчи жайгашкан жериңиздин узундугу үчүн өзгөрмө.
  • бирдиги – демейки болуу ми. Бул жаңыртылышы же катары өтүшү мүмкүн километр.

Python: кеңдик менен узундуктун 2 чекитинин ортосундагы аралыкты эсептеңиз

Бул жерде эки чекиттин ортосундагы аралыкты эсептөө үчүн Python формуласы (Mile vs. Kilometre конверсиясы менен бирге) эки ондук орунга тегеректелет. Менин уулума, Билл Каррга, маалымат таануучу OpenINSIGHTS, код үчүн.

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 Гаверсин формуласын колдонот. Бул жакындоо көпчүлүк практикалык максаттар үчүн ылайыктуу, бирок өтө алыс аралыктар үчүн бир аз так эместиктерди жаратышы мүмкүн.

Бул жерде сиз мейкиндик маалыматтарынын түрлөрүн колдонуп эки чекиттин ортосундагы аралыкты кантип эсептей аласыз:

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

Эгер сиз Microsoft SQL Server колдонуп жатсаңыз, алар өз функцияларын сунушташат, STDistance Geography маалымат түрүн колдонуу менен эки чекиттин ортосундагы аралыкты эсептөө үчүн.

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 болуп саналат OpenINSIGHTS жана негиздөөчүсү Martech Zone. Дуглас ондогон ийгиликтүү MarTech стартаптарына жардам берди, Martech сатып алууларына жана инвестицияларына 5 миллиард доллардан ашык каражатты текшерүүгө жардам берди жана компанияларга сатуу жана маркетинг стратегияларын ишке ашырууда жана автоматташтырууда жардам берүүнү улантууда. Дуглас эл аралык деңгээлде таанылган санариптик трансформация жана MarTech эксперти жана спикери. Дуглас ошондой эле Dummie's guide жана бизнес лидерлик китебинин басылып чыккан автору.

Тектеш макалалар

Артка жогорку баскычы
жакын

Adblock аныкталды

Martech Zone Бул мазмунду сизге эч кандай акы төлөбөй бере алат, анткени биз сайтыбызды жарнамадан түшкөн киреше, өнөктөштүк шилтемелер жана демөөрчүлүк аркылуу акча табабыз. Биздин сайтты көрүп жатканыңызда жарнама блокаторуңузду алып салсаңыз, биз ыраазыбыз.