Atupale & IdanwoAwọn iru ẹrọ Alabara OnibaraAwọn irinṣẹ Titaja

Ṣe iṣiro tabi Beere Ijinna Circle Nla Laarin Awọn aaye ti Latitude ati Longitude Lilo Ilana Haversine (PHP, JavaScript, Java, Python, MySQL, Awọn apẹẹrẹ MSSQL)

Ni oṣu yii, Mo ti ṣe eto ni PHP ati MySQL fun GIS. Lakoko ti o n ṣe iwadii koko-ọrọ naa, Mo ni iṣoro wiwa àgbègbè isiro lati wa aaye laarin awọn ipo meji, nitorina ni mo ṣe fẹ pin wọn nibi.

Ọna ti o rọrun lati ṣe iṣiro aaye laarin awọn aaye meji ni lilo agbekalẹ Pythagorean lati ṣe iṣiro hypotenuse ti onigun mẹta kan (A² + B² = C²). Eyi ni a mọ bi awọn Ijinna Euclidean.

1 Bi o ṣe n sunmọ equator, awọn ila ti latitude yoo lọ siwaju. Ti o ba lo idogba onigun mẹta ti o rọrun, o le wiwọn ijinna ni deede ni ipo kan ati ni aṣiṣe ni omiiran nitori ìsépo ti Earth.

image

Nla Circle Nla

Awọn ipa-ọna ti o rin irin-ajo gigun ni ayika Earth ni a mọ ni Ijinna Circle Nla. Iyẹn ni… aaye to kuru ju laarin awọn aaye meji lori aaye kan yatọ si iyẹn lori maapu alapin. Darapọ iyẹn pẹlu otitọ pe latitude ati awọn laini gigun kii ṣe deede… ati pe o ti ni iṣiro ti o nira.

Eyi ni alaye fidio ikọja ti bii Awọn Circle Nla ṣe n ṣiṣẹ.

Ilana Haversine

Ijinna nipa lilo ìsépo ti Earth ti wa ni dapọ ninu awọn Haversine agbekalẹ, eyi ti o nlo trigonometry lati gba fun awọn Earth ká ìsépo. Laini titọ jẹ aaki nigbati o ba wa aaye laarin awọn aaye 2 lori Earth (bi ẹyẹ ti n fo).

Eyi wulo fun irin-ajo afẹfẹ. Njẹ o ti wo maapu gangan ti awọn ọkọ ofurufu ati ṣe akiyesi pe wọn ti gbe soke bi? Iyẹn jẹ nitori fifo ni aaye laarin awọn aaye meji kuru ju lilọ taara si ipo naa.

PHP: Ṣe iṣiro Ijinna Laarin Awọn aaye 2 ti Latitude ati Longitude

Eyi ni agbekalẹ PHP fun iṣiro aaye laarin awọn aaye meji (pẹlu Mile vs. Kilometer iyipada) ti yika si awọn aaye eleemewa meji.

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

Awọn oniyipada ni:

  • $Latitude1 - oniyipada fun latitude ipo akọkọ rẹ.
  • $Longitude1 – a oniyipada fun rẹ akọkọ ipo ká ìgùn
  • $Latitude2 – oniyipada kan fun latitude ipo keji rẹ.
  • $Longitude2 – a oniyipada fun keji ipo rẹ ká ìgùn.
  • $kuro – awọn aiyipada kookan egbegberun. Eyi le ṣe imudojuiwọn tabi kọja bi ibuso.

Java: Ṣe iṣiro Ijinna Laarin Awọn aaye 2 ti Latitude ati Longitude

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

Awọn oniyipada ni:

  • latitude1 - oniyipada fun latitude ipo akọkọ rẹ.
  • ìgùn 1 – a oniyipada fun rẹ akọkọ ipo ká ìgùn
  • latitude2 – oniyipada kan fun latitude ipo keji rẹ.
  • ìgùn 2 – a oniyipada fun keji ipo rẹ ká ìgùn.
  • kuro – awọn aiyipada kookan egbegberun. Eyi le ṣe imudojuiwọn tabi kọja bi ibuso.

JavaScript: Ṣe iṣiro Ijinna Laarin Awọn aaye 2 ti Latitude ati Longitude

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

Awọn oniyipada ni:

  • latitude1 - oniyipada fun latitude ipo akọkọ rẹ.
  • ìgùn 1 – a oniyipada fun rẹ akọkọ ipo ká ìgùn
  • latitude2 – oniyipada kan fun latitude ipo keji rẹ.
  • ìgùn 2 – a oniyipada fun keji ipo rẹ ká ìgùn.
  • kuro – awọn aiyipada kookan egbegberun. Eyi le ṣe imudojuiwọn tabi kọja bi ibuso.

Python: Ṣe iṣiro Ijinna Laarin Awọn aaye 2 ti Latitude ati Longitude

Eyi ni agbekalẹ Python fun iṣiro aaye laarin awọn aaye meji (pẹlu Mile vs. Kilometer iyipada) yika si awọn aaye eleemewa meji. Kirẹditi si ọmọ mi, Bill Karr, Onimọn-jinlẹ data fun Ṣii awọn oye, fun koodu.

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)

Awọn oniyipada ni:

  • latitude1 - oniyipada fun ipo akọkọ rẹ latitude.
  • ìgùn 1 - oniyipada fun ipo akọkọ rẹ jijin
  • latitude2 - oniyipada fun ipo keji rẹ latitude.
  • ìgùn 2 - oniyipada fun ipo keji rẹ jijin.
  • kuro – awọn aiyipada kookan egbegberun. Eyi le ṣe imudojuiwọn tabi kọja bi ibuso.

MySQL: Gbigba Gbogbo Awọn igbasilẹ Laarin Ibiti Kan Nipa Iṣiro Ijinna Ni Miles Lilo Latitude ati Longitude

Lilo Awọn oriṣi Data Aye ni MySQL jẹ ọna ti o munadoko diẹ sii ati irọrun lati ṣiṣẹ pẹlu data agbegbe, pẹlu iṣiro awọn aaye laarin awọn aaye. MySQL ṣe atilẹyin Awọn oriṣi Data Spatial gẹgẹbi POINT, LINESTRING, Ati POLYGON, pẹlu awọn iṣẹ aye bi ST_Distance.

Nigbati o ba lo awọn ST_Distance iṣẹ ni MySQL pẹlu àgbègbè data ni ipoduduro bi POINT ipoidojuko, o ka ìsépo ti awọn Earth ká dada. Awoṣe ti iyipo lo nipasẹ ST_Distance nlo ilana Haversine. Isunmọ yii dara fun awọn idi iwulo pupọ julọ ṣugbọn o le ṣafihan awọn aiṣedeede diẹ fun awọn ijinna pipẹ.

Eyi ni bii o ṣe le ṣe iṣiro awọn aaye laarin awọn aaye meji nipa lilo Awọn oriṣi Data Aye:

  1. Ṣẹda Tabili pẹlu Iru Data Aye: Ni akọkọ, ṣẹda tabili pẹlu kan POINT ọwọn lati tọju awọn aaye agbegbe. Fun apere:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Fi rẹ lagbaye ojuami sinu yi tabili lilo awọn POINT olupilẹṣẹ:

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. Ṣe iṣiro Ijinna Lilo ST_Distance: O le ṣe iṣiro awọn aaye laarin awọn ojuami meji lilo awọn ST_Distance iṣẹ. Eyi ni ibeere apẹẹrẹ lati ṣe iṣiro aaye laarin awọn aaye meji:
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;

Rọpo 1 ati 2 pẹlu awọn ID ti awọn ojuami meji ti o fẹ lati ṣe iṣiro awọn aaye laarin awọn.

  1. esi: Ibeere naa yoo da aaye pada laarin awọn aaye meji ni awọn maili.

Lilo Awọn oriṣi Data Aye ati awọn ST_Distance iṣẹ n pese ọna ti o munadoko diẹ sii ati deede lati ṣiṣẹ pẹlu data agbegbe ni MySQL. O tun rọrun lati ṣe iṣiro awọn aaye laarin awọn aaye, jẹ ki o rọrun lati ṣakoso ati beere data rẹ.

MySQL: Gbigba Gbogbo Awọn igbasilẹ Laarin Ibiti Kan Nipa Iṣiro Ijinna Ni Awọn kilomita Lilo Latitude ati Longitude

Nipa aiyipada ST_Distance da ijinna pada ni awọn mita, nitorinaa o kan nilo lati ṣe imudojuiwọn ibeere fun awọn kilomita:

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;

Ijinna SQL Server Microsoft SQL: STDistance

Ti o ba nlo Microsoft SQL Server, wọn funni ni iṣẹ kan ti a pe STDstance fun iṣiro aaye laarin awọn aaye meji nipa lilo iru data 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);  

Hat sample to Manash Sahoo, oludasile ati oga ayaworan ni Ion mẹta.

Douglas Karr

Douglas Karr jẹ Oloye Titaja Oloye ida kan ti o ṣe amọja ni awọn ile-iṣẹ SaaS ati AI, nibiti o ti ṣe iranlọwọ awọn iṣẹ ṣiṣe titaja iwọn, wakọ iran ibeere, ati imuse awọn ilana agbara AI. O si jẹ oludasile ati akede ti Martech Zone, atẹjade to gaju ni… Die e sii »
Pada si bọtini oke
Close

Ti ṣe awari Adblock

A gbẹkẹle awọn ipolowo ati awọn onigbọwọ lati tọju Martech Zone ofe. Jọwọ ro pe o pa oludèna ipolowo rẹ di-tabi ṣe atilẹyin fun wa pẹlu ti ifarada, ọmọ ẹgbẹ ọfẹ ọfẹ ($ 10 US):

Wole Up Fun An Lododun omo egbe