2011-11-15 23 views
12

Kısa bir süre önce web sitemde yeni bir şeyler denemek için Google Haritalar API'sine bakmaya başladım. Şu anda bu kodu kullanıyorum:Posta kodunun 10 mil yarıçapındaki şehirleri bulmak. Google haritaları API

<?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); 


?> 

basitçe kasaba, ilçe vb

Mümkünse ben tanımladığınız bir posta kodu kullanan ve Google veritabanını arar ve sonra döner, ben sadece göstermek istiyorum en yakın şehir ama aynı zamanda herhangi bir 5-10 mil yarıçapında. Birisi bana bunu yapmak için nasıl gideceğimi söyler misiniz lütfen? herhangi bir yardım

+0

Bir kaç umut vaat eden Soru ve Cevap: http://stackoverflow.com/search?q=radius+search+google+maps+php - hangileri kontrol ettiniz ve neden sorununuzu çözmenize yardımcı olmadılar? – Gordon

+0

Bunlara bir göz atacağım, soruyu yazarken önerilen mesajlara baktım ama çok yararlı şeyler görmedim. Royal Mail aptalca para ödemeden İngiltere posta kodu veritabanını nereden bulabileceğimi biliyor musun? Ben wikileaks yayımladı ama bu 2009 yılında tam olarak güncel değil –

+0

hiçbir fikrim yok, üzgünüm diye bir makale gördüm. Hızlı bir google, https://www.ordnancesurvey.co.uk/opendatadownload/products.html adresini oluşturdu ancak bunların ücretsiz olup olmadığını bilmiyor. – Gordon

cevap

51

Güncelleme için

Teşekkür: - Google Maps API kullanarak mevcut tüm kasaba ile

Döngü ben http://www.mullie.eu/geographic-searches/

bu spesifik konuda daha detaylı bir blog yayınını yukarı yazdım Enlemlerini & boylamı getir. Bunları bir yere kaydedin (veritabanı). - Dikkat edin, Google çok fazla sayıda çağrı kabul etmeyecek, bu yüzden aramalarınızı kısın.

  • Kendi veritabanı: Yukarıdaki kodu hakkında

    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; 
    } 
    

    Notlar: Bir kasaba getirirken

    Ardından, belirli bir aralık Withing şehirler kapmak için aşağıdaki koda benzer bir kod kullanabilirsiniz Sarıcı kullanılır, bu nedenle mysql_query, PDO, ... 'ya dönüşür.

  • Bu tam olarak doğru olmaz. DB'deki kesin hesaplamaları yapamayız, bu nedenle üst & alt enlemi & boylam limitlerini aldık. Bu temel olarak, mesafenizden biraz daha uzak olan bir konum anlamına gelir (örneğin, gerçek yarıçapın hemen dışında, uzak yarıçapın hemen hemen dışında), fakat yine de maksimum enlemi & boylam içinde (çünkü . o Bu sadece Yarıçapınızı withing şehirlerin kaba ama somun% 100 doğru seçim verecektir) veritabanında sınırlarını kare

bu durumu gösteren çalışacağım.

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

yukarıda daire (biraz), X konumuna bağlı olarak, içinde konum bulmak istediğiniz gerçek yarıçaptır. Bu, DB'nizden doğrudan elde etmek için çok zor, Yani DB'den aldığımız şey çevredeki karedir. Görebildiğiniz gibi, (Y) gibi konumların, gerçekte istenen yarıçapa sahip olmadıkları halde, bu max & min sınırlarının içine düşmesi mümkündür. Bunlar daha sonra PHP ile filtrelenebilir.

Bu son sayının üstesinden gelmek için, tüm sonuçları döngüden geçirebilir ve gerçekte kendi yarıçapınızın içinde olup olmadıklarını hesaplamak için hem kök konumunuz hem de bulunan eşleşmeler arasındaki tam mesafeyi hesaplayabilirsiniz. kaba db geçmek konum X ve konumu Y arasındaki

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)); 
} 

Bu (quasi) hesaplar kesin mesafeyi ve sonra yeterince yakın olduğunu tam olarak bu şehirler filtreleyebilirsiniz: Bunun için, bu kodu kullanabilirsiniz -Topak, ama sadece sınırların içinde olmak için yeterince yakın değil.

+4

Neden sadece 6 ups var =) –

+0

harika cevap, çok teşekkürler –

İlgili konular