2011-11-15 5 views
12

मैं हाल ही में मेरी वेबसाइटों में कुछ नया आज़माने के लिए गूगल मैप्स एपीआई को देख शुरू कर दिया है। मैं वर्तमान में इस कोड का उपयोग कर रहा हूँ:डाक कोड के 10 मील त्रिज्या के भीतर कस्बों को ढूंढना। गूगल मैप्स एपीआई

<?php 

$postcode = $_REQUEST['postcode']; 

$url = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.$postcode.'&sensor=false'; 
$parsedXML = simplexml_load_file($url); 

if($parsedXML->status != "OK") { 
echo "There has been a problem: " . $parsedXML->status; 
} 

$myAddress = array(); 
foreach($parsedXML->result->address_component as $component) { 
if(is_array($component->type)) $type = (string)$component->type[0]; 
else $type = (string)$component->type; 

$myAddress[$type] = (string)$component->long_name; 
} 
header('Content-Type: application/json'); 
echo json_encode($myAddress); 


?> 

जो केवल एक पोस्टकोड कि मैं परिभाषित का उपयोग करता है और गूगल डेटाबेस खोज करता है और उसके बाद रिटर्न शहर, काउंटी आदि

संभव हो तो, मैं न केवल दिखाने के लिए चाहते हैं निकटतम शहर लेकिन 5-10 मील त्रिज्या के भीतर भी कोई भी। क्या कोई मुझे बता सकता है कि मैं इसे करने के बारे में कैसे जाऊंगा?

किसी भी मदद

+0

यहां कुछ आशाजनक प्रश्नोत्तरी हैं: http://stackoverflow.com/search?q=radius+search+google+maps+php - उनमें से किसने आपने जांच की है और उन्होंने आपकी समस्या को हल करने में आपकी सहायता क्यों नहीं की? – Gordon

+0

मैं उन लोगों के माध्यम से देखता हूं, मैंने अपना प्रश्न टाइप करते समय सुझाए गए पदों पर ध्यान दिया लेकिन बहुत उपयोगी सामग्री नहीं देखी। क्या आप जानते हैं कि रॉयल मेल के भुगतान के बिना मुझे यूके पोस्टकोड डेटाबेस कहां मिल सकता है? मैंने एक लेख देखा जो विकीलेक्स ने इसे जारी किया लेकिन यह 200 9 में था, इसलिए मुझे लगता है कि यह पूरी तरह अद्यतित नहीं है –

+0

कोई विचार नहीं, क्षमा करें। एक त्वरित Google ने https://www.ordnancesurvey.co.uk/opendatadownload/products.html लाया लेकिन मुझे यकीन नहीं है कि ये उपयोग करने के लिए स्वतंत्र हैं या सहायक हैं। – Gordon

उत्तर

51

अद्यतन के लिए धन्यवाद: -

लूप को गूगल मैप्स एपीआई का उपयोग कर सभी उपलब्ध कस्बों के माध्यम से मैं एक अधिक विस्तृत ऐसे ब्लॉग पोस्ट को इस खास विषय से संबंधित http://www.mullie.eu/geographic-searches/

पर लिखा था अपने अक्षांश & देशांतर प्राप्त करें। इन्हें कहीं भी (डेटाबेस) सहेजें। - सावधान रहें, Google बड़ी संख्या में कॉल स्वीकार नहीं करेगा, इसलिए आपकी कॉल को थ्रॉटल करें।

  • खुद डेटाबेस:

    ऊपर कोड के बारे में
    public static function getNearby($lat, $lng, $type = 'cities', $limit = 50, $distance = 50, $unit = 'km') 
    { 
        // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius' 
        if ($unit == 'km') $radius = 6371.009; // in kilometers 
        elseif ($unit == 'mi') $radius = 3958.761; // in miles 
    
        // latitude boundaries 
        $maxLat = (float) $lat + rad2deg($distance/$radius); 
        $minLat = (float) $lat - rad2deg($distance/$radius); 
    
        // longitude boundaries (longitude gets smaller when latitude increases) 
        $maxLng = (float) $lng + rad2deg($distance/$radius/cos(deg2rad((float) $lat))); 
        $minLng = (float) $lng - rad2deg($distance/$radius/cos(deg2rad((float) $lat))); 
    
        // get results ordered by distance (approx) 
        $nearby = (array) FrontendDB::getDB()->retrieve('SELECT * 
                    FROM table 
                    WHERE lat > ? AND lat < ? AND lng > ? AND lng < ? 
                    ORDER BY ABS(lat - ?) + ABS(lng - ?) ASC 
                    LIMIT ?;', 
                    array($minLat, $maxLat, $minLng, $maxLng, (float) $lat, (float) $lng, (int) $limit)); 
    
        return $nearby; 
    } 
    

    नोट्स:

    तब, जब एक शहर को लाते समय, आप समान कोड नीचे दिए गए कोड को शहरों के लिए एक निश्चित सीमा के भीतर हड़पने के लिए उपयोग कर सकते हैं आवरण का इस्तेमाल किया है, तो mysql_query, पीडीओ को बदलना है, ...

  • यह सही नहीं होगा। हम डीबी में सही गोलाकार गणना नहीं कर सकते, तो हम ऊपरी & कम अक्षांश & देशांतर सीमा लिया है। यह मूल रूप से मतलब है कि एक स्थान जो थोड़ा अपनी दूरी से आगे है (जैसे, दूर उत्तर-पूर्व में सिर्फ वास्तविक त्रिज्या का (जो वास्तव में काफी एक चक्र) है बाहर, लेकिन अभी भी अधिकतम अक्षांश अंदर & देशांतर में (क्योंकि हम तुलना यह डेटाबेस में सीमा वर्ग) ऐसा करने पर आपके त्रिज्या के भीतर शहरों में से एक मोटा लेकिन अखरोट 100% सही चयन दे देंगे

मैं इस उदाहरण देकर स्पष्ट करने की कोशिश करेंगे:।। ऊपर

_________________ 
| /\  | 
| Y/ \ | 
|/  \ | 
|(  X  )| 
| \  /| 
| \ / | 
|______\_/______| 

सर्कल (कुछ हद तक) वास्तविक त्रिज्या है जहां आप स्थान एक्स के आधार पर स्थानों को ढूंढना चाहते हैं। यह आपके डीबी से सीधे पूरा करना बहुत मुश्किल है, तो हम वास्तव में डीबी से क्या प्राप्त करते हैं आसपास के वर्ग है। आप देख सकते हैं, यह संभव है कि स्थानों (वाई) की तरह, इन अधिकतम & मिनट सीमाओं के भीतर गिर हालांकि वे वास्तव में अनुरोध किया त्रिज्या के भीतर नहीं हैं। हालांकि बाद में PHP के माध्यम से फ़िल्टर किया जा सकता है।

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

public static function getDistance($lat1, $lng1, $lat2, $lng2, $unit = 'km') 
{ 
    // radius of earth; @note: the earth is not perfectly spherical, but this is considered the 'mean radius' 
    if ($unit == 'km') $radius = 6371.009; // in kilometers 
    elseif ($unit == 'mi') $radius = 3958.761; // in miles 

    // convert degrees to radians 
    $lat1 = deg2rad((float) $lat1); 
    $lng1 = deg2rad((float) $lng1); 
    $lat2 = deg2rad((float) $lat2); 
    $lng2 = deg2rad((float) $lng2); 

    // great circle distance formula 
    return $radius * acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($lng1 - $lng2)); 
} 

यह (अर्ध) की गणना करेगा स्थान एक्स और वाई स्थान के बीच सटीक दूरी, और फिर आप वास्तव में उन शहरों कि काफी निकट थे फ़िल्टर कर सकते हैं किसी न किसी डाटाबेस पारित करने के लिए -फैच, लेकिन वास्तव में आपके सीमाओं के भीतर वास्तव में पर्याप्त नहीं है।

+4

मुझे नहीं पता कि आपको केवल 6 अप क्यों मिले हैं =) –

+0

कमाल का जवाब, बहुत बहुत धन्यवाद –

संबंधित मुद्दे