Analytics & DeuchainnCRM agus Àrd-chabhsairean DàtaInnealan margaidheachd

Obraich a-mach no cuir ceist air an astar cearcallach mòr eadar puingean leud agus leud a’ cleachdadh foirmle Haversine (eisimpleirean PHP, JavaScript, Java, Python, MySQL, MSSQL)

A’ mhìos seo, tha mi air a bhith a’ dèanamh phrògraman ann am PHP agus MySQL airson GIS. Fhad 's a bha mi a' rannsachadh a' chuspair, bha duilgheadas agam a lorg àireamhachadh cruinn-eòlasach gus an astar eadar dà àite a lorg, agus mar sin bha mi airson an roinn an seo.

Mapa itealain Eòrpa le astar mòr cearcaill

Is e an dòigh sìmplidh air astar eadar dà phuing obrachadh a-mach a bhith a ’cleachdadh foirmle Pythagorean gus hypotenuse triantan obrachadh a-mach (A² + B² = C²). Canar seo ris an Astar Euclidean.

Is e toiseach tòiseachaidh inntinneach a tha sin, ach chan eil e a’ buntainn ri cruinn-eòlas leis gu bheil an astar eadar loidhnichean domhan-leud is domhan-leud chan eil astaran co-ionann bho chèile. Mar a thig thu nas fhaisge air a’ chrios-meadhain, bidh loidhnichean domhan-leud a’ dol nas fhaide bho chèile. Ma chleachdas tu co-aontar triantanachaidh sìmplidh, faodaidh e astar a thomhas gu ceart ann an aon àite agus ceàrr anns an àite eile air sgàth lùbadh na Talmhainn.

Astar Cearcall Mòr

Canar an t-Astar Cearcall Mòr ris na slighean a shiubhail astaran fada timcheall na Talmhainn. Is e sin… tha an t-astar as giorra eadar dà phuing air cruinne eadar-dhealaichte bho na puingean air mapa rèidh. Cuir sin còmhla ris an fhìrinn nach eil loidhnichean domhan-leud is domhan-leud co-ionann… agus tha àireamhachadh duilich agad.

Seo mìneachadh bhidio air leth math air mar a tha Great Circles ag obair.

Foirmle Haversine

Tha an t-astar a’ cleachdadh curvature na Talmhainn air a ghabhail a-steach ann am foirmle Haversine, a bhios a’ cleachdadh trigonometry gus leigeil le curvature na Talmhainn. Nuair a lorgas tu an astar eadar 2 àite air an Talamh (mar a bhios an fheannag ag itealaich), is e arc a th’ ann an loidhne dhìreach.

Tha seo iomchaidh ann an itealan adhair - an do choimhead thu a-riamh air a’ mhapa de thursan-adhair agus an do mhothaich thu gu bheil bogha aca? Tha sin air sgàth gu bheil itealaich ann am bogha eadar dà phuing nas giorra na dìreach chun an àite.

PHP: Obraich a-mach astar eadar 2 phuing domhan-leud is domhan-leud

Seo am foirmle PHP airson obrachadh a-mach an astair eadar dà phuing (còmhla ri tionndadh Mile vs Kilometer) cruinn gu dà ionad deicheach.

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

Is iad na caochladairean:

  • $ leud 1 - caochladair airson domhan-leud a’ chiad àite agad.
  • $ domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
  • $ leud 2 - caochladair airson leud an dàrna àite agad.
  • $ domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
  • $aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.

Java: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud

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

Is iad na caochladairean:

  • domhanleithead 1 - caochladair airson domhan-leud a’ chiad àite agad.
  • domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
  • domhanleithead 2 - caochladair airson leud an dàrna àite agad.
  • domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
  • aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.

JavaScript: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud

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

Is iad na caochladairean:

  • domhanleithead 1 - caochladair airson domhan-leud a’ chiad àite agad.
  • domhan-leud 1 - caochladair airson domhan-leud a’ chiad àite agad
  • domhanleithead 2 - caochladair airson leud an dàrna àite agad.
  • domhan-leud 2 - caochladair airson domhan-leud an dàrna àite agad.
  • aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.

Python: Obraich a-mach an astar eadar 2 phuing leudachaidh agus leud

Seo am foirmle Python airson obrachadh a-mach an astair eadar dà phuing (còmhla ri tionndadh Mile vs. Kilometer) cruinn gu dà ionad deicheach. Cliù dha mo mhac, Bill Karr, neach-saidheans dàta airson OSNAIDHEAN BHO IFRINN, airson a 'chòd.

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)

Is iad na caochladairean:

  • domhanleithead 1 - caochladair airson a’ chiad àite agad domhan-leud.
  • domhan-leud 1 - caochladair airson a’ chiad àite agad domhan-leud
  • domhanleithead 2 - caochladair airson an dàrna àite agad domhan-leud.
  • domhan-leud 2 - caochladair airson an dàrna àite agad domhan-leud.
  • aonad - an suidheachadh bunaiteach mìle. Faodar seo ùrachadh no a thoirt seachad mar cilemeatair.

MySQL: A’ faighinn a h-uile clàr air ais taobh a-staigh raon le bhith a’ tomhas astar nam mìltean a’ cleachdadh leud agus leud

Tha cleachdadh Seòrsan Dàta Spàsail ann am MySQL na dhòigh nas èifeachdaiche agus nas goireasaiche air obrachadh le dàta cruinn-eòlasach, a’ gabhail a-steach obrachadh a-mach astaran eadar puingean. Tha MySQL a’ toirt taic do sheòrsan dàta spàsail leithid POINT, LINESTRING, agus POLYGON, còmhla ri gnìomhan spàsail mar ST_Distance.

Nuair a chleachdas tu an ST_Distance gnìomh ann am MySQL le dàta cruinn-eòlasach air a riochdachadh mar POINT co-chomharran, bidh e a’ gabhail a-steach curvature uachdar na Talmhainn. Am modail spherical a chleachdar le ST_Distance a’ cleachdadh foirmle Haversine. Tha an tuairmse seo freagarrach airson a’ mhòr-chuid de dh’ adhbharan practaigeach ach dh’ fhaodadh e beagan mearachd a thoirt a-steach airson astaran glè fhada.

Seo mar as urrainn dhut astaran eadar dà phuing obrachadh a-mach a’ cleachdadh Seòrsan Dàta Spàsail:

  1. Cruthaich Clàr le Seòrsa Dàta Spàsail: An toiseach, cruthaich clàr le a POINT colbh gus puingean cruinn-eòlais a stòradh. Mar eisimpleir:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Cuir na puingean cruinn-eòlais agad a-steach don chlàr seo a’ cleachdadh an fhaidhle POINT neach-togail:

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. Obraich a-mach an astar a’ cleachdadh ST_Distance: Faodaidh tu an astar eadar dà phuing obrachadh a-mach a’ cleachdadh an ST_Distance gnìomh. Seo eisimpleir de cheist airson obrachadh a-mach an astar eadar dà phuing:
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;

Replace 1 agus 2 le IDan an dà phuing a tha thu airson obrachadh a-mach an astar eadar.

  1. toradh: Tillidh a’ cheist an astar eadar an dà phuing ann am mìltean.

A’ cleachdadh seòrsaichean dàta spàsail agus an ST_Distance tha gnìomh a’ toirt seachad dòigh nas èifeachdaiche agus nas ceart air obrachadh le dàta cruinn-eòlasach ann am MySQL. Bidh e cuideachd a’ sìmpleachadh àireamhachadh astaran eadar puingean, ga dhèanamh nas fhasa an dàta agad a riaghladh agus a cheasnachadh.

MySQL: A’ faighinn a h-uile clàr air ais taobh a-staigh raon le bhith a’ tomhas astair ann an cilemeatairean a’ cleachdadh leud agus leud

Gu bunaiteach ST_Distance tillidh tu an astar ann am meatairean, agus mar sin cha leig thu leas ach a’ cheist ùrachadh airson cilemeatairean:

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;

Astar cruinn-eòlasach Microsoft SQL Server: STDistance

Ma tha thu a’ cleachdadh Microsoft SQL Server, bidh iad a’ tabhann an gnìomh fhèin, STDastar airson obrachadh a-mach an astair eadar dà phuing a’ cleachdadh an seòrsa dàta Cruinn-eòlas.

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

Hat tip gu Manash Sahoo, stèidheadair agus àrd ailtire aig Ion Tri.

Douglas Karr

Douglas Karr tha CMO de OSNAIDHEAN BHO IFRINN agus am fear a stèidhich an Martech Zone. Tha Douglas air dusanan de luchd-tòiseachaidh soirbheachail MarTech a chuideachadh, air cuideachadh le dìcheall iomchaidh de chòrr air $ 5 billean ann an togail agus tasgaidhean Martech, agus a’ leantainn air adhart a ’cuideachadh chompanaidhean ann a bhith a’ buileachadh agus ag fèin-ghluasad an ro-innleachdan reic is margaidheachd. Tha Douglas na chruth-atharrachadh didseatach a tha aithnichte gu h-eadar-nàiseanta agus eòlaiche agus neach-labhairt MarTech. Tha Dùbhghlas cuideachd na ùghdar foillsichte air iùl Dummie agus leabhar stiùireadh gnìomhachais.

artaigealan co-cheangailte

Putan air ais dhan mhullach
Dùin

Adblock air a lorg

Martech Zone comasach air an t-susbaint seo a thoirt dhut gun chosgais sam bith oir bidh sinn a’ dèanamh airgead air an làrach againn tro theachd-a-steach sanasachd, ceanglaichean ceangailte, agus urrasachd. Bhithinn toilichte nan toireadh tu air falbh an neach-bacadh sanasachd agad fhad ‘s a tha thu a’ coimhead air an làrach againn.