हैवरसाइन फॉर्मूला (PHP, JavaScript, Java, Python, MySQL, MSSQL उदाहरण) का उपयोग करके अक्षांश और देशांतर के बिंदुओं के बीच ग्रेट सर्किल दूरी की गणना या क्वेरी करें।
इस महीने, मैं जीआईएस के लिए PHP और MySQL में प्रोग्रामिंग कर रहा हूं। विषय पर शोध करते समय, मुझे खोजने में कठिनाई हुई भौगोलिक गणना दो स्थानों के बीच की दूरी जानने के लिए, इसलिए मैं उन्हें यहां साझा करना चाहता था।
दो बिंदुओं के बीच की दूरी की गणना करने का सरल तरीका पाइथागोरसियन सूत्र का उपयोग करके त्रिकोण (ए of + बी² = सी²) के कर्ण की गणना करना है। इस के रूप में जाना जाता है यूक्लिडियन दूरी.
यह एक दिलचस्प शुरुआत है, लेकिन यह भूगोल पर लागू नहीं होता क्योंकि अक्षांश और देशांतर रेखाओं के बीच की दूरी होती है एक दूसरे से समान दूरी नहीं. जैसे-जैसे आप भूमध्य रेखा के करीब आते हैं, अक्षांश रेखाएँ और दूर होती जाती हैं। यदि आप एक साधारण त्रिभुज समीकरण का उपयोग करते हैं, तो यह पृथ्वी की वक्रता के कारण एक स्थान पर दूरी को सटीक और दूसरे में गलत माप सकता है।
महान सर्कल दूरी
पृथ्वी के चारों ओर लंबी दूरी तय करने वाले मार्गों को ग्रेट सर्कल डिस्टेंस के रूप में जाना जाता है। अर्थात... एक गोले पर दो बिंदुओं के बीच की सबसे छोटी दूरी समतल मानचित्र के बिंदुओं से भिन्न होती है। इसे इस तथ्य के साथ जोड़ लें कि अक्षांश और देशांतर रेखाएँ समान दूरी पर नहीं हैं... और आपके पास एक कठिन गणना है।
यहाँ एक शानदार वीडियो विवरण है कि ग्रेट सर्किल कैसे काम करते हैं।
द हॅवरसाइन फॉर्मूला
पृथ्वी की वक्रता का उपयोग करते हुए दूरी को हैवरसाइन सूत्र में शामिल किया गया है, जो पृथ्वी की वक्रता की अनुमति देने के लिए त्रिकोणमिति का उपयोग करता है। जब आप पृथ्वी पर दो स्थानों के बीच की दूरी ज्ञात कर रहे हैं (जैसे कौवा उड़ता है), तो एक सीधी रेखा वास्तव में एक चाप होती है।
यह हवाई उड़ान में लागू होता है - क्या आपने कभी उड़ानों के वास्तविक मानचित्र को देखा है और ध्यान दिया है कि वे धनुषाकार हैं? ऐसा इसलिए है क्योंकि दो बिंदुओं के बीच एक आर्च में उड़ना सीधे स्थान से छोटा होता है।
PHP: अक्षांश और देशांतर के 2 बिंदुओं के बीच की दूरी की गणना करें
दो दशमलव स्थानों तक पूर्णांकित दो बिंदुओं (माइल बनाम किलोमीटर रूपांतरण के साथ) के बीच की दूरी की गणना के लिए यहां 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));
}
चर हैं:
- $अक्षांश1 - आपके पहले स्थान के अक्षांश के लिए एक चर।
- $देशांतर1 - आपके पहले स्थान के देशांतर के लिए एक चर
- $अक्षांश2 - आपके दूसरे स्थान के अक्षांश के लिए एक चर।
- $देशांतर2 - आपके दूसरे स्थान के देशांतर के लिए एक चर।
- $यूनिट - डिफ़ॉल्ट जा रहा है मील. इसे अपडेट या पास किया जा सकता है किलोमीटर की दूरी पर.
जावा: अक्षांश और देशांतर के 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 - आपके पहले स्थान के देशांतर के लिए एक चर
- अक्षांश २३ - आपके दूसरे स्थान के अक्षांश के लिए एक चर।
- देशांतर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 - आपके पहले स्थान के देशांतर के लिए एक चर
- अक्षांश २३ - आपके दूसरे स्थान के अक्षांश के लिए एक चर।
- देशांतर2 - आपके दूसरे स्थान के देशांतर के लिए एक चर।
- इकाई - डिफ़ॉल्ट जा रहा है मील. इसे अपडेट या पास किया जा सकता है किलोमीटर की दूरी पर.
पायथन: अक्षांश और देशांतर के 2 बिंदुओं के बीच की दूरी की गणना करें
यहां दो बिंदुओं के बीच की दूरी (माइल बनाम किलोमीटर रूपांतरण के साथ) को दो दशमलव स्थानों तक गणना करने के लिए पायथन फॉर्मूला दिया गया है। इसका श्रेय मेरे बेटे बिल कैर को जाता है, जो एक डेटा वैज्ञानिक है खुली अंतर्दृष्टि, कोड के लिए।
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
हैवरसाइन सूत्र का उपयोग करता है। यह सन्निकटन अधिकांश व्यावहारिक उद्देश्यों के लिए उपयुक्त है, लेकिन बहुत लंबी दूरी के लिए इसमें थोड़ी अशुद्धियाँ हो सकती हैं।
यहां बताया गया है कि आप स्थानिक डेटा प्रकारों का उपयोग करके दो बिंदुओं के बीच की दूरी की गणना कैसे कर सकते हैं:
- स्थानिक डेटा प्रकार के साथ एक तालिका बनाएं: सबसे पहले, 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
उन दो बिंदुओं की आईडी के साथ जिनके बीच की दूरी की गणना आप करना चाहते हैं।
- परिणाम: क्वेरी दो बिंदुओं के बीच की दूरी मील में बताएगी।
स्थानिक डेटा प्रकार और का उपयोग करना 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
यदि आप Microsoft SQL सर्वर का उपयोग कर रहे हैं, तो वे अपना स्वयं का कार्य प्रदान करते हैं, एसटीडीडिस्टेंस भूगोल डेटा प्रकार का उपयोग करके दो बिंदुओं के बीच की दूरी की गणना के लिए।
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);
के संस्थापक और वरिष्ठ वास्तुकार मानश साहू को शुभकामनाएँ आयन तीन.