2012-02-03 20 views
8

Ho bisogno di trovare il posto di Facebook per la città per molti punti lat/long. I punti effettivi si riferiscono agli indirizzi personali, quindi non ci sono ID di luogo esatti da cercare come nel caso di un'azienda.Come ottenere l'ID luogo della città da Latitudine/Longitudine utilizzando l'API di Facebook

Per il test, ero alla ricerca di città di Red Feather Lakes, CO.

  • La funzione di ricerca grafico restituirà un sacco di posti, ma non restituisce città Example

  • Raw FQL non consente di ricerca per lat/long e comunque non ha alcun concetto di "vicino". Example

  • Una query FQL per ID rivela che esiste almeno un campo "Visualizza sottotesto" che indica che l'oggetto è una città. Example

Grazie per qualsiasi aiuto. Ho oltre 80 anni di foto datate e geotaggate di mio padre che gli piacerebbe vedere sulla sua timeline!

EDIT

Città non sono nella tabella place, sono solo nella tabella page. Esiste una funzione FQL non documentata distance(), ma funziona solo nella tabella place. (. Via this SO answer)

Questo funziona:

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

Ma questo dà un errore "distanza non è valido per la pagina tabella":

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

Fantastico! Buona scoperta – DMCS

risposta

4

Si tratta di un hack glorioso, ma funziona questo codice . Il trucco è fare due domande. Per prima cosa cerchiamo luoghi vicino al nostro punto. Questo restituisce un sacco di posti di lavoro. Prendiamo la città di uno di questi luoghi e la usiamo per cercare nella tabella page per la pagina di quella città. Sembra che ci siano convenzioni di denominazione standard per le città, ma diverse per le città statunitensi e non statunitensi.

Alcune piccole città hanno varie ortografie nella tabella place, quindi il codice scorre tra i luoghi restituiti finché non trova una corrispondenza nella tabella 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

Ho trovato questa soluzione ha funzionato per me quando si cerca una pagina per la città più vicina alla latitudine/longitudine specificata. Per qualche ragione, il LIMIT 1 non ha restituito la città più vicina, quindi ho raggiunto il limite e ho preso il primo risultato.

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

Ha funzionato per me! grazie ! – Tricote

Problemi correlati