Tatauhia, Uiui ranei te Tawhiti Porowhita Nui i waenga i nga Piro o te ahopae me te ahopou ma te whakamahi i te tauira Haversine (PHP, JavaScript, Java, Python, MySQL, MSSQL Tauira)
I tenei marama, kua whakamaori ahau ki te PHP me MySQL mo GIS. I a au e rangahau ana i te kaupapa, i uaua ahau ki te kimi tātai matawhenua ki te kimi i te tawhiti i waenga i nga waahi e rua, no reira i hiahia ahau ki te whakapuaki i a raatau ki konei.
Ko te huarahi ngawari ki te tatau i te tawhiti i waenga i nga tohu e rua, ko te whakamahi i te ture Pythagorean ki te tatau i te hypotenuse o te tapatoru (A + + B² = C²). E mohiotia ana tenei ko te Te tawhiti o Euclidean.
He timatanga pai tena, engari karekau e pa ki te matawhenua i te mea ko te tawhiti i waenga i nga rarangi ahopae me te ahopou he e kore e rite nga tawhitinga wehe. I a koe e tata atu ana ki te equator, ka wehe ke atu nga rarangi ahopae. Mēnā ka whakamahi koe i te whārite tapatoru māmā, tērā pea ka ine tika i te tawhiti ki tētahi wāhi, ā, ka hē ki tērā atu nā te kōpiko o Papatūānuku.
Tawhiti Porowhita Nui
Ko nga huarahi i haere i tawhiti huri noa i te Ao e mohiotia ana ko te Tawhiti Porowhita Nui. Ko… te tawhiti poto rawa i waenga i nga tohu e rua i runga i te porowhita he rereke ki nga tohu o te mapi papatahi. Whakakotahitia tena me te mea ko nga rarangi ahopae me nga raina ahopou kaore i te rite te tawhiti… he uaua hoki to tatauranga.
Anei tetahi whakamarama ataata pai mo te mahinga o nga Porowhita Nui.
Te Tātai Haversine
Ko te tawhiti e whakamahi ana i te kopiko o Papa kua whakauruhia ki roto i te tauira Haversine, e whakamahi ana i te pakoko kia taea ai te kopikopiko o Papa. Ina kitea e koe te tawhiti i waenga i nga waahi e 2 o te whenua (i te mea e rere ana te kakao), he tino pewa te raina tika.
E tika ana tenei mo te rerenga rererangi - kua titiro koe ki te mapi o nga rerenga rererangi ka kite koe kei te kikorangi? Ko te mea he poto ake te rere i roto i te kikorangi i waenga i nga waahi e rua i te tika ki te waahi.
PHP: Tatau Taa tawhiti I waenga i te 2 Tohu Latitude me te Longitude
Anei te tātai PHP mō te tātai i te tawhiti i waenga i ngā pūwāhi e rua (me te Maero ki te Kiromita te hurihanga) kua whakaawhiwhia ki te rua ira.
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));
}
Ko nga taurangi ko:
- $Latitude1 – he taurangi mo te ahopae o to waahi tuatahi.
- $Longitude1 – he taurangi mo te roa o to waahi tuatahi
- $Latitude2 – he taurangi mo te ahopae tuarua o to waahi.
- $Longitude2 – he taurangi mo te roa o to waahi tuarua.
- $wae – te tangata taunoa kilomita. Ka taea te whakahou, te tuku ranei hei kiromita.
Java: Tātaihia te Tawhiti i waenga i nga Pira e 2 o te ahopae me te ahopou
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;
}
}
Ko nga taurangi ko:
- ahopae1 – he taurangi mo te ahopae o to waahi tuatahi.
- ahopou1 – he taurangi mo te roa o to waahi tuatahi
- ahopae2 – he taurangi mo te ahopae tuarua o to waahi.
- ahopou2 – he taurangi mo te roa o to waahi tuarua.
- kōwae – te tangata taunoa kilomita. Ka taea te whakahou, te tuku ranei hei kiromita.
JavaScript: Tatauhia te Tawhiti i waenganui i nga Pira 2 o te ahopae me te ahopou
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);
}
}
Ko nga taurangi ko:
- ahopae1 – he taurangi mo te ahopae o to waahi tuatahi.
- ahopou1 – he taurangi mo te roa o to waahi tuatahi
- ahopae2 – he taurangi mo te ahopae tuarua o to waahi.
- ahopou2 – he taurangi mo te roa o to waahi tuarua.
- kōwae – te tangata taunoa kilomita. Ka taea te whakahou, te tuku ranei hei kiromita.
Python: Tatauhia te Tawhiti i waenganui i nga Pira 2 o te ahopae me te ahopou
Anei te tātai Python mō te tātai i te tawhiti i waenga i ngā pūwāhi e rua (me te Maero ki te Kiromita te hurihanga) kua whakaawhiwhia ki te rua ira. He mihi ki taku tama, a Bill Karr, he Kairangataiao Raraunga mo OpenINSIGHTS, mo te waehere.
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)
Ko nga taurangi ko:
- ahopae1 – he taurangi mo to waahi tuatahi Tuhinga.
- ahopou1 – he taurangi mo to waahi tuatahi whakarihariha
- ahopae2 – he taurangi mo to waahi tuarua Tuhinga.
- ahopou2 – he taurangi mo to waahi tuarua whakarihariha.
- kōwae – te tangata taunoa kilomita. Ka taea te whakahou, te tuku ranei hei kiromita.
MySQL: Te Tiki Rekooti Katoa I Roto I Te Awhe Ma te Tatau i te Tawhiti i Maero Ma te Whakamahi i te Latitu me te Longitude
Ko te whakamahi i nga Momo Raraunga Mokowā i MySQL he huarahi pai ake, he watea hoki ki te mahi me nga raraunga matawhenua, tae atu ki te tatau i nga tawhiti i waenga i nga tohu. Kei te tautoko a MySQL i nga Momo Raraunga Mokowhiti penei POINT
, LINESTRING
, a POLYGON
, me nga mahi mokowā rite ST_Distance
.
Ka whakamahi koe i te ST_Distance
mahi i MySQL me nga raraunga matawhenua e tohuhia ana hei POINT
taunga, ka whai whakaaro ki te kopikopiko o te mata o Papa. Ko te tauira porohita e whakamahia ana e ST_Distance
ka whakamahi i te tauira Haversine. He pai tenei tata mo te nuinga o nga kaupapa mahi engari ka whakaurua etahi hapa iti mo nga tawhiti roa.
Anei me pehea e tatau ai koe i nga tawhiti i waenga i nga tohu e rua ma te whakamahi i nga Momo Raraunga Mokowā:
- Waihangahia he Ripanga me te Momo Raraunga Mokowā: Tuatahi, hanga he ripanga me te
POINT
tīwae hei rokiroki i ngā tohu matawhenua. Hei tauira:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Whakauruhia o tohu matawhenua ki tenei ripanga ma te whakamahi i te POINT
kaihanga:
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
- Tātai Tawhiti Ma te ST_Tawhiti: Ka taea e koe te tatau i te tawhiti i waenga i nga tohu e rua ma te whakamahi i te
ST_Distance
mahi. Anei he tauira patai hei tatau i te tawhiti i waenga i nga tohu e rua:
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;
Whakakapi 1
a 2
me nga ID o nga tohu e rua e hiahia ana koe ki te tatau i te tawhiti i waenga.
- hua: Ka whakahokia e te patai te tawhiti i waenga i nga waahi e rua i te maero.
Te whakamahi Momo Raraunga Mokowā me te ST_Distance
Ka whakaratohia e te mahi he huarahi pai ake me te tika ki te mahi me nga raraunga matawhenua i MySQL. Ka whakangwarihia hoki te tatau i nga tawhiti i waenga i nga tohu, ka ngawari ake te whakahaere me te uiui i o raraunga.
MySQL: Tiki Rekooti Katoa I Roto I Te Awhe Ma te Tatau i te Tawhiti i Kiromita Ma te Whakamahi i te Paepae me te Longitude
Na taunoa ST_Distance
ka whakahoki i te tawhiti i roto i nga mita, no reira me whakahou noa te patai mo nga kiromita:
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;
Tawhiti Matawhenua Microsoft SQL Server: STDistance
Mena kei te whakamahi koe i te Microsoft SQL Server, ka tukuna e raatau a raatau ake mahi, STTawhiti mo te tatau i te tawhiti i waenga i nga tohu e rua ma te whakamahi i te momo raraunga 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);
He pito potae ki a Manash Sahoo, te kaiwhakarewa me te kaihoahoa matua i Iona Tuatoru.