2012-02-03 20 views
8

kullanarak Enlem/Boylam şehrin Yeri kimliğini almak için birçok enlem/boylam noktaları için şehir için Facebook yer bulmalıyız. Asıl noktalar kişisel adreslere atıfta bulunur, bu yüzden bir işletme durumunda olduğu gibi tam olarak nereye bakılacağı bilinmemektedir. Test için Nasıl Facebook API

, ben grafik arama fonksiyonu yerlerde bir sürü dönecektir Red Feather Lakes, CO.

  • ilçesinde arıyordu ama Example

  • Ham FQL izin vermez şehirler dönmez Lat/long ile arama ve zaten "yakın" kavramı yok. Example

  • Kimliği ile bir FQL sorgusu, nesnenin bir şehir olduğunu belirten en az bir "Görüntü Alt Metni" alanı olduğunu ortaya çıkarır. Herhangi bir yardım için Example

teşekkürler. Babamın zaman çizelgesinde görmeyi sevdiği 80 yılı aşkın bir geçmişim var.

DÜZENLEME

Şehirler değil place tabloda, sadece page tabloda bulunmaktadır bulunmaktadır. Orada bir belgesiz distance() FQL fonksiyonudur, ancak yalnızca place tabloda çalışır.

SELECT name,description,geometry,latitude,longitude, display_subtext 
FROM place 
WHERE distance(latitude, longitude, "40.801985", "-105.593719") < 50000 

Ama bu bir hata "mesafe tablosu sayfasında geçerli değil" verir: (. this SO answer Via)

Bu işleri

SELECT page_id,name,description,type,location 
FROM page 
WHERE distance(
    location.latitude,location.longitude, 
    "40.801985", "-105.593719") < 50000 
+0

Müthiş! Iyi bulmak. – DMCS

cevap

4

O muhteşem kesmek ama bu kod işleri . Hile iki sorgu yapmaktır. Öncelikle bizim noktaya yakın yerler ararız. Bu, birçok iş yeri döndürür. Daha sonra kenti bu yerlerden birinin almak ve bu şehrin sayfası için page tabloda bakmak için kullanabilir. Şehirler için standart bir adlandırma kuralları var gibi görünüyor, ancak ABD ve ABD dışındaki şehirler için farklı.

Bazı küçük şehirler place tablosunda çeşitli yazımlara sahiptir, bu nedenle page tablosundaki bir eşleşme buluncaya kadar kod döndürülen yerler arasında dolaşır.

$fb_token = 'YOUR_TOKEN'; 

// Red Feather Lakes, Colorado 
$lat = '40.8078'; 
$long = '-105.579'; 
// Karlsruhe, Germany 
$lat = '49.037868'; 
$long = '8.350124'; 

$states_arr = array('AL'=>"Alabama",'AK'=>"Alaska",'AZ'=>"Arizona",'AR'=>"Arkansas",'CA'=>"California",'CO'=>"Colorado",'CT'=>"Connecticut",'DE'=>"Delaware",'FL'=>"Florida",'GA'=>"Georgia",'HI'=>"Hawaii",'ID'=>"Idaho",'IL'=>"Illinois", 'IN'=>"Indiana", 'IA'=>"Iowa", 'KS'=>"Kansas",'KY'=>"Kentucky",'LA'=>"Louisiana",'ME'=>"Maine",'MD'=>"Maryland", 'MA'=>"Massachusetts",'MI'=>"Michigan",'MN'=>"Minnesota",'MS'=>"Mississippi",'MO'=>"Missouri",'MT'=>"Montana",'NE'=>"Nebraska",'NV'=>"Nevada",'NH'=>"New Hampshire",'NJ'=>"New Jersey",'NM'=>"New Mexico",'NY'=>"New York",'NC'=>"North Carolina",'ND'=>"North Dakota",'OH'=>"Ohio",'OK'=>"Oklahoma", 'OR'=>"Oregon",'PA'=>"Pennsylvania",'RI'=>"Rhode Island",'SC'=>"South Carolina",'SD'=>"South Dakota",'TN'=>"Tennessee",'TX'=>"Texas",'UT'=>"Utah",'VT'=>"Vermont",'VA'=>"Virginia",'WA'=>"Washington",'DC'=>"Washington D.C.",'WV'=>"West Virginia",'WI'=>"Wisconsin",'WY'=>"Wyoming"); 

$place_search = json_decode(file_get_contents('https://graph.facebook.com/search?type=place&center=' . $lat . ',' . $long . '&distance=10000&access_token=' . $fb_token)); 
foreach($place_search->data as $result) { 
    if ($result->location->city) { 
    $city = $result->location->city; 
    $state = $result->location->state; 
    $country = $result->location->country; 
    if ($country=='United States') { 
     $city_name = $city . ', ' . $states_arr[$state]; // e.g. 'Chicago, Illinois' 
    } 
    else { 
     $city_name = $city . ', ' . $country; // e.g. 'Rome, Italy' 
    } 
    $fql = 'SELECT name,page_id,name,description,type,location FROM page WHERE type="CITY" and name="' .$city_name. '"'; 
    $result = json_decode(file_get_contents('https://graph.facebook.com/fql?q=' . rawurlencode($fql) . '&access_token=' . $fb_token)); 
    if (count($result->data)>0) { 
     // We found it! 
     print_r($result); 
     break; 
    } 
    else { 
     // No luck, try the next place 
     print ("Couldn't find " . $city_name . "\n"); 
    } 
    } 
} 
2

Belirtilen enlem/boylam için en yakın şehir için bir sayfa ararken bu çözümü benim için çalıştı buldum. Bazı nedenlerden dolayı LIMIT 1 en yakın şehri geri çevirmedi, bu yüzden limiti çarptı ve ilk sonucu aldım.

SELECT page_id 
FROM place 
WHERE is_city and distance(latitude, longitude, "<latitude>", "<longitude>") < 100000 
ORDER BY distance(latitude, longitude, "<latitude>", "<longitude>") 
LIMIT 20 
+0

Benim için çalıştı! Teşekkürler ! – Tricote