Haversine सूत्र (PHP, JavaScript, Java, Python, MySQL, MSSQL उदाहरणहरू) प्रयोग गरेर अक्षांश र देशान्तरका बिन्दुहरू बीचको ठूलो सर्कल दूरी गणना गर्नुहोस् वा क्वेरी गर्नुहोस्।
यो महिना, म GIS को लागि PHP र MySQL मा प्रोग्रामिङ गरिरहेको छु। विषयको अनुसन्धान गर्दा, मलाई फेला पार्न गाह्रो भयो भौगोलिक गणना दुई स्थानहरू बीचको दूरी पत्ता लगाउन, त्यसैले म तिनीहरूलाई यहाँ साझा गर्न चाहन्छु।
दुई पोइन्ट बीचको दूरी हिसाब गर्ने सरल तरिका भनेको पायथागोरियन सूत्र प्रयोग गर्दै त्रिकोण (A² + B² = C²) का काल्पनिक गणना गर्न। यो यस रूपमा चिनिन्छ युक्लिडियन दूरी.
यो एक रोचक सुरुवात हो, तर अक्षांश र देशान्तर रेखाहरू बीचको दूरी भएकाले यो भूगोलमा लागू हुँदैन। बराबर दूरी अलग छैन। जब तपाईं भूमध्य रेखाको नजिक पुग्नुहुन्छ, अक्षांश रेखाहरू थप अलग हुन्छन्। यदि तपाइँ एक साधारण त्रिकोणीय समीकरण प्रयोग गर्नुहुन्छ भने, यसले पृथ्वीको वक्रताको कारणले एक स्थानमा सही दूरी र अर्कोमा गलत मापन गर्न सक्छ।
महान सर्कल दूरी
पृथ्वीको वरिपरि लामो दूरीको यात्रा गर्ने मार्गहरूलाई ग्रेट सर्कल डिस्टेन्स भनिन्छ। त्यो हो... एउटा गोलामा दुई बिन्दुहरू बीचको सबैभन्दा छोटो दूरी समतल नक्साको बिन्दुहरू भन्दा फरक हुन्छ। अक्षांश र देशान्तर रेखाहरू समतुल्य छैनन् भन्ने तथ्यसँग मिलाउनुहोस्... र तपाईंले कठिन गणना पाउनुभएको छ।
यहाँ कसरी उत्तम सर्कलहरू काम गर्दछन् बारे एक शानदार भिडियो विवरण।
Haversine फॉर्मूला
पृथ्वीको वक्रता प्रयोग गरी दूरीलाई Haversine सूत्रमा समावेश गरिएको छ, जसले पृथ्वीको वक्रतालाई अनुमति दिन त्रिकोणमिति प्रयोग गर्दछ। जब तपाईं पृथ्वीमा 2 स्थानहरू बीचको दूरी फेला पार्दै हुनुहुन्छ (जस्तै काग उड्छ), एक सीधा रेखा वास्तवमा चाप हो।
यो हवाई उडानमा लागू हुन्छ - के तपाईंले कहिल्यै उडानहरूको वास्तविक नक्सा हेर्नुभएको छ र तिनीहरू आर्केड छन्? त्यो किनभने दुई बिन्दुहरू बीचको आर्कमा उडान स्थानमा सीधा भन्दा छोटो छ।
PHP: अक्षांश र देशान्तरको दुई पोइन्टहरू बीच दूरी गणना गर्नुहोस्
यहाँ दुई बिन्दुहरू बीचको दूरी (माइल बनाम किलोमिटर रूपान्तरणको साथ) गणना गर्नको लागि दुई दशमलव स्थानहरूमा राउन्ड गरिएको PHP सूत्र छ।
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 - तपाईंको दोस्रो स्थानको देशान्तरको लागि एक चर।
- $ युनिट - पूर्वनिर्धारित अस्तित्व हजारौँ। यो रूपमा अद्यावधिक वा पारित गर्न सकिन्छ किलोमिटर.
Java: अक्षांश र देशान्तरका २ बिन्दुहरू बीचको दूरी गणना गर्नुहोस्
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 - तपाईंको पहिलो स्थानको अक्षांशको लागि एक चर।
- देशान्तर १ - तपाईंको पहिलो स्थानको देशान्तरको लागि एक चर
- अक्षांश 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 - तपाईंको पहिलो स्थानको अक्षांशको लागि एक चर।
- देशान्तर १ - तपाईंको पहिलो स्थानको देशान्तरको लागि एक चर
- अक्षांश 2 - तपाईंको दोस्रो स्थानको अक्षांशको लागि एक चर।
- देशान्तर १ - तपाईंको दोस्रो स्थानको देशान्तरको लागि एक चर।
- एकाइ - पूर्वनिर्धारित अस्तित्व हजारौँ। यो रूपमा अद्यावधिक वा पारित गर्न सकिन्छ किलोमिटर.
पाइथन: अक्षांश र देशान्तरका २ बिन्दुहरू बीचको दूरी गणना गर्नुहोस्
यहाँ दुई बिन्दुहरू बीचको दूरी (माइल बनाम किलोमिटर रूपान्तरणको साथ) गणना गर्नको लागि पाइथन सूत्र दुई दशमलव स्थानहरूमा राउन्ड गरिएको छ। मेरो छोरा, बिल Karr, को लागि एक डाटा वैज्ञानिक क्रेडिट OpenINSightTS, कोडको लागि।
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 - तपाइँको पहिलो स्थान को लागी एक चर अक्षांश.
- देशान्तर १ - तपाइँको पहिलो स्थान को लागी एक चर देशान्तरण
- अक्षांश 2 - तपाइँको दोस्रो स्थान को लागी एक चर अक्षांश.
- देशान्तर १ - तपाइँको दोस्रो स्थान को लागी एक चर देशान्तरण.
- एकाइ - पूर्वनिर्धारित अस्तित्व हजारौँ। यो रूपमा अद्यावधिक वा पारित गर्न सकिन्छ किलोमिटर.
MySQL: अक्षांश र देशान्तर प्रयोग गरेर माइलहरूमा दूरी गणना गरेर दायरा भित्र सबै रेकर्डहरू पुन: प्राप्त गर्दै
MySQL मा स्थानिय डेटा प्रकारहरू प्रयोग गर्नु भनेको बिन्दुहरू बीचको दूरी गणना गर्ने सहित भौगोलिक डेटासँग काम गर्ने अझ प्रभावकारी र सुविधाजनक तरिका हो। MySQL ले स्थानिय डेटा प्रकारहरू जस्तै समर्थन गर्दछ POINT
, LINESTRING
, र POLYGON
, जस्तै स्थानिक कार्यहरु संग ST_Distance
.
जब तपाइँ यो प्रयोग गर्नुहुन्छ ST_Distance
MySQL मा भौगोलिक डेटाको रूपमा प्रस्तुत गरिएको प्रकार्य POINT
समन्वय गर्दछ, यसले पृथ्वीको सतहको वक्रतालाई ध्यानमा राख्छ। द्वारा प्रयोग गरिएको गोलाकार मोडेल ST_Distance
Haversine सूत्र प्रयोग गर्दछ। यो अनुमान धेरै व्यावहारिक उद्देश्यका लागि उपयुक्त छ तर धेरै लामो दूरीको लागि थोरै अशुद्धताहरू प्रस्तुत गर्न सक्छ।
यहाँ छ कि तपाईले कसरी स्थानिय डेटा प्रकारहरू प्रयोग गरेर दुई बिन्दुहरू बीचको दूरी गणना गर्न सक्नुहुन्छ:
- स्थानिय डेटा प्रकारको साथ तालिका बनाउनुहोस्: पहिले, a को साथ तालिका बनाउनुहोस्
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
दुई बिन्दुहरूको ID हरू बीचको दूरी गणना गर्न चाहनुहुन्छ।
- परिणाम: क्वेरीले माइलमा दुई बिन्दुहरू बीचको दूरी फर्काउनेछ।
स्थानिय डेटा प्रकार र प्रयोग गर्दै 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;
माइक्रोसफ्ट SQL सर्भर भौगोलिक दूरी: STD दूरी
यदि तपाइँ Microsoft SQL सर्भर प्रयोग गर्दै हुनुहुन्छ भने, तिनीहरूले आफ्नै प्रकार्य प्रस्ताव गर्छन्, 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);
मनश साहू, संस्थापक र वरिष्ठ वास्तुकारलाई टोपी टिप आयन तीन.