इस महीने मैं GIS के संबंध में PHP और MySQL में काफी प्रोग्रामिंग कर रहा हूं। जाल के चारों ओर सूँघना, मुझे वास्तव में कुछ कठिन समय मिल गया था भौगोलिक गणना दो स्थानों के बीच की दूरी का पता लगाने के लिए इसलिए मैं उन्हें यहाँ साझा करना चाहता था।
दो बिंदुओं के बीच की दूरी की गणना करने का सरल तरीका पाइथागोरसियन सूत्र का उपयोग करके त्रिकोण (ए of + बी² = सी²) के कर्ण की गणना करना है। इस के रूप में जाना जाता है यूक्लिडियन दूरी.
यह एक दिलचस्प शुरुआत है लेकिन यह भूगोल के साथ लागू नहीं होता है क्योंकि अक्षांश और देशांतर की रेखाओं के बीच की दूरी होती है समान दूरी नहीं अलग। जैसे-जैसे आप भूमध्य रेखा के करीब आते हैं, अक्षांश की रेखाएँ और अलग होती जाती हैं। यदि आप किसी प्रकार के सरल त्रिभुज समीकरण का उपयोग करते हैं, तो यह पृथ्वी के वक्रता के कारण, एक स्थान में दूरी को सही और दूसरे में बहुत गलत माप सकता है।
महान सर्कल दूरी
पृथ्वी के चारों ओर लंबी दूरी की यात्रा करने वाले मार्गों को कहा जाता है महान सर्कल दूरी. यानी... एक गोले पर दो बिंदुओं के बीच की सबसे छोटी दूरी समतल मानचित्र के बिंदुओं से भिन्न होती है। इसे इस तथ्य के साथ मिलाएं कि अक्षांश और देशांतर रेखाएँ समान दूरी पर नहीं हैं… और आपके पास एक कठिन गणना है।
यहाँ एक शानदार वीडियो विवरण है कि ग्रेट सर्किल कैसे काम करते हैं।
द हॅवरसाइन फॉर्मूला
पृथ्वी की वक्रता का उपयोग करने वाली दूरी को इसमें शामिल किया गया है हैवरसाइन सूत्र, जो पृथ्वी की वक्रता की अनुमति देने के लिए त्रिकोणमिति का उपयोग करता है। जब आप पृथ्वी पर 2 स्थानों के बीच की दूरी पा रहे हों (जैसे कि कौआ उड़ता है), तो एक सीधी रेखा वास्तव में एक चाप है।
यह हवाई उड़ान में लागू है - क्या आपने कभी उड़ानों के वास्तविक नक्शे को देखा है और देखा है कि वे धनुषाकार हैं? ऐसा इसलिए है क्योंकि यह सीधे स्थान की तुलना में दो बिंदुओं के बीच मेहराब में उड़ान भरने के लिए कम है।
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 बिंदुओं के बीच की दूरी की गणना करें
वैसे भी, दो दशमलव स्थानों तक गोल दो बिंदुओं (माइल बनाम किलोमीटर रूपांतरण के साथ) के बीच की दूरी की गणना के लिए यहां पायथन फॉर्मूला है। मेरे बेटे, बिल कर्र को श्रेय, जो एक डेटा वैज्ञानिक हैं खुली अंतर्दृष्टि, कोड के लिए।
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 में MyTable को क्वेरी करने जा रहा हूं, जो कि $ अक्षांश और $ देशांतर पर मेरे स्थान पर परिवर्तनीय $ दूरी (मीलों में) से कम या बराबर हो।
किसी विशिष्ट के भीतर सभी रिकॉर्ड प्राप्त करने की क्वेरी दूरी अक्षांश और देशांतर के दो बिंदुओं के बीच मीलों में दूरी की गणना करके हैं:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."
आपको इसे कस्टमाइज़ करना होगा:
- $ देशांतर - यह एक PHP चर है जहां मैं बिंदु के देशांतर से गुजर रहा हूं।
- $ अक्षांश - यह एक PHP चर है जहां मैं बिंदु के देशांतर से गुजर रहा हूं।
- $ दूरी - यह वह दूरी है जिसे आप सभी रिकॉर्ड कम या बराबर खोजना चाहेंगे।
- तालिका - यह टेबल है ... आप इसे अपने टेबल के नाम से बदलना चाहेंगे।
- अक्षांश - यह आपके अक्षांश का क्षेत्र है।
- देशान्तर - यह आपके देशांतर का क्षेत्र है।
MySQL: अक्षांश और देशांतर का उपयोग करके किलोमीटर में दूरी की गणना करके एक सीमा के भीतर सभी रिकॉर्ड प्राप्त करना
और यहाँ MySQL में किलोमीटर का उपयोग करते हुए SQL क्वेरी है:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."
आपको इसे कस्टमाइज़ करना होगा:
- $ देशांतर - यह एक PHP चर है जहां मैं बिंदु के देशांतर से गुजर रहा हूं।
- $ अक्षांश - यह एक PHP चर है जहां मैं बिंदु के देशांतर से गुजर रहा हूं।
- $ दूरी - यह वह दूरी है जिसे आप सभी रिकॉर्ड कम या बराबर खोजना चाहेंगे।
- तालिका - यह टेबल है ... आप इसे अपने टेबल के नाम से बदलना चाहेंगे।
- अक्षांश - यह आपके अक्षांश का क्षेत्र है।
- देशान्तर - यह आपके देशांतर का क्षेत्र है।
मैंने एक एंटरप्राइज़ मैपिंग प्लेटफ़ॉर्म में इस कोड का उपयोग किया, जिसका उपयोग हमने उत्तरी अमेरिका में 1,000 से अधिक स्थानों के साथ एक रिटेल स्टोर के लिए किया था और इसने खूबसूरती से काम किया।
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);
मनश साहू, वीपी और आर्किटेक्ट को हैट टिप Highbridge.
साझा करने के लिए बहुत - बहुत धन्यवाद। यह एक आसान कॉपी और पेस्ट काम था और बढ़िया काम करता है। आपने मुझे बहुत समय दिया है।
C को पोर्ट करने वाले किसी व्यक्ति के लिए FYI:
डबल डिग्रेड 2 (डबल डीएल) {रिटर्न डाउन * (3.14159265358979323846 / 180.0); }
पोस्टिंग का बहुत अच्छा टुकड़ा - बहुत अच्छा काम किया - मुझे केवल लेट-लॉन्ग पकड़े हुए टेबल का नाम बदलना पड़ा। यह बहुत तेजी से काम करता है .. मेरे पास लैट-लॉन्ग (<400) की काफी कम संख्या है, लेकिन मुझे लगता है कि यह अच्छी तरह से स्केल होगा। अच्छी साइट भी - मैंने अभी इसे अपने del.icio.us खाते में जोड़ा है और नियमित रूप से वापस जाँच करेगा।
बहुत बहुत धन्यवाद पीटर और केरी! यदि आप जीआईएस परियोजनाओं पर काम करना पसंद करते हैं, तो मैं सिफारिश करूंगा:
बहुत बहुत धन्यवाद ... 😀
मैंने पूरे दिन की दूरी की गणना के लिए खोज की और हर्वसिन एल्गोरिथ्म पाया, इसका उदाहरण यह देने के लिए कि इसे एक sql स्टेटमेंट में कैसे रखा जाए। धन्यवाद और बधाई, डैनियल
मदद करने के लिए खुशी है, रेल दोस्त!
अब मैं एक 'बहुभुज' PHP फ़ंक्शन में खोज रहा हूँ जो अनुक्रमित अक्षांश और देशांतर निर्देशांकों की एक सरणी लेगा और यह पता लगाएगा कि क्या कोई अन्य बिंदु बहुभुज के भीतर या बाहर है।
मैंने ढूंढा एक बहुभुज में एक बिंदु अगर यह पता लगाने के लिए समीकरण!
मुझे लगता है कि आपके एसक्यूएल को एक बयान की आवश्यकता है।
इसके स्थान पर <= $ दूरी की आपको आवश्यकता हो सकती है
HAVING दूरी का उपयोग करें <= $ दूरी
अन्यथा मुझे समय और ऊर्जा का एक गुच्छा बचाने के लिए धन्यवाद।
हाय David,
यदि आप किसी भी प्रकार के ग्रुप बाय स्टेटमेंट कर रहे हैं, तो आपको HAVING की आवश्यकता होगी। मैं ऊपर के उदाहरण में ऐसा नहीं कर रहा हूं।
डॉग
MySQL 5.x के रूप में, आप व्हेयर क्लॉज व्यू पर एक उपनाम का उपयोग नहीं कर सकते http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
उपरोक्त क्वेरी में WHERE के बजाय HAVING का उपयोग करें
आपका बहुत बहुत धन्यवाद। आपने बहुत अच्छा काम किया है। यही वह चीज है जो मैं वास्तव में चाहता हूं। बहुत बहुत धन्यवाद।
इस कोड को साझा करने के लिए बहुत बहुत धन्यवाद। इसने मुझे विकास के समय की बहुत बचत की। इसके अलावा, अपने पाठकों को यह इंगित करने के लिए धन्यवाद कि MySQL 5.x के लिए एक HAVING कथन आवश्यक है। बहुत मददगार।
मैं पाठकों से धन्य हूं कि मैं जितना होशियार हूं!
🙂
उपरोक्त सूत्र मुझे बहुत समय बचा रहा है। आपका बहुत बहुत धन्यवाद।
मुझे NMEA प्रारूप और डिग्री के बीच स्विच करना होगा। मुझे पृष्ठ के निचले भाग में इस URL पर एक सूत्र मिला। http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
किसी को भी यह कैसे सत्यापित करने के लिए पता है?
शुक्रिया!
सताना
नमस्ते,
एक और सवाल। क्या एनएमईए स्ट्रिंग्स के लिए एक फार्मूला नीचे की तरह है?
1342.7500, एन, 10052.2287, ई
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
धन्यवाद,
सताना
मैंने यह भी पाया कि WHERE ने मेरे लिए काम नहीं किया। इसे बदलने के लिए और सब कुछ सही काम करता है। सबसे पहले मैंने टिप्पणियों को नहीं पढ़ा और एक नेस्टेड चयन का उपयोग करके इसे फिर से लिखा। दोनों ही ठीक काम करेंगे।
Mysql में लिखी गई स्क्रिप्ट के लिए बहुत धन्यवाद, बस कुछ मामूली समायोजन करने थे (HAVING) for
ग्रेट की नौकरी
अविश्वसनीय रूप से उपयोगी, बहुत बहुत धन्यवाद! मुझे "WHERE" के बजाय नए "HAVING" से कुछ समस्याएँ हो रही थीं, लेकिन एक बार मैंने यहाँ टिप्पणियाँ पढ़ीं (हताशा = P में अपने दाँत पीसने के लगभग आधे घंटे के बाद), मुझे यह अच्छी तरह से काम करने लगा। धन्यवाद ^ _ ^
बहुत बहुत धन्यवाद महान काम करता है
ध्यान रखें कि इस तरह का एक चुनिंदा बयान बहुत कम्प्यूटेशनल रूप से तीव्र और इसलिए धीमा होगा। यदि आपके पास उन प्रश्नों का एक बहुत है, तो यह चीजों को बहुत तेज़ी से नीचे गिरा सकता है।
एक बहुत कम तीव्र दृष्टिकोण एक गणना दूरी द्वारा परिभाषित एक SQUARE क्षेत्र का उपयोग करके पहला (क्रूड) चलाने के लिए है "टैबलेन से अक्षांश 1 और 2 के बीच अक्षांश और lon1 और lon2 के बीच देशांतर" यानी "चयन करें"। lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, लोन के समान। latdiff ~ = दूरी / 111 (किमी के लिए), या दूरी / 69 मील के लिए 1 डिग्री अक्षांश के बाद से ~ 111 किमी (पृथ्वी से थोड़ा भिन्नता अंडाकार है, लेकिन इस उद्देश्य के लिए पर्याप्त है)। londiff = दूरी / (एब्स (कोस 2 (अक्षांश)) * * 111)) - या 69 मील के लिए (आप वास्तव में भिन्नता के लिए खाते में थोड़ा बड़ा वर्ग ले सकते हैं)। फिर उस का परिणाम लें और उसे रेडियल चयन में खिलाएं। बस आउट-ऑफ-बाउंड्स निर्देशांक के लिए खाते में मत भूलना - यानी स्वीकार्य देशांतर की सीमा -180 से +180 है और स्वीकार्य अक्षांश की सीमा -90 से +90 है - यदि आपकी सीमा या लोंडीफ इस सीमा के बाहर चलती है। । ध्यान दें कि ज्यादातर मामलों में यह लागू नहीं हो सकता है क्योंकि यह केवल पोल से ध्रुव तक प्रशांत महासागर के माध्यम से एक रेखा पर गणना को प्रभावित करता है, हालांकि यह चुकोटका के हिस्से और अलास्का के हिस्से को काटता है।
इसके द्वारा हम जो हासिल करते हैं, वह उन अंकों की संख्या में महत्वपूर्ण कमी है, जिनके खिलाफ आप यह गणना करते हैं। यदि आपके पास डेटाबेस में एक लाख वैश्विक बिंदु समान रूप से समान रूप से वितरित हैं और आप 100 किमी के भीतर खोज करना चाहते हैं, तो आपकी पहली (तेज़) खोज 10000 वर्ग किमी के क्षेत्र की है और संभवतः लगभग 20 परिणाम प्राप्त करेंगे (एक से अधिक वितरण के आधार पर सतह का क्षेत्रफल लगभग 500 मीटर वर्ग किमी), जिसका अर्थ है कि आप इस क्वेरी के लिए 20 बार के बजाय XNUMX बार जटिल दूरी की गणना चलाते हैं।
उदाहरण में छोटी सी गलती ... जो 50 किमी (100 नहीं) के भीतर होगी क्योंकि हम अपने वर्ग के "त्रिज्या" को देख रहे हैं।
शानदार सलाह! मैंने वास्तव में एक डेवलपर के साथ काम किया, जिसने एक फ़ंक्शन लिखा था जो अंदर के वर्ग को खींचता था और फिर एक पुनरावर्ती फ़ंक्शन होता है जो शेष बिंदुओं को शामिल करने और बाहर करने के लिए परिधि के चारों ओर 'वर्ग' बनाता है। परिणाम एक अविश्वसनीय रूप से तेजी से परिणाम था - वह माइक्रोसेकंड में लाखों अंकों का मूल्यांकन कर सकता था।
ऊपर मेरा दृष्टिकोण निश्चित रूप से 'क्रूड' है, लेकिन सक्षम है। एक बार फिर धन्यवाद!
डौग,
मैं मूल्यांकन करने के लिए mysql और php का उपयोग करने की कोशिश कर रहा हूं कि क्या एक लंबा लंबा बिंदु बहुभुज के भीतर है। क्या आप जानते हैं कि आपके डेवलपर मित्र ने इस कार्य को पूरा करने के बारे में कोई उदाहरण प्रकाशित किया है। या क्या आप कोई अच्छा उदाहरण जानते हैं। अग्रिम में धन्यवाद।
हाय सब यह मेरा परीक्षण एसक्यूएल बयान है:
SELECT DISTINCT area_id, (
(
(
acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
`lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
`lat_dec` * pi( ) /180 )
) * cos( (
( 51.02 - `lon_dec` ) * pi( ) /180 )
)
)
) *180 / pi( )
) *60 * 1.1515 * 1.609344
) AS distance
FROM `post_codes` WHERE distance <= 50
और मैस्केल मुझे बता रहा है कि दूरी, एक स्तंभ के रूप में मौजूद नहीं है, मैं इसके द्वारा आदेश का उपयोग कर सकता हूं, मैं इसे बिना कहां कर सकता हूं, और यह काम करता है, लेकिन इसके साथ नहीं ...
“HEREING दूरी” के साथ “WHERE दूरी” को बदलें।
एक आकर्षण, धन्यवाद, डगलस की तरह काम करता है!
यह बहुत अच्छा है, हालाँकि यह ठीक उसी तरह है जैसे पक्षी उड़ते हैं। Google मैप्स API को किसी भी तरह (शायद सड़कों आदि का उपयोग करके) शामिल करने की कोशिश करना और इसे शामिल करना बहुत अच्छा होगा। बस परिवहन के एक अलग रूप का उपयोग करके एक विचार देना है। मुझे अभी भी PHP में एक सिम्युलेटेड एनालिंग फंक्शन करना है जो ट्रैवलिंग सेल्समैन की समस्या का कुशल समाधान प्रस्तुत करने में सक्षम होगा। लेकिन मुझे लगता है कि मैं ऐसा करने के लिए आपके कुछ कोड का पुन: उपयोग करने में सक्षम हो सकता हूं।
हाय डगलस,
इस लेख के लिए बहुत-बहुत धन्यवाद - आपने मुझे बहुत समय दिया।
ख्याल रखना,
nimrod @Irarael
अच्छा लेख! मुझे दो बिंदुओं के बीच दूरी की गणना करने के तरीके के बारे में बहुत सारे लेख मिले, लेकिन मैं वास्तव में एसक्यूएल स्निपेट की तलाश कर रहा था।
धन्यवाद बहुत अच्छा काम करता है
इस सूत्र के लिए बहुत-बहुत धन्यवाद। इसने एक स्टोर लोकेशन प्रोजेक्ट पर कुछ समय मुंडाया जो मुझे खा रहा था।
ढेरों धन्यवाद। कोड की इस छोटी सी लाइन ने मुझे स्टोर लोकेशन प्रोजेक्ट में कुछ समय बचाया!
# 1054 - अज्ञात स्तंभ 'दूरी' जहां 'खंड' में
अनुमोदन करना
मुझे भी! समस्या क्या है :-/? "दूरी" को हल करने के लिए कैसे - कॉलम की समस्या? कृपया हमारी मदद करो!! 🙂
WHERE के बजाय HAVING का उपयोग करने का प्रयास करें
अनुसंधान के 2 दिन आखिरकार इस पृष्ठ को ढूंढते हैं जो मेरी समस्या को हल करता है। ऐसा लगता है कि मैं अपने वुल्फरामअल्फा को बेहतर तरीके से मिटा रहा हूं और अपने गणित पर ब्रश कर रहा हूं। WHERE से HAVING में परिवर्तन से कार्य क्रम में मेरी स्क्रिप्ट है। धन्यवाद
इसके बजाय क्लॉज उपयोग:
दूरी दूरी <50
धन्यवाद जॉर्जी। मैं कॉलम 'दूरी' नहीं मिला। एक बार जब मैं वहाँ को बदलने के लिए यह एक आकर्षण की तरह काम किया!
काश यह पहला पृष्ठ होता जो मुझे इस पर मिलता। कई अलग-अलग कमांड की कोशिश करने के बाद यह ठीक से काम करने के लिए एकमात्र था, और मेरे खुद के डेटाबेस को फिट करने के लिए आवश्यक न्यूनतम परिवर्तनों के साथ।
बहुत बहुत धन्यवाद!
काश यह पहला पृष्ठ होता जो मुझे इस पर मिलता। कई अलग-अलग कमांड की कोशिश करने के बाद यह ठीक से काम करने के लिए एकमात्र था, और मेरे खुद के डेटाबेस को फिट करने के लिए आवश्यक न्यूनतम परिवर्तनों के साथ।
बहुत बहुत धन्यवाद!
आपका बहुत बहुत धन्यवाद!
आपका बहुत बहुत धन्यवाद!
मुझे नहीं लगता कि कोड अब दिखाई दे रहा है। शायद यह फ़ायरफ़ॉक्स है?
मैंने अभी फ़ायरफ़ॉक्स और क्रोम दोनों में परीक्षण किया है और यह प्रदर्शित हो रहा है। पुनः प्रयास करें?
नमस्ते। बहुत बहुत धन्यवाद। यह एक आकर्षण की तरह काम करता है।
बहुत बहुत धन्यवाद डगलस। यह एकदम सही काम कर रहा है।
मुझे पता है कि यह सूत्र काम करता है, लेकिन मैं यह नहीं देख सकता कि पृथ्वी की त्रिज्या को कहाँ ध्यान में रखा जाता है। क्या कोई मुझे बता सकता है, कृपया?
टिम, हैवरसाइन सूत्र की पूरी व्याख्या के लिए (यह कोड नहीं है) विकिपीडिया के लेख को देखें: http://en.wikipedia.org/wiki/Haversine_formula
सुंदर! इससे मुझे बहुत मदद मिली है!
महान सामान डगलस। क्या आपने दो बिंदुओं के लॉन्ग / लाट / बेयरिंग को देखते हुए चौराहे को प्राप्त करने की कोशिश की है?
नहीं किया है कि अभी तक, Khanh!
डगलस, एसक्यूएल क्वेरी का धन्यवाद, जिसकी मुझे आवश्यकता है, और मुझे लगा कि मुझे इसे स्वयं लिखना होगा। आपने मुझे संभवतः अक्षांश देशांतर सीखने के घंटों से बचाया है!
मैं Myrr क्वेरी पर 'जहां खंड' में अज्ञात कॉलम 'डिस्टर्ब': अज्ञात कॉलम 'डिस्टेंस' प्राप्त करता रहता हूं।
पीटर, कृपया अन्य टिप्पणियों के माध्यम से पढ़ें। ऐसा प्रतीत होता है कि कुछ लोगों को WHERE / HAVING के लिए एक अलग वाक्यविन्यास का उपयोग करना पड़ा।
इस उत्तम लेख के लिए आपका धन्यवाद! बस मेरे DB पर कोड का परीक्षण किया और महान काम किया!
डगलस, इस अद्भुत कोड के लिए धन्यवाद। मेरे जीपीएस सामुदायिक पोर्टल पर ऐसा करने के लिए मेरे सिर को फटा जा रहा है। आपने मुझे घंटों बचाया है।
सुनकर बहुत अच्छा लगा, ऐश!
इस उपयोगी लेख को पोस्ट करने के लिए धन्यवाद,
लेकिन किसी कारण के लिए मैं पूछना चाहता हूँ
mysql db के अंदर के कॉर्ड्स के बीच की दूरी कैसे प्राप्त करें और यूजर द्वारा php में कॉर्ड्स डाले जाएं?
अधिक स्पष्ट रूप से वर्णन करने के लिए:
1.user को db से निर्दिष्ट डेटा का चयन करने के लिए [id] सम्मिलित करना होगा और उपयोगकर्ता के स्वयं के कोर्डर्स
2. php फ़ाइल को [id] का उपयोग करके लक्ष्य डेटा (कोर्डर्स) मिलता है और फिर उपयोगकर्ता और लक्ष्य बिंदु के बीच की दूरी की गणना करता है
या बस नीचे दिए गए कोड से दूरी प्राप्त कर सकते हैं?
$ qry = "SELECT *, ((acos (पाप ("। $ अक्षांश "। * pi () / 180)) * sin ((` अक्षांश '* pi () / 180) + cos (")। $ अक्षांश। ”* pi () / 180)) * cos ((` अक्षांश `* pi () / 180)) * cos (((“। $ देशांतर। ”-` देशांतर`) * pi () / 180 ))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) 'MyTable` WHERE दूरी> = "$ दूरी से।" >>>> क्या मैं यहाँ से दूरी "ले" सकता हूँ?
एक बार फिर धन्यवाद,
टिम्मी एस
कोई बात नहीं, मैंने पता लगाया है कि "फ़ंक्शन" php में कैसे काम करता है
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
बहुत बहुत धन्यवाद!!
ठीक है, मैंने जो कुछ भी कोशिश की है वह काम नहीं कर रहा है। मेरा मतलब है, मेरे पास क्या काम है, लेकिन दूरियां दूर हैं।
क्या कोई संभवतः देख सकता है कि इस कोड में क्या गलत है?
if (isset ($ _ POST ['प्रस्तुत'])) {$ z = $ _POST ['zipcode']; $ r = $ _POST ['त्रिज्या']; गूंज "परिणाम के लिए"। $ z; $ sql = mysql_query (“Select DISTINCT m.zipcode, m.MktName, m.LocAddSt, m.LocAddCity, m.LocAddState, m.x1, m.y1, m.verified, z1.lat, z2.lon, z1। शहर, z1.state फ्रॉम mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode और z2.zipcode = $ z AND (3963 * acos (troscate (sin (z2.lat / 57.2958)) * sin (m) y1 / 57.2958) + cos (z2.lat / 57.2958) * cos (m.y1 / 57.2958) * cos (m.x1 / 57.2958 - z2.lon / 57.2958, 8)) <= $ r ") या मरें") (mysql_error ()); जबकि ($ पंक्ति = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName'] ""। $ स्टोर = $ पंक्ति ['LocAddSt']। ””; $ स्टोर। = $ पंक्ति ['लोकेडसिटी']। "," $ पंक्ति ['लोकेडस्टेट "]।" "$ पंक्ति [ 'ज़िपकोड']। $ अक्षांश 1 = $ पंक्ति ['अक्षांश']; $ देशांतर 1 = $ पंक्ति ['लोन']; $ अक्षांश 2 = $ पंक्ति ['y1']; $ देशांतर 2 = $ पंक्ति ['एक्स 1']; $ शहर = $ पंक्ति ['शहर']; $ राज्य = $ पंक्ति ['राज्य']; $ dis = getnew ($ अक्षांश 1, $ देशांतर 1, $ अक्षांश 2, $ देशांतर 2, $ इकाई = 'एमआई'); // $ dis = दूरी ($ lat1, $ lon1, $ lat2, $ lon2); $ सत्यापित = $ पंक्ति ['सत्यापित']; अगर ($ सत्यापित == '1') {गूंज ""; गूंज ""। $ स्टोर। ""; इको $ डिस। " मीलों दूर"; गूंज ""; } और {गूंज ""। $ स्टोर। ""; इको $ डिस। " मीलों दूर"; गूंज ""; }}}
मेरे कार्य। एफपीपी कोड
समारोह getnew ($ अक्षांश 1, $ देशांतर 1, $ अक्षांश 2, $ देशांतर 2, $ इकाई = 'एमआई') {$ थीटा = $ देशांतर 1 - $ देशांतर 2; $ दूरी = (पाप (डाउनट्रेड 2)) ); $ दूरी = एकड़ ($ दूरी); $ दूरी = rad1deg ($ दूरी); $ दूरी = $ दूरी * 2 * 2; स्विच ($ इकाई) {केस 'Mi': ब्रेक; मामला 'किमी': $ दूरी = $ दूरी * 2; } वापसी (गोल ($ दूरी, 1)); }
आप पहले से धन्यवाद
इस लेख के लिए शुक्रिया। मेरे कोड के साथ काम करना ठीक है। 🙂
हे डगलस, महान लेख। मुझे भौगोलिक अवधारणाओं की व्याख्या और कोड वास्तव में दिलचस्प लगे। मेरा एकमात्र सुझाव अंतरिक्ष के लिए होगा और कोड को डिस्प्ले के लिए इंडेंट करना होगा (उदाहरण के लिए स्टैकओवरफ़्लो)। मैं समझता हूं कि आप अंतरिक्ष का संरक्षण करना चाहते हैं, लेकिन पारंपरिक कोड रिक्ति / इंडेंटेशन यह मेरे लिए एक प्रोग्रामर के रूप में, पढ़ने और विच्छेद करने में बहुत आसान बना देगा। किसी भी तरह, यह एक छोटी सी बात है। अच्छा काम करते रहो।
धन्यवाद! मैंने पोस्ट को थोड़ा संशोधित किया है ... लेकिन समीकरण बहुत अधिक जगह लेते हैं और इतने लंबे होते हैं कि मुझे यकीन नहीं होता कि यह बहुत मदद करता है।
बहुत बहुत धन्यवाद।
यहां फ़ंक्शन के साथ उपयोग करते समय हम एक प्रकार की दूरी प्राप्त कर रहे हैं..इस प्रकार क्वेरी का उपयोग करके इसकी अन्य प्रकार की दूरी
मैं दो राज्य के बीच की दूरी की गणना नहीं करेगा
Muchas gracias por tan hermoso कोडिगो…
यह मैं अच्छा cosinus कार्य करता है। मैं गणित नहीं जानता, लेकिन धन्यवाद!
महान काम ... 🙂 (y)
यह तेजी से लगता है (mysql 5.9) चयन में दो बार सूत्र का उपयोग करने के लिए और जहां:
$ सूत्र = "(((एकोस (पाप ("। $ अक्षांश। "* पीआई) (/ 180)) * पाप ((` अक्षांश '* पीआई () / 180)) + cos ("" $ अक्षांश। "* Pi () / 180)) * cos ((` अक्षांश `* pi () / 180)) * cos ((((" $ देशांतर। "-` देशांतर`) * pi () / (180))) * 180 / अनुकरणीय ()) * 60 * 1.1515 * 1.609344) ";
$ sql = 'SELECT *,'। $ सूत्र। ' तालिका से दूरी के रूप में '.. $ सूत्र।' <= '। $ दूरी;
धन्यवाद…
अगर काम नहीं कर रहा है
"जहां दूरी"
अगर काम कर रहा है
"दूरी"
इस लेख के लिए बहुत धन्यवाद। यह बहुत उपयोगी है।
PHP को पहले "व्यक्तिगत होम पेज" नामक एक सरल स्क्रिप्टिंग प्लेटफ़ॉर्म के रूप में बनाया गया था। आजकल PHP (हाइपरटेक्स्ट प्रीप्रोसेसर के लिए छोटा) Microsoft के सक्रिय सर्वर पेज (ASP) तकनीक का एक विकल्प है।
PHP एक ओपन सोर्स सर्वर-साइड भाषा है जिसका उपयोग डायनामिक वेब पेज बनाने के लिए किया जाता है। इसे HTML में एम्बेड किया जा सकता है। PHP आमतौर पर लिनक्स / यूनिक्स वेब सर्वर पर एक MySQL डेटाबेस के साथ संयोजन में उपयोग किया जाता है। यह शायद सबसे लोकप्रिय पटकथा भाषा है।
मैंने उपरोक्त समाधान ठीक से काम नहीं किया।
मुझे इसे बदलने की आवश्यकता है:
$ qqq = "SELECT *, (((acos (sin ("। $ अक्षांश "। * pi () / 180)) * sin ((` latt` * pi () / 180) + cos (")। $ अक्षांश। "* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos ((("। $ देशांतर।" - `longt`) * pi () / 180 ))) * 180 / पीआई ()) * 60 * 1.1515) के रूप में दूरी से `रजिस्टर`”;
धन्यवाद कुपेन्द्र!
धन्यवाद सर पूरी तरह से गिर गया .. लेकिन मेरा एक सवाल है कि अगर मैं दशमलव बिंदु के बिना उत्पादन करना चाहता हूं तो मैं क्या कर सकता हूं ..?
अग्रिम धन्यवाद.
नमस्कार, कृपया मुझे इस पर आपकी सहायता की आवश्यकता होगी।
मैंने अपने वेब-सर्वर से अनुरोध किया http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ अक्षांश
-2.23389 = $ देशांतर
और 20 = वह दूरी जिसे मैं पुनः प्राप्त करना चाहता हूं
हालाँकि आप सूत्र का उपयोग करते हुए, यह मेरे db में सभी पंक्तियों को पुनः प्राप्त करता है
$ परिणाम = DB :: select (DB :: raw ("Select *, ((acos (sin ("। $ अक्षांश ") * pi () / 180)) * sin ((lat * pi () / 180 )) cos ("(" $ अक्षांश। "* pi () / 180)) * cos ((lat * pi () / 180)) * cos ((" ($ देशांतर। "- lng) * pi () ) / (180)))) 180 / pi ()) * 60 * 1.1515 * 1.609344) दूरी के रूप में मार्करों से दूरी> = ""। $ दूरी);
[{"आईडी": 1, "नाम": "फ्रेंकी जॉनी और लुइगो टू", "पता": "939 डब्ल्यू एल कैमिनो रियल, माउंटेन व्यू, सीए", "लैट": 37.386337280273, "ओंग": - 122.08582305908, "दूरी": 16079.294719663}, {"आईडी": 2, "नाम": "एमीस ईस्ट कोस्ट पिज़्ज़ेरिया", "पता": "790 कास्त्रो सेंट, माउंटेन व्यू, सीए", "लाट": 37.387138366699, "lng": -122.08323669434, "दूरी": 16079.175940152}, "" आईडी ": 3," नाम ":" कप्प्स पिज्जा बार एंड ग्रिल "," पता ":" 191 कास्त्रो सेंट, माउंटेन व्यू, सीए "," लैट ": 37.393886566162। "Lng": - 122.07891845703, "दूरी": 16078.381373826}, {"id": 4, "नाम": "राउंड टेबल पिज्जा: माउंटेन व्यू", "पता": "570 N Shleline Blvd, माउंटेन व्यू, CA", "Lat": 37.402652740479, "lng": - 122.07935333252, "दूरी": 16077.420540582}, {"id": 5, "name": "टोनी और अल्बा का पिज़्ज़ा और पास्ता", "पता": "619 Escuela Ave, पर्वत" देखें, CA "," lat ": 37.394012451172," lng ": - 122.09552764893," दूरी ": 16078.563225154}, {" id ": 6," name ":" Oregano's Wood-Fired Pizza "," पता ":" 4546 " एल कैमिनो रियल, लॉस अल्टोस, सीए "," लेट ": 37.401725769043," एलएनजी ": - 122.11464691162," दूरी ": 16077.937560795}, {" आईडी ": 7," नाम ":" बार और ग्रिल्स "," पता ":" 24 व्हाइटली स्ट्रीट, मैनचेस्टर "," लैट ": 53.485118865967," lng ": - 2.1828699111938," दूरी ": 8038.7620112314}]
मैं केवल 20 मील के साथ पंक्तियों को पुनः प्राप्त करना चाहता हूं लेकिन यह सभी पंक्तियों को लाता है। कृपया मैं क्या गलत कर रहा हूँ
मैं एक समान क्वेरी की तलाश कर रहा हूं, लेकिन थोड़ा आगे बढ़ गया हूं - संक्षेप में यह प्रत्येक निर्देशांक के 2 मील के भीतर सभी निर्देशांक को समूहित करना है और फिर गिनना है कि प्रत्येक समूह में कितने निर्देशांक हैं और केवल एक समूह को आउटपुट करता है जिसमें सबसे अधिक निर्देशांक हैं - भले ही अगर आपके पास उन समूहों में से एक से अधिक समूह हैं जिनके निर्देशांक की संख्या सबसे अधिक है - बस यादृच्छिक समूह को समान सबसे बड़ी संख्या वाले समूहों से आउटपुट करें -