Haversine فارمولہ (PHP, JavaScript, Java, Python, MySQL, MSSQL مثالیں) کا استعمال کرتے ہوئے عرض بلد اور طول البلد کے درمیان عظیم دائرے کے فاصلے کا حساب لگائیں یا پوچھیں
اس مہینے، میں GIS کے لیے PHP اور MySQL میں پروگرامنگ کر رہا ہوں۔ موضوع پر تحقیق کرتے ہوئے، مجھے تلاش کرنے میں دشواری ہوئی۔ جغرافیائی حسابات دو مقامات کے درمیان فاصلہ معلوم کرنے کے لیے، اس لیے میں انہیں یہاں شیئر کرنا چاہتا تھا۔
مثلث (A² + B² = C²) کا تخمینہ لگانے کے لئے پائیتاگورین فارمولے کا استعمال کرتے ہوئے دو نکات کے درمیان فاصلے کا حساب لگانے کا آسان طریقہ ہے۔ یہ کے طور پر جانا جاتا ہے یکلیڈیائی دوری.
یہ ایک دلچسپ آغاز ہے، لیکن یہ جغرافیہ پر لاگو نہیں ہوتا ہے کیونکہ عرض البلد اور عرض البلد کی لائنوں کے درمیان فاصلہ ہے مساوی فاصلے کے علاوہ نہیں۔. جیسے جیسے آپ خط استوا کے قریب آتے ہیں، عرض البلد کی لکیریں مزید الگ ہوتی جاتی ہیں۔ اگر آپ ایک سادہ مثلث مساوات کا استعمال کرتے ہیں، تو یہ زمین کے گھماؤ کی وجہ سے ایک جگہ پر فاصلے کی درستگی اور دوسری جگہ غلط ہو سکتی ہے۔
زبردست سرکل کا فاصلہ
زمین کے گرد طویل فاصلہ طے کرنے والے راستوں کو عظیم دائرہ فاصلہ کہا جاتا ہے۔ یعنی… ایک کرہ پر دو پوائنٹس کے درمیان کم ترین فاصلہ فلیٹ نقشے کے پوائنٹس سے مختلف ہے۔ اسے اس حقیقت کے ساتھ جوڑیں کہ عرض البلد اور طول البلد کی لکیریں مساوی نہیں ہیں… اور آپ کو ایک مشکل حساب ملا ہے۔
یہاں ایک عمدہ ویڈیو وضاحت ہے کہ عظیم حلقے کیسے کام کرتے ہیں۔
ہیورسین فارمولا
زمین کے گھماؤ کا استعمال کرتے ہوئے فاصلہ Haversine فارمولے میں شامل کیا گیا ہے، جو کہ زمین کے گھماؤ کی اجازت دینے کے لیے مثلثیات کا استعمال کرتا ہے۔ جب آپ زمین پر 2 مقامات کے درمیان فاصلہ تلاش کر رہے ہیں (جیسے کوا اڑتا ہے)، ایک سیدھی لکیر دراصل ایک قوس ہے۔
یہ ہوائی پرواز میں لاگو ہوتا ہے - کیا آپ نے کبھی پروازوں کے اصل نقشے کو دیکھا ہے اور دیکھا ہے کہ وہ محراب والے ہیں؟ اس کی وجہ یہ ہے کہ دو پوائنٹس کے درمیان محراب میں اڑنا براہ راست مقام سے کم ہے۔
پی ایچ پی: طول بلد اور عرض البلد کے 2 پوائنٹس کے درمیان فاصلے کا حساب لگائیں
یہاں دو پوائنٹس کے درمیان فاصلہ شمار کرنے کا پی ایچ پی فارمولا ہے (مائل بمقابلہ کلومیٹر کی تبدیلی کے ساتھ) دو اعشاریہ جگہوں پر گول کیا گیا ہے۔
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));
}
متغیرات یہ ہیں:
- $Latitude1 - آپ کے پہلے مقام کے عرض بلد کے لیے ایک متغیر۔
- $Longitude1 - آپ کے پہلے مقام کے طول البلد کے لیے ایک متغیر
- $Latitude2 - آپ کے دوسرے مقام کے عرض بلد کے لیے ایک متغیر۔
- $Longitude2 - آپ کے دوسرے مقام کے طول البلد کے لیے ایک متغیر۔
- $یونٹ - پہلے سے طے شدہ وجود میل. اس کو اپ ڈیٹ یا پاس کیا جا سکتا ہے۔ کلومیٹر.
جاوا: عرض البلد اور عرض البلد کے 2 پوائنٹس کے درمیان فاصلے کا حساب لگائیں۔
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;
}
}
متغیرات یہ ہیں:
- عرض البلد 1۔ - آپ کے پہلے مقام کے عرض بلد کے لیے ایک متغیر۔
- طول البلد 1 - آپ کے پہلے مقام کے طول البلد کے لیے ایک متغیر
- عرض البلد 2۔ - آپ کے دوسرے مقام کے عرض بلد کے لیے ایک متغیر۔
- طول البلد 2 - آپ کے دوسرے مقام کے طول البلد کے لیے ایک متغیر۔
- یونٹ - پہلے سے طے شدہ وجود میل. اس کو اپ ڈیٹ یا پاس کیا جا سکتا ہے۔ کلومیٹر.
جاوا اسکرپٹ: عرض البلد اور طول البلد کے 2 پوائنٹس کے درمیان فاصلے کا حساب لگائیں
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);
}
}
متغیرات یہ ہیں:
- عرض البلد 1۔ - آپ کے پہلے مقام کے عرض بلد کے لیے ایک متغیر۔
- طول البلد 1 - آپ کے پہلے مقام کے طول البلد کے لیے ایک متغیر
- عرض البلد 2۔ - آپ کے دوسرے مقام کے عرض بلد کے لیے ایک متغیر۔
- طول البلد 2 - آپ کے دوسرے مقام کے طول البلد کے لیے ایک متغیر۔
- یونٹ - پہلے سے طے شدہ وجود میل. اس کو اپ ڈیٹ یا پاس کیا جا سکتا ہے۔ کلومیٹر.
ازگر: عرض البلد اور طول البلد کے 2 پوائنٹس کے درمیان فاصلے کا حساب لگائیں۔
دو پوائنٹس کے درمیان فاصلہ (مائل بمقابلہ کلومیٹر کی تبدیلی کے ساتھ) کو دو اعشاریہ جگہوں پر گول کرنے کے لیے Python فارمولہ یہ ہے۔ میرے بیٹے بل کر کو کریڈٹ، جو کہ ڈیٹا سائنسدان ہے۔ OpenINSIGHTS، کوڈ کے لیے۔
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)
متغیرات یہ ہیں:
- عرض البلد 1۔ - آپ کے پہلے مقام کے لیے ایک متغیر طول بلد.
- طول البلد 1 - آپ کے پہلے مقام کے لیے ایک متغیر طول البلد
- عرض البلد 2۔ - آپ کے دوسرے مقام کے لیے ایک متغیر طول بلد.
- طول البلد 2 - آپ کے دوسرے مقام کے لیے ایک متغیر طول البلد.
- یونٹ - پہلے سے طے شدہ وجود میل. اس کو اپ ڈیٹ یا پاس کیا جا سکتا ہے۔ کلومیٹر.
MySQL: عرض البلد اور طول البلد کا استعمال کرتے ہوئے میلوں میں فاصلے کا حساب لگا کر ایک رینج کے اندر تمام ریکارڈز کو بازیافت کرنا
MySQL میں Spatial Data Types کا استعمال جغرافیائی ڈیٹا کے ساتھ کام کرنے کا ایک زیادہ موثر اور آسان طریقہ ہے، بشمول پوائنٹس کے درمیان فاصلے کا حساب لگانا۔ MySQL مقامی ڈیٹا کی اقسام کو سپورٹ کرتا ہے جیسے POINT
, LINESTRING
، اور POLYGON
، جیسے مقامی افعال کے ساتھ ST_Distance
.
جب آپ استعمال کرتے ہیں ST_Distance
MySQL میں فنکشن جس کی نمائندگی جغرافیائی ڈیٹا کے طور پر کی گئی ہے۔ POINT
کوآرڈینیٹ، یہ زمین کی سطح کے گھماؤ کو مدنظر رکھتا ہے۔ کروی ماڈل جس کے ذریعے استعمال کیا جاتا ہے۔ ST_Distance
Haversine فارمولہ استعمال کرتا ہے۔ یہ تخمینہ زیادہ تر عملی مقاصد کے لیے موزوں ہے لیکن بہت لمبی دوری کے لیے معمولی غلطیاں پیش کر سکتا ہے۔
یہاں یہ ہے کہ آپ مقامی ڈیٹا کی اقسام کا استعمال کرتے ہوئے دو پوائنٹس کے درمیان فاصلے کا حساب کیسے لگا سکتے ہیں:
- مقامی ڈیٹا کی قسم کے ساتھ ایک ٹیبل بنائیں: سب سے پہلے، ایک کے ساتھ ایک میز بنائیں
POINT
جغرافیائی پوائنٹس کو ذخیرہ کرنے کے لیے کالم۔ مثال کے طور پر:
CREATE TABLE locations (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
coordinates POINT
);
کا استعمال کرتے ہوئے اس ٹیبل میں اپنے جغرافیائی پوائنٹس داخل کریں۔ POINT
تعمیر کنندہ:
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
- ST_Distance کا استعمال کرتے ہوئے فاصلے کا حساب لگائیں۔: آپ استعمال کر کے دو پوائنٹس کے درمیان فاصلے کا حساب لگا سکتے ہیں۔
ST_Distance
فنکشن دو پوائنٹس کے درمیان فاصلے کا حساب لگانے کے لیے یہاں ایک مثال استفسار ہے:
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;
بدل 1
اور 2
ان دو پوائنٹس کی IDs کے ساتھ جن کے درمیان آپ فاصلے کا حساب لگانا چاہتے ہیں۔
- نتیجہ: استفسار میل میں دو پوائنٹس کے درمیان فاصلہ لوٹائے گا۔
مقامی ڈیٹا کی اقسام کا استعمال اور ST_Distance
فنکشن MySQL میں جغرافیائی ڈیٹا کے ساتھ کام کرنے کا ایک زیادہ موثر اور درست طریقہ فراہم کرتا ہے۔ یہ پوائنٹس کے درمیان فاصلوں کا حساب لگانا بھی آسان بناتا ہے، جس سے آپ کے ڈیٹا کا نظم و نسق اور استفسار کرنا آسان ہوجاتا ہے۔
MySQL: عرض البلد اور طول البلد کا استعمال کرتے ہوئے کلومیٹر میں فاصلے کا حساب لگا کر ایک رینج کے اندر تمام ریکارڈز کو بازیافت کرنا
پہلے سے طے شدہ ST_Distance
فاصلے کو میٹر میں لوٹاتا ہے، اس لیے آپ کو صرف کلومیٹر کے لیے استفسار کو اپ ڈیٹ کرنے کی ضرورت ہے:
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 سرور جغرافیائی فاصلہ: STDistance
اگر آپ مائیکروسافٹ ایس کیو ایل سرور استعمال کر رہے ہیں، تو وہ اپنا فنکشن پیش کرتے ہیں، STD فاصلہ جغرافیہ ڈیٹا کی قسم کا استعمال کرتے ہوئے دو پوائنٹس کے درمیان فاصلے کا حساب لگانے کے لیے۔
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);
کے بانی اور سینئر معمار منش ساہو کو ہیٹ ٹپ آئن تھری.