2012-02-03 7 views
8

Potrzebuję znaleźć miejsce Facebook dla miasto dla wielu punktów długich/długich. Rzeczywiste punkty odnoszą się do adresów osobistych, więc nie ma dokładnego identyfikatora miejsca, którego należy szukać, jak w przypadku firmy.Jak uzyskać identyfikator miejsca miasta z szerokości/długości geograficznej za pomocą interfejsu Facebook API

Do testowania szukałem miasta Red Feather Lakes, CO.

  • Funkcja wyszukiwania wykres powróci wiele miejsc, ale nie zwraca miast Example

  • Raw FQL nie pozwala szukaj przez lat/długo, i nie ma pojęcia "w pobliżu" tak czy inaczej. Example

  • Zapytanie FQL według identyfikatora wskazuje, że istnieje co najmniej pole "Wyświetl podtekst", które wskazuje, że obiekt jest miastem. Example

Dzięki za pomoc. Mam ponad 80 lat opatrzonych datą i geotagged zdjęć mojego taty, które chciałby zobaczyć na swojej osi czasu!

EDIT

Miasta nie są w tabeli place, są one tylko w tabeli page. Istnieje nieudokumentowana funkcja FQL distance(), ale działa ona tylko w tabeli place. (. Via this SO answer)

to działa:

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

Ale to daje błąd "odległość nie jest ważny w stronę stołu":

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

Awesome! Dobre znalezisko. – DMCS

Odpowiedz

4

To chwalebne hack, ale ten kod działa . Sztuką jest zrobienie dwóch pytań. Najpierw szukamy miejsc w pobliżu naszego punktu. Zwraca to wiele miejsc biznesowych. Następnie pobieramy miasto z jednego z tych miejsc i używamy go do wyświetlania tabeli page dla tego miasta. Wydaje się, że obowiązują standardowe konwencje nazewnictwa dla miast, ale różne dla miast amerykańskich i nieamerykańskich.

Niektóre małe miasta mają różną pisownię w tabeli place, więc kod przechodzi przez zwrócone miejsca, dopóki nie znajdzie dopasowania w tabeli page.

$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

Znalazłem to rozwiązanie dla mnie, gdy szukałem strony dla najbliższego miasta do określonej szerokości/długości geograficznej. Z jakiegoś powodu LIMIT 1 nie zwrócił najbliższego miasta, więc podniosłem limit, a następnie uzyskałem pierwszy wynik.

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

To zadziałało dla mnie! dzięki ! – Tricote

Powiązane problemy