2012-02-03 44 views
8

Tôi cần tìm địa điểm Facebook cho số thành phố cho nhiều điểm vĩ độ/điểm dài. Các điểm thực tế đề cập đến địa chỉ cá nhân, do đó, không có ID địa điểm chính xác để tìm kiếm như trong trường hợp của một doanh nghiệp.Cách lấy ID địa điểm của thành phố từ Latitude/Kinh độ bằng Facebook API

Để thử nghiệm, tôi đang tìm kiếm các thị trấn của Red Feather Lakes, CO.

  • Chức năng tìm kiếm đồ thị sẽ trở lại rất nhiều nơi, nhưng không trả lại thành phố Example

  • Raw FQL không cho phép bạn tìm kiếm theo lat/long và không có khái niệm "lân cận". Example

  • Truy vấn FQL theo ID cho thấy rằng có ít nhất trường "Hiển thị văn bản phụ" cho biết đối tượng đó là thành phố. Example

Cảm ơn bạn đã được trợ giúp. Tôi có hơn 80 năm hình ảnh ngày và được gắn thẻ địa lý của bố tôi mà ông rất thích nhìn thấy trên dòng thời gian của mình!

EDIT

thành phố không nằm trong bảng place, chúng chỉ là trong bảng page. Có chức năng FQL distance() FQL không có giấy tờ, nhưng nó chỉ hoạt động trong bảng place. (. Qua this SO answer)

này hoạt động:

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

Nhưng điều này mang lại một lỗi "khoảng cách không hợp lệ trong trang bảng":

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

Tuyệt vời! Tốt tìm. – DMCS

Trả lời

4

Đó là một hack vinh quang, nhưng công trình mã này . Bí quyết là tạo hai truy vấn. Đầu tiên chúng ta tìm kiếm các địa điểm gần điểm của chúng tôi. Điều này trả về rất nhiều địa điểm kinh doanh. Sau đó, chúng tôi lấy thành phố của một trong những địa điểm này và sử dụng bảng này để xem bảng page cho trang của thành phố đó. Dường như có một quy ước đặt tên chuẩn cho các thành phố, nhưng khác với các thành phố của Hoa Kỳ và không phải của Hoa Kỳ.

Một số thành phố nhỏ có cách viết khác nhau trong bảng place, do đó, mã lặp qua các địa điểm được trả lại cho đến khi nó tìm thấy kết quả phù hợp trong bảng 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

Tôi tìm thấy giải pháp này làm việc cho tôi khi tìm kiếm một trang cho thành phố gần nhất với vĩ độ/kinh độ được chỉ định. Vì lý do nào đó, LIMIT 1 không trả lại thành phố gần nhất nên tôi đã tăng giới hạn và sau đó lấy kết quả đầu tiên.

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

Nó làm việc cho tôi! cám ơn ! – Tricote

Các vấn đề liên quan