Как узнать идентификатор города из Широты / Долготы с помощью Facebook API - PullRequest
8 голосов
/ 03 февраля 2012

Мне нужно найти место на Facebook для города для многих широт / длинных точек.Фактические баллы относятся к личным адресам, поэтому точных идентификаторов мест для поиска не существует, как в случае с бизнесом.

Для тестирования я искал город Red Feather Lakes, CO.

  • Функция поиска по графику будет возвращать много мест, но не возвращает города Пример

  • Необработанный FQL не позволяет выполнять поиск по широте / долготе и в любом случае не имеет понятия «рядом». Пример

  • FQL-запрос по идентификатору показывает, что есть хотя бы поле «Показать подтекст», которое указывает, что объект является городом. Пример

Спасибо за любую помощь.У меня есть более 80 лет датированных и геотегированных фотографий моего отца, которые он хотел бы видеть на своей временной шкале!

РЕДАКТИРОВАТЬ

Города не входят в placeтаблицы, они только в таблице page.Существует недокументированная функция distance() FQL, но она работает только в таблице place.(Через этот SO-ответ .)

Это работает:

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

Но это выдает ошибку «расстояние недопустимо на странице таблицы»:

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

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Это великолепный хак, но этот код работает. Хитрость заключается в том, чтобы сделать два запроса. Сначала мы ищем места рядом с нашей точкой. Это возвращает много деловых мест. Затем мы берем город одного из этих мест и используем его, чтобы найти в таблице page страницу этого города. Кажется, для городов существуют стандартные соглашения об именах, но они различаются для городов США и других стран.

В некоторых небольших городах в таблице place есть различные варианты написания, поэтому код перебирает возвращаемые места, пока не находит совпадения в таблице 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 голосов
/ 17 января 2013

Я обнаружил, что это решение работает для меня при поиске страницы для ближайшего города с указанной широтой / долготой. По какой-то причине LIMIT 1 не вернул ближайший город, поэтому я увеличил лимит и получил первый результат.

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