Dadansoddeg a PhrofiLlwyfannau CRM a DataOffer Marchnata

Cyfrifo neu Ymholi Pellter Cylch Mawr Rhwng Pwyntiau Lledred a Hydred gan Ddefnyddio Fformiwla Haversine (PHP, JavaScript, Java, Python, MySQL, MSSQL Enghreifftiau)

Y mis hwn, rydw i wedi bod yn rhaglennu yn PHP a MySQL ar gyfer GIS. Wrth ymchwilio i'r pwnc, cefais anhawster dod o hyd cyfrifiadau daearyddol i ddarganfod y pellter rhwng dau leoliad, felly roeddwn i eisiau eu rhannu yma.

Map Hedfan Ewrop Gyda Phellter Cylch Mawr

Y ffordd syml o gyfrifo pellter rhwng dau bwynt yw defnyddio fformiwla Pythagorean i gyfrifo hypotenws triongl (A² + B² = C²). Gelwir hyn yn Pellter Ewclidaidd.

Dyna ddechrau diddorol, ond nid yw'n berthnasol i ddaearyddiaeth gan fod y pellter rhwng llinellau lledred a hydred yn nid pellteroedd cyfartal oddi wrth ei gilydd. Wrth i chi ddod yn nes at y cyhydedd, mae llinellau lledred yn mynd ymhellach oddi wrth ei gilydd. Os ydych yn defnyddio hafaliad triongli syml, gall fesur pellter yn gywir mewn un lleoliad ac yn anghywir yn y llall oherwydd crymedd y Ddaear.

Pellter Cylch Mawr

Mae'r llwybrau a deithiwyd yn bell o amgylch y Ddaear yn cael eu hadnabod fel y Pellter Cylch Mawr. Hynny yw... mae'r pellter byrraf rhwng dau bwynt ar sffêr yn wahanol i'r pwyntiau ar fap gwastad. Cyfunwch hynny â'r ffaith nad yw llinellau lledred a hydred yn union yr un peth ... ac mae gennych chi gyfrifiad anodd.

Dyma esboniad fideo gwych o sut mae Great Circles yn gweithio.

Fformiwla Haversine

Mae'r pellter sy'n defnyddio crymedd y Ddaear wedi'i ymgorffori yn fformiwla Haversine, sy'n defnyddio trigonometreg i ganiatáu ar gyfer crymedd y Ddaear. Pan fyddwch chi'n dod o hyd i'r pellter rhwng 2 le ar y Ddaear (fel yr hed y frân), mewn gwirionedd arc yw llinell syth.

Mae hyn yn berthnasol ar gyfer hedfan awyr - ydych chi erioed wedi edrych ar y map gwirioneddol o hediadau a sylwi eu bod yn fwaog? Mae hynny oherwydd bod hedfan mewn bwa rhwng dau bwynt yn fyrrach nag yn uniongyrchol i'r lleoliad.

PHP: Cyfrifwch y Pellter Rhwng 2 Bwynt Lledred a Hydred

Dyma'r fformiwla PHP ar gyfer cyfrifo'r pellter rhwng dau bwynt (ynghyd â thrawsnewid Milltir yn erbyn Cilomedr) wedi'i dalgrynnu i ddau le degol.

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

Y newidynnau yw:

  • $ lledred1 – newidyn ar gyfer lledred eich lleoliad cyntaf.
  • $hydred1 – newidyn ar gyfer hydred eich lleoliad cyntaf
  • $ lledred2 – newidyn ar gyfer lledred eich ail leoliad.
  • $hydred2 – newidyn ar gyfer hydred eich ail leoliad.
  • $uned – y rhagosodiad yw milltiroedd. Gellir diweddaru hwn neu ei basio fel cilomedr.

Java: Cyfrifwch y Pellter Rhwng 2 Bwynt Lledred a Hydred

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

Y newidynnau yw:

  • lledred1 – newidyn ar gyfer lledred eich lleoliad cyntaf.
  • hydred1 – newidyn ar gyfer hydred eich lleoliad cyntaf
  • lledred2 – newidyn ar gyfer lledred eich ail leoliad.
  • hydred2 – newidyn ar gyfer hydred eich ail leoliad.
  • uned – y rhagosodiad yw milltiroedd. Gellir diweddaru hwn neu ei basio fel cilomedr.

JavaScript: Cyfrifwch y Pellter Rhwng 2 Bwynt Lledred a Hydred

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

Y newidynnau yw:

  • lledred1 – newidyn ar gyfer lledred eich lleoliad cyntaf.
  • hydred1 – newidyn ar gyfer hydred eich lleoliad cyntaf
  • lledred2 – newidyn ar gyfer lledred eich ail leoliad.
  • hydred2 – newidyn ar gyfer hydred eich ail leoliad.
  • uned – y rhagosodiad yw milltiroedd. Gellir diweddaru hwn neu ei basio fel cilomedr.

Python: Cyfrifwch y Pellter Rhwng 2 Bwynt Lledred a Hydred

Dyma fformiwla Python ar gyfer cyfrifo'r pellter rhwng dau bwynt (ynghyd â thrawsnewid Milltir yn erbyn Cilomedr) wedi'i dalgrynnu i ddau le degol. Credyd i fy mab, Bill Karr, Gwyddonydd Data am AGOREDION, ar gyfer y cod.

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)

Y newidynnau yw:

  • lledred1 – newidyn ar gyfer eich lleoliad cyntaf lledred.
  • hydred1 – newidyn ar gyfer eich lleoliad cyntaf hydred
  • lledred2 – newidyn ar gyfer eich ail leoliad lledred.
  • hydred2 – newidyn ar gyfer eich ail leoliad hydred.
  • uned – y rhagosodiad yw milltiroedd. Gellir diweddaru hwn neu ei basio fel cilomedr.

MySQL: Adalw Pob Cofnod O Fewn Ystod Trwy Gyfrifo Pellter Mewn Milltiroedd Gan Ddefnyddio Lledred a Hydred

Mae defnyddio Mathau Data Gofodol yn MySQL yn ffordd fwy effeithlon a chyfleus o weithio gyda data daearyddol, gan gynnwys cyfrifo pellteroedd rhwng pwyntiau. Mae MySQL yn cefnogi Mathau Data Gofodol megis POINT, LINESTRING, a POLYGON, ynghyd â swyddogaethau gofodol fel ST_Distance.

Pan ddefnyddiwch y ST_Distance swyddogaeth yn MySQL gyda data daearyddol yn cael ei gynrychioli fel POINT cyfesurynnau, mae'n cymryd i ystyriaeth y crymedd o wyneb y Ddaear. Y model sfferig a ddefnyddir gan ST_Distance yn defnyddio fformiwla Haversine. Mae'r brasamcan hwn yn addas ar gyfer y rhan fwyaf o'r dibenion ymarferol ond gall gyflwyno mân wallau am bellteroedd hir iawn.

Dyma sut y gallwch gyfrifo pellteroedd rhwng dau bwynt gan ddefnyddio Mathau o Ddata Gofodol:

  1. Creu Tabl gyda Math o Ddata Gofodol: Yn gyntaf, creu tabl gyda a POINT colofn i storio pwyntiau daearyddol. Er enghraifft:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Rhowch eich pwyntiau daearyddol yn y tabl hwn gan ddefnyddio'r POINT adeiladwr:

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. Cyfrifo Pellter Gan Ddefnyddio ST_Distance: Gallwch gyfrifo'r pellter rhwng dau bwynt gan ddefnyddio'r ST_Distance swyddogaeth. Dyma ymholiad enghreifftiol i gyfrifo'r pellter rhwng dau bwynt:
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;

Disodli 1 ac 2 gydag IDau'r ddau bwynt rydych chi am gyfrifo'r pellter rhyngddynt.

  1. Canlyniad: Bydd yr ymholiad yn dychwelyd y pellter rhwng y ddau bwynt mewn milltiroedd.

Defnyddio Mathau Data Gofodol a'r ST_Distance Mae swyddogaeth yn darparu ffordd fwy effeithlon a chywir o weithio gyda data daearyddol yn MySQL. Mae hefyd yn symleiddio cyfrifo pellteroedd rhwng pwyntiau, gan ei gwneud yn haws rheoli a chwestiynu eich data.

MySQL: Adalw Pob Cofnod O Fewn Ystod Trwy Gyfrifo Pellter Mewn Cilomedrau Gan Ddefnyddio Lledred a Hydred

Yn ddiofyn ST_Distance yn dychwelyd y pellter mewn metrau, felly yn syml, mae angen i chi ddiweddaru'r ymholiad am gilometrau:

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;

Pellter Daearyddol Gweinyddwr SQL Microsoft: STDistance

Os ydych chi'n defnyddio Microsoft SQL Server, maen nhw'n cynnig eu swyddogaeth eu hunain, STPellter ar gyfer cyfrifo'r pellter rhwng dau bwynt gan ddefnyddio'r math o ddata Daearyddiaeth.

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

Awgrym i Manash Sahoo, sylfaenydd ac uwch bensaer yn Ion Tri.

Douglas Karr

Douglas Karr yn CMO o AGOREDION a sylfaenydd y Martech Zone. Mae Douglas wedi helpu dwsinau o fusnesau newydd llwyddiannus MarTech, wedi cynorthwyo gyda diwydrwydd dyladwy o dros $5 bil mewn caffaeliadau a buddsoddiadau Martech, ac yn parhau i gynorthwyo cwmnïau i weithredu ac awtomeiddio eu strategaethau gwerthu a marchnata. Mae Douglas yn arbenigwr trawsnewid digidol ac yn siaradwr MarTech a gydnabyddir yn rhyngwladol. Mae Douglas hefyd yn awdur cyhoeddedig canllaw Dummie a llyfr arweinyddiaeth busnes.

Erthyglau Perthnasol

Yn ôl i'r brig botwm
Cau

Adblock Wedi'i Ganfod

Martech Zone yn gallu darparu'r cynnwys hwn i chi heb unrhyw gost oherwydd ein bod yn rhoi arian i'n gwefan trwy refeniw hysbysebu, dolenni cyswllt, a nawdd. Byddem yn gwerthfawrogi petaech yn cael gwared ar eich rhwystrwr hysbysebion wrth i chi edrych ar ein gwefan.