Bala noma Buza Ibanga Lombuthano Omkhulu Phakathi Kwamaphuzu E-Latitude kanye ne-Longitude usebenzisa i-Haversine Formula (PHP, JavaScript, Java, Python, MySQL, MSSQL Examples)
Kule nyanga, bengihlela ku-PHP kanye ne-MySQL ye-GIS. Ngesikhathi ngicwaninga ngesihloko, ngaba nobunzima bokuthola izibalo zendawo ukuthola ibanga phakathi kwezindawo ezimbili, ngakho bengifuna ukwabelana ngazo lapha.
Indlela elula yokubala ibanga phakathi kwamaphoyinti amabili usebenzisa ifomula yePythagorean ukubala i-hypotenuse kanxantathu (A² + B² = C²). Lokhu kwaziwa njenge Ibanga le-Euclidean.
Leso isiqalo esithakazelisayo, kodwa asisebenzi ku-geography njengoba ibanga eliphakathi kwemigqa ye-latitude nobude amabanga alinganayo ngokwehlukana. Njengoba usondela eduze nenkabazwe, imigqa ye-latitude ihlukana kakhulu. Uma usebenzisa i-equation kanxantathu elula, ingase ilinganise ibanga ngokunembile endaweni eyodwa futhi ingalungile kwenye ngenxa yokugoba komhlaba.
Ibanga Lomjikelezo Omkhulu
Izindlela ezihamba amabanga amade emhlabeni zaziwa ngokuthi yiGreat Circle Distance. Okungukuthi… ibanga elifushane kakhulu phakathi kwamaphoyinti amabili kwindilinga liyahluka kumaphuzu akumephu eyisicaba. Hlanganisa lokho nokuthi imigqa ye-latitude ne-longitude ayilingani… futhi unesibalo esinzima.
Nayi incazelo yevidiyo emnandi yokuthi amaGreat Circles asebenza kanjani.
I-Haversine Formula
Ibanga elisebenzisa ukugoba komhlaba lifakwe kufomula ye-Haversine, esebenzisa i-trigonometry ukuze ivumele ukugoba komhlaba. Uma uthola ibanga phakathi kwezindawo ezi-2 eMhlabeni (njengoba igwababa lindiza), umugqa oqondile empeleni uyi-arc.
Lokhu kuyasebenza endizeni yendiza - ingabe uke wabheka imephu yangempela yezindiza futhi waqaphela ukuthi i-arched? Lokho kungenxa yokuthi ukundiza emgwaqeni phakathi kwamaphoyinti amabili kufushane kunokuya ngqo endaweni.
I-PHP: Bala Ibanga Phakathi kwamaphoyinti ama-2 weLatitude ne-Longitude
Nansi ifomula ye-PHP yokubala ibanga phakathi kwamaphoyinti amabili (kanye nokuguqulwa kwe-Mile vs. Kilometer) okuzungezwe ezindaweni ezimbili zedesimali.
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));
}
Okuguquguqukayo yizi:
- $Latitude1 – okuguquguqukayo kwelathithudi yendawo yakho yokuqala.
- $Longitude1 – okuguquguqukayo kwe-longitude yendawo yakho yokuqala
- $Latitude2 – okuguquguqukayo kwelathithudi yendawo yakho yesibili.
- $Longitude2 – okuguquguqukayo kwe-longitude yendawo yakho yesibili.
- Iyunithi ye-$ – okuzenzakalelayo miles. Lokhu kungabuyekezwa noma kudluliswe njenge amakhilomitha.
I-Java: Bala Ibanga Phakathi Kwamaphuzu angu-2 we-Latitude kanye ne-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;
}
}
Okuguquguqukayo yizi:
- i-latitude1 – okuguquguqukayo kwelathithudi yendawo yakho yokuqala.
- ubude1 – okuguquguqukayo kwe-longitude yendawo yakho yokuqala
- i-latitude2 – okuguquguqukayo kwelathithudi yendawo yakho yesibili.
- ubude2 – okuguquguqukayo kwe-longitude yendawo yakho yesibili.
- Iyunithi – okuzenzakalelayo miles. Lokhu kungabuyekezwa noma kudluliswe njenge amakhilomitha.
I-JavaScript: Bala Ibanga Phakathi Kwamaphuzu angu-2 we-Latitude kanye ne-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);
}
}
Okuguquguqukayo yizi:
- i-latitude1 – okuguquguqukayo kwelathithudi yendawo yakho yokuqala.
- ubude1 – okuguquguqukayo kwe-longitude yendawo yakho yokuqala
- i-latitude2 – okuguquguqukayo kwelathithudi yendawo yakho yesibili.
- ubude2 – okuguquguqukayo kwe-longitude yendawo yakho yesibili.
- Iyunithi – okuzenzakalelayo miles. Lokhu kungabuyekezwa noma kudluliswe njenge amakhilomitha.
I-Python: Bala Ibanga Phakathi Kwamaphuzu angu-2 we-Latitude kanye ne-Longitude
Nansi ifomula yePython yokubala ibanga phakathi kwamaphoyinti amabili (kanye nokuguqulwa kwe-Mile vs. Kilometer) okuzungezwe ezindaweni ezimbili zedesimali. Ikhredithi endodaneni yami, uBill Karr, i-Data Scientist VulaINSIGHTS, ngekhodi.
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)
Okuguquguqukayo yizi:
- i-latitude1 – okuguquguqukayo kwendawo yakho yokuqala i-latitude.
- ubude1 – okuguquguqukayo kwendawo yakho yokuqala ubude
- i-latitude2 – okuguquguqukayo kwendawo yakho yesibili i-latitude.
- ubude2 – okuguquguqukayo kwendawo yakho yesibili ubude.
- Iyunithi – okuzenzakalelayo miles. Lokhu kungabuyekezwa noma kudluliswe njenge amakhilomitha.
I-MySQL: Ukubuyisa Wonke Amarekhodi Ngaphakathi Kwebanga Ngokubala Ibanga Ngamamayela Usebenzisa I-Latitude ne-Longitude
Ukusebenzisa Izinhlobo Zedatha Yendawo ku-MySQL kuyindlela esebenza kahle futhi elula yokusebenza ngedatha yendawo, okuhlanganisa ukubala amabanga phakathi kwamaphoyinti. I-MySQL isekela Izinhlobo Zedatha Yendawo njenge POINT
, LINESTRING
, Futhi POLYGON
, kanye nemisebenzi yendawo efana ST_Distance
.
Lapho usebenzisa ST_Distance
sebenza ku-MySQL ngedatha yendawo emelwe njenge POINT
izixhumanisi, kucabangela ukugoba kobuso boMhlaba. Imodeli eyindilinga esetshenziswa ngu ST_Distance
isebenzisa ifomula ye-Haversine. Lokhu kulinganisa kulungele izinjongo ezingokoqobo kodwa kungase kuthule okunganembile okuncane kumabanga amade kakhulu.
Nansi indlela yokubala amabanga phakathi kwamaphoyinti amabili usebenzisa Izinhlobo Zedatha Yendawo:
- Dala Ithebula Ngohlobo Lwedatha Yendawo: Okokuqala, yakha itafula nge
POINT
ikholomu yokugcina amaphuzu ezindawo. Ngokwesibonelo:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Faka amaphuzu akho ezindawo kuleli thebula usebenzisa i- POINT
umakhi:
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
- Bala Ibanga Usebenzisa ST_Distance: Ungakwazi ukubala ibanga phakathi amaphuzu amabili usebenzisa
ST_Distance
umsebenzi. Nasi isibonelo sombuzo wokubala ibanga phakathi kwamaphoyinti amabili:
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;
Faka esikhundleni 1
futhi 2
ngomazisi bamaphuzu amabili ofuna ukubala ibanga eliphakathi kwawo.
- Result: Umbuzo uzobuyisela ibanga phakathi kwamaphoyinti amabili ngamamayela.
Ukusebenzisa Izinhlobo Zedatha Yendawo kanye ne ST_Distance
umsebenzi uhlinzeka ngendlela esebenza kahle futhi enembe kakhulu yokusebenza ngedatha yendawo ku-MySQL. Iphinde yenze kube lula ukubala amabanga phakathi kwamaphoyinti, okwenza kube lula ukuphatha kanye nokubuza idatha yakho.
I-MySQL: Ukubuyisa Wonke Amarekhodi Ngaphakathi Kwebanga Ngokubala Ibanga Ngamakhilomitha Usebenzisa I-Latitude kanye ne-Longitude
Ngephutha ST_Distance
ibuyisela ibanga ngamamitha, ngakho-ke udinga nje ukubuyekeza umbuzo wamakhilomitha:
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;
I-Microsoft SQL Server Geographic Distance: STDistance
Uma usebenzisa iMicrosoft SQL Server, banikela ngomsebenzi wabo, I-STDistance ngokubala ibanga phakathi kwamaphoyinti amabili kusetshenziswa uhlobo lwedatha yeJografi.
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);
Ithiphu yesigqoko esiya ku-Manash Sahoo, umsunguli kanye nomakhi omkhulu wezakhiwo Ion Three.