2012-02-03 13 views
8

Necesito encontrar el lugar de Facebook para la ciudad para muchos puntos lat/long. Los puntos reales se refieren a direcciones personales, por lo que no hay identificaciones de lugar exactas para buscar como en el caso de una empresa.Cómo obtener el ID de lugar de la ciudad desde Latitud/Longitud mediante la API de Facebook

Para las pruebas, que estaba buscando la ciudad de Red Feather Lakes, CO.

  • La función de búsqueda gráfica volverá una gran cantidad de lugares, pero no vuelve ciudades Example

  • Raw FQL no le permite buscar por latitud/longitud, y no tiene ningún concepto de "cerca" de todos modos. Example

  • Una consulta FQL por ID revela que hay al menos un campo "Mostrar subtexto" que indica que el objeto es una ciudad. Example

Gracias por cualquier ayuda. ¡Tengo más de 80 años de fotos antiguas y geoetiquetadas de mi padre que le encantaría ver en su línea de tiempo!

EDITAR

las ciudades no están en la tabla place, son sólo en la tabla page. Hay una función FQL distance() indocumentada, pero solo funciona en la tabla place. (. Via this SO answer)

Esto funciona:

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

Pero esto da un error "la distancia no es válida en la tabla de la página":

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

Awesome! Buen descubrimiento. – DMCS

Respuesta

4

Es un hack gloriosa, pero este código funciona . El truco es hacer dos consultas. Primero buscamos lugares cercanos a nuestro punto. Esto devuelve una gran cantidad de lugares de negocios. Luego tomamos la ciudad de uno de estos lugares, y la utilizamos para buscar en la tabla page de la página de esa ciudad. Parece que hay una convención de nomenclatura estándar para las ciudades, pero diferente para las ciudades de EE. UU. Y las que no lo son.

Algunas ciudades pequeñas tienen varios deletreos en la tabla place, por lo que el código recorre los lugares devueltos hasta que encuentra una coincidencia en la tabla 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

He encontrado esta solución funcionó para mí en la búsqueda de una página de la ciudad más cercana a la latitud/longitud especificada. Por alguna razón, el LÍMITE 1 no devolvió la ciudad más cercana, así que aumenté el límite y luego obtuve el primer resultado.

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

¡Funcionó para mí! Gracias ! – Tricote

Cuestiones relacionadas