2012-06-26 15 views
5

के बीच माप माप मुझे SQL कथन के माध्यम से उपयोगकर्ता को निकटतम स्थान वापस करने का प्रयास करने में समस्याएं आ रही हैं।दो लेट/एलएनजी अंक

एसक्यूएल:

SELECT `companies`.`customerName` , 
    (3959 * 
     ACOS(
      COS(
       RADIANS(37.367485) * COS(RADIANS(`locations`.`gps_lat`)) * 
       COS(
        RADIANS(`locations`.`gps_lng`) - RADIANS(-77.399994) + 
        SIN(RADIANS(37.367485)) * SIN(RADIANS(`locations`.`gps_lat`)) 
       ) 
      ) 
     ) 
    ) 
AS `distance` 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING `distance` > 25 
ORDER BY distance 
LIMIT 0 , 10 

परिणाम:

| customerName | distance   | 
| SOME COMPANY | 1914.41747964854 | 


locationsतालिका मूल्यों का परीक्षण करने के लिए मैं ठीक उसी निर्देशांक उपयोग कर रहा हूँ, यहाँ मैं क्या है :

gps_lat | gps_lng 
37.367485 | -77.399994 


मैं Google से उदाहरण का इस्तेमाल किया, मैं सूत्र दो बार की जाँच की और मैं जहाँ मैं गलत हो गया था साथ आने के लिए नहीं कर पा रहे। किसी भी मदद की सराहना की है।


संपादित करें:
के बाद से यह जानकर मैं क्या कर रहा हूँ मुझ पर कुछ भ्रम की स्थिति होने के लिए वहाँ लगता है:

> एक परिणाम उपज के लिए प्रतिस्थापित किया गया, 1914 स्पष्ट रूप से अधिक से अधिक तो 25 है।

इसका आवेदन एंड्रॉइड ऐप से हमारे वेब सर्वर पर उपयोगकर्ता निर्देशांक पास कर रहा है। अक्षांश और देशांतर $_GET मूल्यों से खींचा जाएगा और हमारे वेब सर्वर MYSQL डेटाबेस में कंपनियों से क्रॉस-रेफरेंस किया जाएगा।

उपरोक्त वाक्यविन्यास सिर्फ मैक्सल वर्कबेंच में मेरा SQL कथन जांच रहा है। जाहिर है, मैं शून्य मान परिणाम की तलाश में हूं।

+3

आप निकटतम चाहते हैं, यही कारण है कि आप इसे करने के प्रतिबंधित करने के लिए "दूरी > 25 "? –

+0

मैंने किया, शून्य परिणाम लौटा। ध्यान दें कि यह मुझे – jnthnjns

+2

से ऊपर की दूरी पर ध्यान दें, आप जिस आरडीबीएमएस का उपयोग कर रहे हैं उसके आधार पर, ऐसा करने के लिए काफी सरल (और तेज़) तरीके हो सकते हैं। पूर्व: [MySQL] (http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html), [SQL सर्वर] (http://msdn.microsoft.com/en-us/ पुस्तकालय/बीबी 3 9 3876% 28v = sql.105% 29.aspx), [पोस्टग्रेएसक्यूएल] (http://postgis.refractions.net/)। –

उत्तर

5

मुझे लगता है कि मैंने गूंज उदाहरण से "एक गोद लेने वाले योपर के एडवेंचर्स" द्वारा प्रदान किए गए सूत्र में बदलकर इस मुद्दे को हल किया है। Haversine Formula के अपने संस्करण का उपयोग करना।
नोट: उपरोक्त Google उदाहरण हावरसिन का भी उपयोग कर रहा है।

एसक्यूएल:

SELECT `companies`.`customerName` , 
(2 * (3959 * ATAN2(
      SQRT(
      POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(37.367485)) * 
      POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng`))/2), 2) 
     ), 
      SQRT(1-(
      POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(37.367485)) * 
      POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng`))/2), 2) 
     )) 
     ) 
    )) 
AS 'distance' 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 10 



अपने आवेदन पर उत्सुक लोगों के लिए, अंतिम पीएचपी:

प्राप्त मान: ?lat=37.367485&lng=-77.399994

$earth_radius_miles = 3959; // Earth radius in miles 
$earth_radius_kilometers = 6371; // Earth radius in kilometers 
$result_radius = 10000; // Maximum distance in either miles or kilometers 

$get_lat = $_GET["lat"]; 
$get_lng = $_GET["lng"]; 

$dbSelect = mysql_query("SELECT `companies`.`customerName`, 
(2 * (".$earth_radius_miles." * ATAN2(
      SQRT(
      POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(".$get_lat.")) * 
      POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng`))/2), 2) 
     ), 
      SQRT(1-(
      POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(".$get_lat.")) * 
      POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng`))/2), 2) 
     )) 
     ) 
    )) 
AS 'distance' 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING distance < ".$result_radius." 
ORDER BY distance 
LIMIT 0 , 10") 
or die(mysql_error()); 

परिणाम:

[{"customerName":"SOME COMPANY","distance":"0"}] 

मैं दूसरे निर्देशांक के साथ इन परिणामों का परीक्षण किया और लगता है पूरी तरह से काम करने।दो बिंदुओं के बीच महान दूरी के साथ कुछ भी परीक्षण नहीं किया है, लेकिन मेरे आवेदन के लिए मुझे ऐसा करने की आवश्यकता नहीं है।

+1

प्रमाणित नहीं किया जा सकता है, लेकिन प्रेजेंटेशन के लिए +1 – Smandoli

1

अशोक, आप नीचे दिए गए सूत्र का उपयोग करके दो cordinates के बीच दूरी की गणना कर सकते हैं:

enter image description here

जहां

R = radius of the earth (6,371 km) 
Δlat = |lat2- lat1| 
Δlong = |long2- long1|