【问题标题】:How to get Place ID of city from Latitude/Longitude using Facebook API如何使用 Facebook API 从纬度/经度获取城市的地点 ID
【发布时间】:2018-04-14 19:39:35
【问题描述】:

我需要为 city 查找多个纬度/经度点的 Facebook 位置。实际点数指的是个人地址,因此没有确切的地点 ID 来查找,就像在企业的情况下一样。

为了测试,我正在寻找Red Feather Lakes, CO.的小镇

  • 图形搜索功能会返回很多地方,但不返回城市Example

  • Raw FQL 不允许您按纬度/经度进行搜索,并且无论如何都没有“附近”的概念。 Example

  • 按 ID 进行的 FQL 查询显示至少有一个“显示子文本”字段表明该对象是一个城市。 Example

感谢您的帮助。我有我父​​亲 80 多年的日期和地理标记照片,他很想在他的时间轴上看到这些照片!

编辑

城市不在place 表中,它们仅在page 表中。 有一个未记录的 distance() FQL 函数,但它仅适用于 place 表。 (通过this SO answer。)

这行得通:

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

【问题讨论】:

    标签: facebook-graph-api geolocation facebook-fql


    【解决方案1】:

    这是一个很棒的 hack,但是这段代码可以工作。诀窍是进行两个查询。首先,我们寻找我们点附近的地方。这返回了很多商业场所。然后我们获取其中一个地方的城市,并使用它在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】:

      在寻找与指定纬度/经度最近的城市的页面时,我发现此解决方案对我有用。由于某种原因 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        • 2015-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多