Ṣ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.

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:
- Ṣẹ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 - Ṣe iṣiro Ijinna Lilo ST_Distance: O le ṣe iṣiro awọn aaye laarin awọn ojuami meji lilo awọn
ST_Distanceiṣẹ. 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.
- 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.