2010-08-31 20 views
8

मैं एक साइट है कि मूल रूप से एक अक्षां और लंबे समय का उपयोग कर PHP और MySQL के 25 मील के दायरे में स्थानों के लिए लग रहा है लिख रहा हूँ।PHP MySQL और भौगोलिक-स्थान

मैं कैसे कुछ इस तरह काम करेगा सोच रहा हूँ?

मैं एक लेट और लंबे समय तक स्क्रिप पास कर दूंगा और इसे केवल उन स्थानों को खींच दूंगा जो लेट के 25 मील के भीतर और मेरे डेटाबेस के डेटाबेस से लंबे समय तक हैं।

ऐसा करने का सबसे अच्छा तरीका क्या है?

संपादित करें: मुझे 2 अंक के बीच की दूरी की गणना करने के लिए यह कोड मिला।

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 

    $theta = $lon1 - $lon2; 
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
    $dist = acos($dist); 
    $dist = rad2deg($dist); 
    $miles = $dist * 60 * 1.1515; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
    return ($miles * 1.609344); 
    } else if ($unit == "N") { 
     return ($miles * 0.8684); 
    } else { 
     return $miles; 
     } 
} 

वहाँ तो मैं केवल लौट सकते हैं देखो MYSQL में इस calc करने के लिए एक रास्ता है, तो मील की दूरी पर = < 25?

+0

यह अन्य स्थानों को कहां खींच रहा है? क्या आप सरणी या डेटाबेस में संग्रहीत हर इच्छित स्थान का लेट/लम्बाई रखते हैं? – shamittomar

+0

मैंने सवाल संपादित किया। मेरे डेटाबेस में कुछ निश्चित स्थान होंगे और देखेंगे कि उनमें से कोई भी 25 मील के भीतर है या नहीं। यदि नहीं, तो कोई भी वापस नहीं आ गया है। – shaneburgess

+0

कुछ और यहाँ की जानकारी: क्योंकि यह अनावश्यक पंक्तियों रिटर्न http://stackoverflow.com/questions/20865747/geolocation-mysql-query – miralong

उत्तर

6

उस समारोह का उपयोग करके दूरी की गणना करना काफी कम्प्यूटेशनल रूप से महंगा है, क्योंकि इसमें अनुवांशिक कार्यों का पूरा समूह शामिल है। इस आधार पर आप फ़िल्टर के लिए पंक्तियों की एक बड़ी संख्या है, जब कई समस्याएं खड़ी कर रहा है।

मील में

लगभग दूरी:

sqrt(x * x + y * y) 

where x = 69.1 * (lat2 - lat1) 
and y = 53.0 * (lon2 - lon1) 

आप कोज्या गणित समारोह जोड़कर इस अनुमानित दूरी गणना की सटीकता में सुधार कर सकते हैं:

यहाँ एक विकल्प के एक सन्निकटन कम रास्ता computationally महंगा है कि

मील में सुधार अनुमानित दूरी:

sqrt(x * x + y * y) 

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

स्रोत: http://www.meridianworlddata.com/Distance-Calculation.asp


मैं यादृच्छिक रूप से जनरेट डेटासेट के साथ परीक्षण के एक समूह के भाग गया।

  • 3 एल्गोरिदम के लिए सटीकता में अंतर विशेष रूप से कम दूरी
  • धीमी एल्गोरिथ्म है, पर न्यूनतम है, ज़ाहिर है, ट्रिग कार्यों के साथ एक (आपके प्रश्न पर एक)। यह अन्य दो धीमी 4x रहा है।

निश्चित रूप से इसके लायक नहीं है। बस एक सन्निकटन के साथ चलते हैं।
कोड यहाँ है: http://pastebin.org/424186


MySQL पर इस का उपयोग करने के लिए, एक stored procedure कि तर्क समन्वय लेता है और दूरी रिटर्न बनाने के लिए, तो आप की तरह कुछ कर सकते हैं:

SELECT columns 
    FROM table 
WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25 
0

तुम कर सकते हो आसानी से दो चरणों में:

  • बिंदु की प्रत्येक दिशा में 25 मील के भीतर सभी स्थानों को खोजें।यह इस तरह दिखेगा: WHERE lat BETWEEN $lat1 AND $lat2 AND lng BETWEEN $lng1 AND $lng2

  • फिर प्रत्येक परिणाम के माध्यम से लूप करें और यह देखने के लिए जांचें कि यह वास्तव में आपके कोड का उपयोग कर 25 मील के भीतर है या नहीं।

    $lat_range = $radius/((6076/5280) * 60); 
    $lng_range = $radius/(((cos(($city['lat'] * 3.141592653589/180)) * 6076)/5280) * 60); 
    
    : (। यानी, उन स्थानों है कि वर्ग के कोनों में कर रहे हैं बाहर फिल्टर)

पहले भाग के लिए, यहाँ कुछ कोड मैं चारों ओर बिछाने है (स्रोत याद नहीं है) है

असल में बस ($lat - $lat_range, $lat + $lat_range) और ($lng - $lng_range, $lng + $lng_range) का उपयोग करें त्रिज्या मील में है।

स्पष्ट रूप से आप गणित को थोड़ा सा साफ कर सकते हैं।

संपादित करें: मैं यह है कि आप अगर आप भूमध्य रेखा, अंतर्राष्ट्रीय दिनांक रेखा, आदि जाहिर है उत्तरी अमेरिका के लिए आस-पास का समर्थन करने के, तो यह ठीक हो जाएगा के रूप में है की जरूरत है यह थोड़ा बदलाव करने की आवश्यकता होगी उल्लेख करना भूल गया।

+0

निश्चित रूप से यह दो छानने चरणों की आवश्यकता होगी, का नुकसान है। – NullUserException

+0

हां, लेकिन यह पूरे डेटाबेस के खिलाफ गणना करने से बचाता है। एक छोटे त्रिज्या और एक बड़े डेटासेट के साथ, यह महत्वपूर्ण हो सकता है। – Matthew

2

आप this solution पर कुछ नज़र डालना चाहते हैं - कुछ हद तक शानदार कामकाज।