我需要为很多纬度/长点找到城市的Facebook位置。实际积分是指个人地址,因此没有确切的地方ID可供查找,如业务。
为了测试,我一直在寻找Red Feather Lakes, CO.
镇图表搜索功能会返回很多地方,但不会返回城市Example
原始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
答案 0 :(得分:4)
这是一个光荣的黑客,但这段代码有效。诀窍是进行两次查询。首先,我们寻找接近我们观点的地方。这会返回很多商业场所。然后我们使用其中一个地方的城市,并使用它来查看该城市页面的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¢er=' . $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");
}
}
}
答案 1 :(得分: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