
Haversine सूत्र (PHP, JavaScript, Java, Python, MySQL, MSSQL उदाहरणहरू) प्रयोग गरेर अक्षांश र देशान्तरका बिन्दुहरू बीचको ठूलो सर्कल दूरी गणना गर्नुहोस् वा क्वेरी गर्नुहोस्।
यो महिना मैले अलिकति प्रोग्रामिङ गरिरहेको छु PHP र MySQL सम्मान गर्न GIS। नेटको वरिपरि जासूच गर्दै, मलाई वास्तवमा केहि फेला पार्न गाह्रो भयो भौगोलिक गणना दुई स्थानहरूको बीच दूरी पत्ता लगाउनको लागि म तिनीहरूलाई यहाँ सेयर गर्न चाहान्छु।

दुई पोइन्ट बीचको दूरी हिसाब गर्ने सरल तरिका भनेको पायथागोरियन सूत्र प्रयोग गर्दै त्रिकोण (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 - तपाईंको दोस्रो स्थानको अक्षांशको लागि एक चर।
- देशान्तर १ - तपाईंको दोस्रो स्थानको देशान्तरको लागि एक चर।
- एकाइ - पूर्वनिर्धारित अस्तित्व हजारौँ। यो रूपमा अद्यावधिक वा पारित गर्न सकिन्छ किलोमिटर.
Javascript: अक्षांश र देशान्तरको २ बिन्दुहरू बीचको दूरी गणना गर्नुहोस्
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 - तपाईंको दोस्रो स्थानको अक्षांशको लागि एक चर।
- देशान्तर १ - तपाईंको दोस्रो स्थानको देशान्तरको लागि एक चर।
- एकाइ - पूर्वनिर्धारित अस्तित्व हजारौँ। यो रूपमा अद्यावधिक वा पारित गर्न सकिन्छ किलोमिटर.
पाइथन: अक्षांश र देशान्तरका २ बिन्दुहरू बीचको दूरी गणना गर्नुहोस्
जे भए पनि, यहाँ दुई बिन्दुहरू (माइल बनाम किलोमिटर रूपान्तरणको साथमा) दुई दशमलव स्थानहरूमा राउन्ड गरिएको दूरीको गणना गर्नको लागि पाइथन सूत्र छ। मेरो छोरा, बिल कररलाई श्रेय जो डेटा वैज्ञानिक हो 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: अक्षांश र देशान्तर प्रयोग गरेर माइलहरूमा दूरी गणना गरेर दायरा भित्र सबै रेकर्डहरू पुन: प्राप्त गर्दै
एक निश्चित दूरी भित्र सबै रेकर्डहरू गणना गर्न SQL प्रयोग गर्न पनि सम्भव छ। यस उदाहरणमा, म MySQL मा MyTable लाई क्वेरी गर्न जाँदैछु जुन सबै रेकर्डहरू भेरिएबल $distance (माइलमा) भन्दा कम वा बराबर छन् मेरो स्थानमा $latitude र $longitude:
विशिष्ट भित्र सबै रेकर्डहरू पुन: प्राप्त गर्नका लागि प्रश्न दूरी माईलमा दूरी हिसाब गरेर अक्षांश र देशान्तरका दुई पोइन्टहरू बीच हुन्:
$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."
तपाईंले यसलाई अनुकूलित गर्नु पर्छ:
- itude देशान्तर - यो एक PHP भ्यारीएबल हो जहाँ म पोइन्टको देशान्तर पार गर्दैछु।
- itude अक्षांश - यो एक PHP भ्यारीएबल हो जहाँ म पोइन्टको देशान्तर पार गर्दैछु।
- । दूरी - यो दूरी हो जुन तपाईं सबै रेकर्डहरू कम वा बराबर फेला पार्न चाहानुहुन्छ।
- तालिका - यो टेबल हो ... तपाईं यसलाई तपाईंको टेबलको नामसँग बदल्न चाहानुहुन्छ।
- अक्षांश - यो तपाईंको अक्षांशको क्षेत्र हो।
- देशान्तरण - यो तपाईंको देशान्तरको क्षेत्र हो।
MySQL: अक्षांश र देशान्तर प्रयोग गरेर किलोमिटरमा दूरी गणना गरेर दायरा भित्र सबै रेकर्डहरू पुन: प्राप्त गर्दै
र SQL क्वेरी यहाँ MySQL मा किलोमिटर प्रयोग गरीरहेको छ:
$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."
तपाईंले यसलाई अनुकूलित गर्नु पर्छ:
- itude देशान्तर - यो एक PHP भ्यारीएबल हो जहाँ म पोइन्टको देशान्तर पार गर्दैछु।
- itude अक्षांश - यो एक PHP भ्यारीएबल हो जहाँ म पोइन्टको देशान्तर पार गर्दैछु।
- । दूरी - यो दूरी हो जुन तपाईं सबै रेकर्डहरू कम वा बराबर फेला पार्न चाहानुहुन्छ।
- तालिका - यो टेबल हो ... तपाईं यसलाई तपाईंको टेबलको नामसँग बदल्न चाहानुहुन्छ।
- अक्षांश - यो तपाईंको अक्षांशको क्षेत्र हो।
- देशान्तरण - यो तपाईंको देशान्तरको क्षेत्र हो।
मैले यो कोड ईन्टरप्राइज म्यापि। प्लेटफर्ममा प्रयोग गर्यो जुन हामीले उत्तर अमेरिकामा १,००० भन्दा बढी स्थानहरूसहितको खुद्रा स्टोरको लागि प्रयोग गर्यौं र यसले राम्रोसँग काम गर्यो।
माइक्रोसफ्ट 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);
मनश साहू, उपाध्यक्ष र वास्तुकारलाई टोपी टिप Highbridge.
साझा गर्नुभएकोमा धेरै धेरै धन्यवाद। यो एक सजिलो प्रतिलिपि र टाँस्ने काम थियो र राम्रो काम गर्दछ। तपाईंले मलाई धेरै समय बचाउनु भयो।
C मा पोर्ट गर्ने जो कोहीको लागि FYI:
डबल deg2rad (डबल डिग्री) { रिटर्न डिग्री*(३.१४१५९२६५३५८९७९३२३८४६/१८०.०); }
पोस्टिङको धेरै राम्रो टुक्रा - धेरै राम्रो काम गर्यो - मैले मात्र लामो-लामो समात्ने टेबलको नाम परिवर्तन गर्नुपर्यो। यसले धेरै छिटो काम गर्छ.. मसँग ल्याट-लांग्स (< 400) को यथोचित सानो संख्या छ तर मलाई लाग्छ कि यो राम्रो मापन हुनेछ। राम्रो साइट पनि - मैले भर्खरै यसलाई मेरो del.icio.us खातामा थपेको छु र नियमित रूपमा जाँच गर्नेछु।
धेरै धेरै धन्यवाद पीटर र केरी! यदि तपाइँ GIS परियोजनाहरूमा काम गर्न चाहनुहुन्छ भने, म सिफारिस गर्दछु:
धेरै धेरै धन्यवाद...😀
मैले पूरै दिन दूरी गणनाको लागि खोजी गरें र हार्भर्साइन एल्गोरिथ्म फेला पारे, यसलाई sql स्टेटमेन्टमा कसरी राख्ने भन्ने उदाहरण दिनु भएकोमा धन्यवाद। धन्यवाद र अभिवादन, डेनियल
मद्दत गर्न पाउँदा खुसी छ, रेल साथी!
अब म 'बहुभुजमा' PHP प्रकार्यको खोजीमा छु जसले अनुक्रमित अक्षांश र देशान्तर समन्वयहरूको एर्रे लिनेछ र अर्को बिन्दु बहुभुज भित्र वा बाहिर छ कि छैन भनेर पत्ता लगाउनेछ।
मैले फेला पारे बहुभुजमा कुनै बिन्दु छ भने पत्ता लगाउनको लागि समीकरण!
मलाई लाग्छ तपाईको SQL लाई कथन चाहिन्छ।
जहाँ दूरी <= $distance तपाईंलाई आवश्यक हुन सक्छ
HAVING दूरी <= $distance प्रयोग गर्नुहोस्
अन्यथा मलाई धेरै समय र ऊर्जा बचत गर्नुभएकोमा धन्यवाद।
नमस्ते डेभिड,
यदि तपाइँ कुनै पनि प्रकारको GROUP BY कथन गर्दै हुनुहुन्छ भने, तपाइँलाई HAVING आवश्यक पर्दछ। मैले माथिको उदाहरणमा त्यो गरिरहेको छैन।
डग
MySQL 5.x को रूपमा, तपाईंले WHERE खण्डमा उपनाम प्रयोग गर्न सक्नुहुन्न 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
कसैलाई यो कसरी प्रमाणित गर्ने थाहा छ?
धन्यवाद!
हैरी
नमस्कार,
अर्को प्रश्न। के त्यहाँ तलको जस्तै NMEA स्ट्रिङहरूको लागि सूत्र छ?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
धन्यवाद,
हैरी
मैले कहाँ मेरो लागि काम गरेन भनेर पनि फेला पारे। यसलाई HAVING मा परिवर्तन गरियो र सबै कुरा सही काम गर्दछ। सुरुमा मैले टिप्पणीहरू पढिन र नेस्टेड चयन प्रयोग गरेर यसलाई पुन: लेखे। दुबै राम्रो काम गर्नेछ।
Mysql मा लेखिएको स्क्रिप्ट को लागी धेरै धेरै धन्यवाद, केवल केहि सानो समायोजन (HAVING) 🙂
राम्रो काम
अविश्वसनीय सहयोगी, धेरै धेरै धन्यवाद! मलाई "कहाँ" को सट्टा नयाँ "HAVING" को साथ केहि समस्या भइरहेको थियो, तर एकचोटि मैले यहाँ टिप्पणीहरू पढे (निराशामा दाँत किटेको लगभग आधा घण्टा पछि =P), मैले राम्रोसँग काम गरें। धन्यवाद ^_^
धन्यबाद धेरै धेरै राम्रो काम गर्दछ
मनमा राख्नुहोस् कि त्यस्ता छनौट कथन धेरै कम्प्युटेसनली तीव्र र त्यसैले ढिलो हुनेछ। यदि तपाइँसँग ती धेरै प्रश्नहरू छन् भने, यसले चीजहरू चाँडै बिगार्न सक्छ।
धेरै कम तीव्र दृष्टिकोण भनेको गणना गरिएको दूरी द्वारा परिभाषित स्क्वायर क्षेत्र प्रयोग गरेर पहिलो (क्रूड) चयन चलाउनु हो जस्तै "टेबलनामबाट चयन गर्नुहोस् जहाँ lat1 र lat2 बीचको अक्षांश र lon1 र lon2 बीचको देशान्तर"। lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, lon सँग मिल्दोजुल्दो। latdiff ~= दूरी / 111 (किमिको लागि), वा दूरी / 69 माइलको लागि 1 डिग्री अक्षांश देखि ~ 111 किमी (पृथ्वी थोरै अंडाकार भएकोले थोरै भिन्नता, तर यस उद्देश्यको लागि पर्याप्त)। londiff = दूरी / (abs(cos(deg2rad(latitude))*111)) — वा माइलको लागि 69 (तपाईले भिन्नताहरूको लागि खाता बनाउनको लागि वास्तवमा थोरै ठूलो वर्ग लिन सक्नुहुन्छ)। त्यसपछि त्यसको नतिजा लिनुहोस् र यसलाई रेडियल चयनमा फिड गर्नुहोस्। केवल सीमा भन्दा बाहिरको निर्देशांकहरूको लागि खाता गर्न नबिर्सनुहोस् - जस्तै स्वीकार्य देशान्तरको दायरा -180 देखि +180 र स्वीकार्य अक्षांशको दायरा -90 देखि +90 हो - यदि तपाइँको latdiff वा londiff यस दायरा बाहिर चल्छ भने। । ध्यान दिनुहोस् कि प्रायजसो अवस्थामा यो लागू नहुन सक्छ किनभने यसले ध्रुवबाट ध्रुवमा प्रशान्त महासागरको माध्यमबाट एक रेखामा गणनालाई मात्र असर गर्छ, यद्यपि यसले चुकोटकाको भाग र अलास्काको भागलाई काट्छ।
यसबाट हामीले के हासिल गर्छौं जुन बिन्दुहरूको संख्यामा तपाईंले यो गणना गर्नुहुन्छ भन्नेमा उल्लेखनीय कमी हो। यदि तपाइँसँग डाटाबेसमा एक मिलियन ग्लोबल बिन्दुहरू लगभग समान रूपमा वितरित छन् र तपाइँ 100 किमी भित्र खोज्न चाहनुहुन्छ भने, तपाइँको पहिलो (छिटो) खोज एक क्षेत्र 10000 वर्ग किलोमिटर हो र सम्भवतः लगभग 20 नतिजाहरू दिनेछ (एक भन्दा बढी वितरणमा आधारित। लगभग 500M वर्ग किलोमिटरको सतह क्षेत्र), जसको मतलब यो हो कि तपाईंले यो प्रश्नको लागि लाखौं पटकको सट्टा जटिल दूरी गणना 20 पटक चलाउनुहुन्छ।
उदाहरणमा सानो गल्ती... त्यो ५० किलोमिटर भित्रको हुनेछ (१०० होइन) किनकि हामीले हाम्रो... वर्गको "त्रिज्या" हेरिरहेका छौं।
शानदार सल्लाह! मैले वास्तवमा एक विकासकर्तासँग काम गरें जसले एक प्रकार्य लेख्यो जसले भित्री वर्गलाई तान्यो र त्यसपछि पुनरावर्ती प्रकार्य जसले परिधिको वरिपरि 'वर्ग' बनाउँछ बाँकी बिन्दुहरू समावेश गर्न र बहिष्कार गर्न। नतिजा अविश्वसनीय रूपमा छिटो परिणाम थियो - उसले माइक्रोसेकेन्डमा लाखौं अंकहरू मूल्याङ्कन गर्न सक्छ।
माथिको मेरो दृष्टिकोण निश्चित रूपमा 'कच्चा' तर सक्षम छ। फेरि पनि धन्यबाद!
डग,
म ल्याट लामो बिन्दु बहुभुज भित्र छ कि छैन भनेर मूल्याङ्कन गर्न mysql र php प्रयोग गर्ने प्रयास गरिरहेको छु। के तपाईलाई थाहा छ यदि तपाईको विकासकर्ता साथीले यो कार्य कसरी पूरा गर्ने बारे कुनै उदाहरण प्रकाशित गर्नुभयो। वा तपाईंलाई कुनै राम्रो उदाहरणहरू थाहा छ। अग्रिम धन्यवाद।
नमस्ते सबैलाई यो मेरो परीक्षण SQL कथन हो:
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
र Mysql ले मलाई त्यो दूरी बताइरहेको छ, स्तम्भको रूपमा अवस्थित छैन, म अर्डर प्रयोग गर्न सक्छु, म यसलाई कहाँ बिना गर्न सक्छु, र यसले काम गर्दछ, तर यसको साथ होइन ...
"WHERE दूरी" लाई "HAVING दूरी" ले बदल्नुहोस्।
एक आकर्षण जस्तै काम गर्दछ, धन्यवाद, डगलस!
यो महान छ, यद्यपि यो चराहरू उड्ने जस्तै हो। गुगल नक्सा एपीआईलाई यसमा कुनै न कुनै तरिकाले (सडक आदि प्रयोग गरेर) सम्मिलित गर्ने प्रयास गर्नु राम्रो हुनेछ। मैले अझै पनि PHP मा सिमुलेटेड एनेलिङ प्रकार्य बनाउन बाँकी छ जुन यात्रा सेल्सम्यान समस्याको कुशल समाधान प्रस्ताव गर्न सक्षम हुनेछ। तर मलाई लाग्छ कि म त्यसो गर्नको लागि तपाइँको केहि कोड पुन: प्रयोग गर्न सक्षम हुन सक्छु।
नमस्ते डगलस,
यस लेखको लागि धेरै धेरै धन्यवाद - तपाईंले भर्खर मलाई धेरै समय बचाउनु भयो।
ख्याल राख,
nimrod @Israel
राम्रो लेख! मैले दुई बिन्दुहरू बीचको दूरी कसरी गणना गर्ने भनेर वर्णन गर्ने धेरै लेखहरू फेला पारे तर म वास्तवमै SQL स्निपेट खोज्दै थिएँ।
धन्यवाद धेरै राम्रो काम गर्दछ
यस सूत्रका लागि धेरै धन्यबाद। यो एक स्टोर स्थान प्रोजेक्टमा केहि समय दाह्री भयो जुन ममा खाइरहेको थियो।
धन्यवाद एक बन्डल। कोडको यो सानो लाइनले मलाई स्टोर स्थान प्रोजेक्टमा केहि समय बचायो!
#1054 - 'जहाँ खण्ड' मा अज्ञात स्तम्भ 'दूरी'
अनुमोदन गर्नुहोस्
यहाँ पनि त्यस्तै! समस्या के हो :-/? कसरी "दूरी" समाधान गर्ने - स्तम्भ समस्या? हामीलाई मद्दत गर्नुहोस्, कृपया !! 🙂
WHEE को सट्टा HAVING प्रयोग गरेर हेर्नुहोस्
2 दिनको अनुसन्धान अन्ततः मेरो समस्या समाधान गर्ने यो पृष्ठ फेला पार्न। यस्तो देखिन्छ कि मैले मेरो वोल्फ्राम अल्फालाई राम्रोसँग बस्ट गरें र मेरो गणितमा ब्रश गर्नुहोस्। WHERE बाट HAVING मा परिवर्तन मेरो लिपि कार्य क्रममा छ। धन्यवाद
जहाँ खण्ड प्रयोग गर्नुको सट्टा:
दूरी <50 भएको
धन्यवाद जर्जी। मैले स्तम्भ 'दूरी' फेला परेन। एक पटक मैले कहाँ परिवर्तन गरें यो एक आकर्षण जस्तै काम भयो!
म चाहन्छु कि यो पहिलो पृष्ठ हो जुन मैले यसमा फेला पारेको थिएँ। धेरै फरक आदेशहरू प्रयास गरिसकेपछि यो ठीकसँग काम गर्ने एक मात्र थियो, र मेरो आफ्नै डाटाबेसमा फिट गर्न आवश्यक न्यूनतम परिवर्तनहरूको साथ।
धन्यवाद धेरै!
म चाहन्छु कि यो पहिलो पृष्ठ हो जुन मैले यसमा फेला पारेको थिएँ। धेरै फरक आदेशहरू प्रयास गरिसकेपछि यो ठीकसँग काम गर्ने एक मात्र थियो, र मेरो आफ्नै डाटाबेसमा फिट गर्न आवश्यक न्यूनतम परिवर्तनहरूको साथ।
धन्यवाद धेरै!
धेरै धेरै धन्यवाद!
धेरै धेरै धन्यवाद!
मलाई लाग्दैन कि कोड अब देखिँदैछ। सायद यो फायरफक्स हो?
मैले भर्खरै दुबै फायरफक्स र क्रोममा परीक्षण गरें र यो देखा पर्दैछ। फेरि प्रयास गर्ने हो?
नमस्ते। धेरै धेरै धन्यवाद। यो आकर्षण जस्तै काम गर्दछ।
धेरै धेरै डगलस धन्यबाद। यो उत्तम काम गर्दैछ।
मलाई थाहा छ यो सूत्रले काम गर्छ, तर पृथ्वीको त्रिज्या कहाँ लिइन्छ भनेर म देख्न सक्दिन। कृपया मलाई कसैले बुझाउन सक्नुहुन्छ?
टिम, Haversine सूत्रको पूर्ण व्याख्याको लागि (यो कोड होइन), विकिपिडियाको लेख हेर्नुहोस्: http://en.wikipedia.org/wiki/Haversine_formula
सुन्दर! यसले मलाई अत्यन्त मदत गरेको छ!
उत्कृष्ट सामान डगलस। के तपाईंले दुईवटा पोइन्ट लामो / लाट / असर दिएर छेदन विन्दु प्राप्त गर्ने प्रयास गर्नुभयो?
अहिलेसम्म त्यो गरेको छैन, खान!
धन्यवाद डगलस, SQL क्वेरी ठ्याक्कै मलाई चाहिने कुरा हो, र मैले सोचे कि यो आफैले लेख्नुपर्छ। तपाईंले मलाई सम्भवतः घण्टा अक्षांश देशान्तर सिक्ने वक्रबाट बचाउनु भएको छ!
म त्रुटि सन्देश प्राप्त गरिरहन्छु: MySQL क्वेरीमा 'जहाँ क्लज' मा अज्ञात स्तम्भ 'दूरी'।
पिटर, कृपया अन्य टिप्पणीहरू पढ्नुहोस्। यस्तो देखिन्छ कि केही व्यक्तिहरूले WHERE / HAVING का लागि बिभिन्न सिन्ट्याक्स प्रयोग गर्नुपर्यो।
यो महान लेख को लागी धन्यवाद! भर्खरै मेरो DB मा कोड परीक्षण गर्नुभयो र महान कार्य गर्नुभयो!
डगलस, यो अद्भुत कोड को लागी धन्यवाद। मेरो जीपीएस समुदाय पोर्टलमा यो कसरी गर्ने भन्ने बारे मेरो टाउको क्र्याक गर्दै। तपाईंले मलाई घण्टा बचत गर्नुभयो।
सुन्न ठूलो, ऐश!
यो उपयोगी लेख पोस्ट गर्नुभएकोमा धन्यवाद,
तर केही कारणले म सोध्न चाहन्छु
Mysql db भित्रको coords र प्रयोगकर्ता द्वारा php मा सम्मिलित coords बीचको दूरी कसरी प्राप्त गर्ने?
थप स्पष्ट रूपमा वर्णन गर्न को लागी:
1. प्रयोगकर्ताले db र प्रयोगकर्ताको आफ्नै coords बाट निर्दिष्ट डाटा चयन गर्न [id] सम्मिलित गर्नुपर्छ
2. php फाइलले [id] प्रयोग गरेर लक्ष्य डेटा (कोर्डहरू) प्राप्त गर्दछ र त्यसपछि प्रयोगकर्ता र लक्ष्य बिन्दु बीचको दूरी गणना गर्दछ।
वा तलको कोडबाट मात्र दूरी प्राप्त गर्न सक्नुहुन्छ?
$qry = "SELECT *,((acos(sin((“.$latitude।"*pi()/180)) * sin((`Latitude`*pi()/180))+cos((“। $अक्षांश। )))*180/pi())*180*180*180) दूरीको रूपमा `MyTable` बाट जहाँ दूरी >= ".$ दूरी।" >>>>के म यहाँबाट दूरी "बाहिर निकाल्न" सक्छु?
फेरि पनि धन्यबाद,
टिमी एस
केहि फरक पर्दैन, मैले php मा "प्रकार्य" कसरी काम गर्छ भनेर पत्ता लगाएको छु
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
धेरै धेरै धन्यवाद !!
ठीक छ, मैले प्रयास गरेको सबै काम गरिरहेको छैन। मेरो मतलब, मसँग के काम छ, तर दुरीहरू टाढा छन्।
के कसैले यो कोडमा के गलत छ भनेर देख्न सक्छ?
if(isset($_POST['submitted'])){ $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। mrk m, zip z1, zip z1 बाट city,z2.state जहाँ m.zipcode = z1.zipcode र z2.zipcode = $z AND (3963 * acos( truncate( 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 ) = ) die < ) (mysql_error()); जबकि($row = mysql_fetch_array($sql )) { $store1 = $row['MktName']।""; $store = $row['LocAddSt']।""; $store .= $row['LocAddCity']।", ".$row['LocAddState']।" $row['zipcode']; $latitude1 = $row['lat']; $longitude1 = $row ['lon']; $latitude2 = $row['y1']; $longitude2 = $row['x1']; $city = $row ['शहर']; $state = $row['state']; $dis = नयाँ ($ अक्षांश1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = दूरी($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; यदि ($प्रमाणित == '1'){ इको ""; इको ""। $store।""; echo $dis। "माइल(हरू) टाढा"; प्रतिध्वनि ""; } else { इको ""। $store।""; echo $dis। "माइल(हरू) टाढा"; प्रतिध्वनि ""; } }}
मेरो functions.php कोड
प्रकार्य प्राप्त भयो ($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $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) { केस 'Mi': ब्रेक; केस 'Km' : $distance = $distance * 1.609344; } फिर्ता (गोल ($ दूरी, 2)); }
अग्रिम धन्यवाद
यस लेखका लागि धन्यबाद। मेरो कोडको साथ ठीक काम गर्दै। 🙂
हे डगलस, उत्कृष्ट लेख। मैले भौगोलिक अवधारणा र कोडको तपाईंको व्याख्या साँच्चै रोचक पाएँ। मेरो मात्र सुझाव स्पेस र प्रदर्शनको लागि कोड इन्डेन्ट हुनेछ (जस्तै Stackoverflow, उदाहरणका लागि)। म बुझ्छु कि तपाईं ठाउँ संरक्षण गर्न चाहनुहुन्छ, तर परम्परागत कोड स्पेसिङ / इन्डेन्टेशनले मलाई प्रोग्रामरको रूपमा पढ्न र विच्छेदन गर्न धेरै सजिलो बनाउँदछ। जे होस्, यो सानो कुरा हो। महान कार्य जारी राख्नुहोस्।
धन्यवाद! मैले पोस्टलाई थोरै परिमार्जन गरेको छु... तर समीकरणहरूले यति धेरै ठाउँ लिन्छ र यति लामो छ कि यसले धेरै मद्दत गर्छ भनेर मलाई पक्का छैन।
धेरै धेरै धन्यबाद।
यहाँ प्रकार्यको साथ प्रयोग गर्दा हामी एक प्रकारको दूरी पाउँदैछौं।तै बेला क्वेरी प्रयोग गरेर आउँदैछ भने अन्य प्रकारको दूरी
म दुई राज्य बीचको दूरी गणना गर्ने छैन
धेरै ग्रासियास पोर ट्यान हर्मोसो कोडिगो...
यो म राम्रो कोसिनस प्रकार्यहरु। मलाई गणित थाहा छैन, तर धन्यवाद!
राम्रो काम... 🙂 (y)
यो छिटो देखिन्छ (mysql 5.9) चयनमा दुई पटक सूत्र प्रयोग गर्न र कहाँ:
$formula = “(((acos(sin((“.$latitude।"*pi()/180))* sin((`Latitude`*pi()/180))+cos((“.$ अक्षांश। ”*pi()/180)) * cos((`Latitude`*pi()/180)) * cos((“.$longitude।”- `Longitude`)*pi()/180)))) *180/pi()*60*1.1515*1.609344)”;
$sql = 'SELECT *, '.$ सूत्र।' तालिकाबाट दूरीको रूपमा जहाँ '..$ सूत्र।' <= '।$ दूरी;
धन्यबाद ...
काम गर्दैन भने
"कहाँ टाढा"
काम गर्छ भने
"दूरी राख्दै"
यो लेख सुन्नु भएकोमा धेरै धेरै धन्यवाद।यो धेरै उपयोगी छ।
PHP लाई पहिले "व्यक्तिगत गृह पृष्ठ" भनिने सरल स्क्रिप्टिङ प्लेटफर्मको रूपमा सिर्जना गरिएको थियो। आजकल PHP (हाइपरटेक्स्ट प्रिप्रोसेसरको लागि छोटो) माइक्रोसफ्टको एक्टिभ सर्भर पृष्ठहरू (एएसपी) प्रविधिको विकल्प हो।
PHP एक खुला स्रोत सर्भर-साइड भाषा हो जुन गतिशील वेब पृष्ठहरू सिर्जना गर्न प्रयोग गरिन्छ। यसलाई HTML मा सम्मिलित गर्न सकिन्छ। PHP लाई सामान्यतया Linux/UNIX वेब सर्भरहरूमा MySQL डाटाबेससँग संयोजनमा प्रयोग गरिन्छ। यो सायद सबैभन्दा लोकप्रिय स्क्रिप्टिङ भाषा हो।
मैले माथिको समाधान ठीकसँग काम नगरेको फेला पारे।
मलाई परिवर्तन गर्न आवश्यक छ:
$qqq = "SELECT *,(((acos(sin((“.$latitude।"*pi()/180)) * sin((`latt`*pi()/180))+cos((”। $अक्षांश। "*pi()/180)) * cos((`latt`*pi()/180)) * cos((" . $longitude . "- `longt`)*pi()/180) )))*180/pi())*60*1.1515) `दर्ता` बाट दूरीको रूपमा;
धन्यवाद कुपेन्द्र!
धन्यवाद सर एकदम राम्रो काम गर्दै हुनुहुन्छ .. तर मसँग एउटा प्रश्न छ यदि म दशमलव बिन्दु बिना आउटपुट गर्न चाहन्छु भने म के गर्न सक्छु ..?
अग्रिम धन्यवाद।
नमस्ते, कृपया मलाई यसमा तपाईंको मद्दत चाहिन्छ।
मैले मेरो वेब सर्भरमा प्राप्त अनुरोध गरें
५३.४७७९२ = $अक्षांश
-2.23389 = $देशान्तर
र 20 = मैले पुन: प्राप्त गर्न चाहेको दूरी
यद्यपि तपाइँ सूत्र प्रयोग गरेर, यसले मेरो db मा सबै पङ्क्तिहरू पुन: प्राप्त गर्दछ
$results = DB::select( DB::raw("SELECT*, (((acos(sin((".$latitude))।pi()/180)) * sin((latpi()/180))+cos((“.$ अक्षांश।”pi()/180)) * cos((latpi()/180)) * cos((".$देशान्तर।"- lng)pi()/180))))180/pi())601.1515*1.609344) मार्करहरूबाट दूरीको रूपमा दूरी >= “.$ दूरी));
[{"id":1,"नाम":"Frankie Johnnie & Luigo Too","ठेगाना":"939 W El Camino Real, Mountain View, CA","lat":37.386337280273,"lng":-122.08582305908, "दूरी":16079.294719663},{"id":2,"नाम":"Amici's East Coast Pizzeria","ठेगाना":"790 Castro St, Mountain View, CA","lat":37.387138366699,"lng": -१२२.०८३२३६६९४३४,"दूरी":१६०७९.१७५९४०१५२},{"आईडी":३,"नाम":"कपको पिज्जा बार र ग्रिल","ठेगाना":"१९१ क्यास्ट्रो सेन्ट, माउन्टेन भ्यू, सीए","लाट":३७.३९३८६८६, "lng":-122.08323669434,"distance":16079.175940152},{"id":3,"name":"Round Table Pizza: Mountain View","ठेगाना":"191 N Shoreline Blvd, Mountain View, CA", "lat":37.393886566162,"lng":-122.07891845703,"दूरी":16078.381373826},{"id":4,"नाम":"टोनी र अल्बाको पिज्जा र पास्ता","ठेगाना":"570 एकुटेन View, CA","lat":37.402652740479,"lng":-122.07935333252,"distance":16077.420540582},{"id":5,"name":"Oregano's Wood-Fire Pizza","619""ठेगाना":37.394012451172 El Camino Real, Los Altos, CA","lat":122.09552764893,"lng":-16078.563225154,"दूरी":6},{" id":4546,"नाम":"द बार र ग्रिलहरू","ठेगाना":"37.401725769043 व्हाइटली स्ट्रीट, म्यानचेस्टर","लाट":122.11464691162,"lng":-16077.937560795,"दूरी":7}
म 20 माइलको साथ पङ्क्तिहरू पुन: प्राप्त गर्न चाहन्छु तर यसले सबै पङ्क्तिहरू ल्याउँछ। कृपया म के गल्ती गर्दैछु
म उस्तै प्रश्न खोज्दै छु तर अलिकति बढेको छु - संक्षेपमा यो प्रत्येक समन्वयको 2 माईल भित्र सबै समन्वयहरूलाई समूहबद्ध गर्ने हो र त्यसपछि प्रत्येक समूहमा कतिवटा समन्वयहरू गणना गर्नुहोस् र सबैभन्दा बढी समन्वय भएको एउटा समूह मात्र आउटपुट गर्नुहोस् - भले पनि तपाईसँग समूहहरू मध्ये एक भन्दा बढी समूहहरू छन् जसमा धेरै संख्यामा समन्वयहरू छन् - केवल एउटै ठूलो संख्या भएका समूहहरूबाट अनियमित समूह आउटपुट गर्नुहोस् -
साझेदारीको लागि धेरै धेरै धन्यवाद।