Etung utawa Pitakonan Jarak Lingkaran Gedhe Antarane Titik Lintang lan Bujur Nggunakake Formula Haversine (Conto PHP, JavaScript, Java, Python, MySQL, MSSQL)
Sasi iki, aku wis nggawe program ing PHP lan MySQL kanggo GIS. Nalika nliti topik kasebut, aku angel nemokake petungan geografis kanggo nemokake jarak antarane rong lokasi, mula aku pengin nuduhake ing kene.
Cara sederhana kanggo ngetung jarak antarane rong poin yaiku nggunakake formula Pythagoras kanggo ngetung hypotenuse segitiga (A² + B² = C²). Iki dikenal minangka Jarak Euclidean.
Iki minangka wiwitan sing menarik, nanging ora ditrapake kanggo geografi amarga jarak antarane garis lintang lan garis bujur jarak ora padha. Nalika nyedhaki garis khatulistiwa, garis lintang dadi luwih adoh. Yen sampeyan nggunakake persamaan triangulasi sing prasaja, bisa uga ngukur jarak kanthi akurat ing sak panggonan lan salah ing panggonan liyane amarga lengkungan Bumi.
Jarak Lingkaran Gedhe
Rute sing ditempuh ing jarak sing adoh ngubengi Bumi dikenal minangka Jarak Lingkaran Besar. Yaiku… jarak paling cedhak antarane rong titik ing bal beda karo titik ing peta datar. Gabung karo kasunyatan manawa garis lintang lan garis bujur ora padha karo… lan sampeyan duwe pitungan sing angel.
Mangkene panjelasan video sing hebat babagan cara kerjane Great Circles.
Formula Haversine
Jarak nggunakake kelengkungan Bumi digabungake ing rumus Haversine, sing nggunakake trigonometri kanggo ngidini kelengkungan Bumi. Nalika sampeyan nemokake jarak antarane 2 panggonan ing Bumi (minangka manuk gagak mabur), garis lurus iku sejatine busur.
Iki ditrapake ing penerbangan udhara - apa sampeyan wis tau ndeleng peta penerbangan sing nyata lan ngeweruhi yen dheweke arched? Iki amarga mabur ing lengkungan antarane rong titik luwih cendhek tinimbang langsung menyang lokasi kasebut.
PHP: Ngetung Jarak Antarane 2 Poin Lintang lan Bujur
Punika rumus PHP kanggo ngitung jarak antarane rong titik (bebarengan karo konversi Mile vs Kilometer) dibunderaké dadi rong panggonan desimal.
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));
}
Variabel kasebut yaiku:
- $Latitude1 – variabel kanggo garis lintang lokasi pisanan sampeyan.
- $Bujur1 – variabel kanggo bujur lokasi pisanan sampeyan
- $Latitude2 – variabel kanggo garis lintang lokasi kapindho sampeyan.
- $Bujur2 – variabel kanggo longitude lokasi kapindho.
- $unit – kang standar ewu. Iki bisa dianyari utawa liwati minangka kilometer.
Jawa: Ngitung Jarak Antarane 2 Titik Lintang lan Bujur
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;
}
}
Variabel kasebut yaiku:
- garis lintang1 – variabel kanggo garis lintang lokasi pisanan sampeyan.
- bujur 1 – variabel kanggo bujur lokasi pisanan sampeyan
- garis lintang2 – variabel kanggo garis lintang lokasi kapindho sampeyan.
- bujur 2 – variabel kanggo longitude lokasi kapindho.
- unit – kang standar ewu. Iki bisa dianyari utawa liwati minangka kilometer.
JavaScript: Ngitung Jarak Antarane 2 Titik Lintang lan Bujur
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);
}
}
Variabel kasebut yaiku:
- garis lintang1 – variabel kanggo garis lintang lokasi pisanan sampeyan.
- bujur 1 – variabel kanggo bujur lokasi pisanan sampeyan
- garis lintang2 – variabel kanggo garis lintang lokasi kapindho sampeyan.
- bujur 2 – variabel kanggo longitude lokasi kapindho.
- unit – kang standar ewu. Iki bisa dianyari utawa liwati minangka kilometer.
Python: Ngitung Jarak Antarane 2 Titik Lintang lan Bujur
Punika rumus Python kanggo ngitung jarak antarane rong titik (bebarengan karo konversi Mile vs Kilometer) dibunderaké kanggo rong panggonan desimal. Kredit kanggo anakku, Bill Karr, Ilmuwan Data kanggo OpenINSIGHTS, kanggo kode.
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)
Variabel kasebut yaiku:
- garis lintang1 – variabel kanggo lokasi pisanan sampeyan garis lintang.
- bujur 1 – variabel kanggo lokasi pisanan sampeyan bujur
- garis lintang2 – variabel kanggo lokasi kapindho kang garis lintang.
- bujur 2 – variabel kanggo lokasi kapindho kang bujur.
- unit – kang standar ewu. Iki bisa dianyari utawa liwati minangka kilometer.
MySQL: Njupuk Kabeh Cathetan Ing Kisaran Kanthi Ngitung Jarak Ing Miles Nggunakake Latitude lan Longitude
Nggunakake Tipe Data Spasial ing MySQL minangka cara sing luwih efisien lan trep kanggo nggarap data geografis, kalebu ngitung jarak antarane titik. MySQL ndhukung Tipe Data Spasial kayata POINT
, LINESTRING
, Lan POLYGON
, bebarengan karo fungsi spasial kaya ST_Distance
.
Yen sampeyan nggunakake ST_Distance
fungsi ing MySQL karo data geografis dituduhake minangka POINT
koordinat, iku njupuk menyang akun lengkungan lumahing bumi. Model bunder sing digunakake dening ST_Distance
nggunakake rumus Haversine. Perkiraan iki cocok kanggo tujuan sing paling praktis nanging bisa uga ora akurat kanggo jarak sing adoh banget.
Mangkene carane sampeyan bisa ngetung jarak antarane rong titik nggunakake Tipe Data Spasial:
- Nggawe Tabel kanthi Tipe Data Spasial: Pisanan, gawe tabel kanthi a
POINT
kolom kanggo nyimpen titik geografis. Tuladhane:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
Lebokake titik geografis menyang tabel iki kanthi nggunakake POINT
konstruktor:
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
- Ngitung Jarak Nggunakake ST_Distance: Sampeyan bisa ngetung jarak antarane rong titik nggunakake
ST_Distance
fungsi. Mangkene conto pitakon kanggo ngetung jarak antarane rong titik:
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;
Ganti 1
lan 2
karo ID saka loro TCTerms sampeyan pengin ngetung jarak antarane.
- Result: Pitakonan bakal ngasilake jarak antarane rong titik ing mil.
Nggunakake Tipe Data Spasial lan ST_Distance
fungsi nyedhiyakake cara sing luwih efisien lan akurat kanggo nggarap data geografis ing MySQL. Iki uga nyederhanakake ngitung jarak antarane titik, supaya luwih gampang ngatur lan takon data sampeyan.
MySQL: Njupuk Kabeh Cathetan Ing Kisaran Kanthi Ngitung Jarak Ing Kilometer Nggunakake Latitude lan Bujur
Kanthi gawan ST_Distance
ngasilake jarak ing meter, dadi sampeyan mung kudu nganyari pitakon kanggo kilometer:
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;
Microsoft SQL Server Jarak Geografis: STDistance
Yen sampeyan nggunakake Microsoft SQL Server, dheweke nawakake fungsi dhewe, Jarak ST kanggo ngitung jarak antarane rong titik nggunakake jinis data Geografi.
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);
Topi tip kanggo Manash Sahoo, pangadeg lan arsitek senior ing Ion Telu.