function getAndParseWikipediaPOI($language, $user_latitude, $user_longitude, $range, $maxPOI, $thumbnailWidth)
{
    // ===> Apply limits of Wikipedia API
    $range = min($range, 10);
    $maxPOI = min($maxPOI, 500);
    // ===> Call Wikipedia GeoSearch API to get pages around
    $apidata_request_geosearch = "https://" . $language . ".wikipedia.org/w/api.php?action=query&list=geosearch&gslimit=" . $maxPOI . "&gsradius=" . $range * 1000 . "&gscoord=" . $user_latitude . "|" . $user_longitude . "&format=json";
    if (!($apidata_json_geosearch = @file_get_contents($apidata_request_geosearch))) {
        return array("error" => "Wikipedia API is unreachable");
    }
    // ===> Case there is no POI around at all
    if (!($apidata_array_geosearch = @json_decode($apidata_json_geosearch, true)['query']['geosearch'])) {
        return array();
    }
    $wikipedia_pagesid_list = "";
    // ===> Parse those data in the output array
    foreach ($apidata_array_geosearch as $currentPOI => $currentPOIdata) {
        $wikipedia_pagesid_list .= '|' . $currentPOIdata['pageid'];
        $output_array[$currentPOIdata['pageid']]['id'] = $currentPOIdata['pageid'];
        $output_array[$currentPOIdata['pageid']]['name'] = $apidata_array_geosearch[$currentPOI]['title'];
        $output_array[$currentPOIdata['pageid']]['latitude'] = $apidata_array_geosearch[$currentPOI]['lat'];
        $output_array[$currentPOIdata['pageid']]['longitude'] = $apidata_array_geosearch[$currentPOI]['lon'];
        $output_array[$currentPOIdata['pageid']]['distance'] = $apidata_array_geosearch[$currentPOI]['dist'];
    }
    $wikipedia_pagesid_list = substr($wikipedia_pagesid_list, 1);
    // ===> Now we got a list of wikipedia pages so we call Wikipedia API again to get infos on those pages
    $apidata_request_wikipedia_info = "https://" . $language . ".wikipedia.org/w/api.php?format=json&action=query&prop=pageprops|info|pageimages&inprop=url&pilimit=1000&pithumbsize=" . $thumbnailWidth . "&pageids=" . $wikipedia_pagesid_list;
    if (!($apidata_json_wikipedia_info = @file_get_contents($apidata_request_wikipedia_info))) {
        return array("error" => "Wikipedia API is unreachable");
    }
    $apidata_array_wikipedia_info = json_decode($apidata_json_wikipedia_info, true);
    // ===> Parse wikipedia return
    $images_id_list = "";
    foreach ($apidata_array_wikipedia_info['query']['pages'] as $currentPOI => $currentPOIdata) {
        $output_array[$currentPOI]['name'] = $apidata_array_wikipedia_info['query']['pages'][$currentPOI]["title"];
        $output_array[$currentPOI]['sitelink'] = $apidata_array_wikipedia_info['query']['pages'][$currentPOI]["fullurl"];
        $output_array[$currentPOI]['wikidata_id'] = $apidata_array_wikipedia_info['query']['pages'][$currentPOI]["pageprops"]["wikibase_item"];
        // We put an @ because it can be null
        $output_array[$currentPOI]['image_url'] = @$apidata_array_wikipedia_info['query']['pages'][$currentPOI]["thumbnail"]["source"];
        // And for each wikipedia POI, we add the URL to the list of links we're going to call for wikidata's info
        $CURL_input_list[$currentPOI] = 'https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&property=P31&entity=' . $output_array[$currentPOI]['wikidata_id'];
    }
    $type_id_list = "";
    // ===> Make the API call to Wikidata using multiple requests in the same time with CURL and parse the result
    $CURL_return = reqMultiCurls($CURL_input_list);
    foreach ($output_array as $currentPOI => $currentPOIdata) {
        // We put an @ because it can be null
        $output_array[$currentPOI]['type_id'] = @$CURL_return[$currentPOI]['claims']['P31'][0]['mainsnak']['datavalue']['value']['numeric-id'];
        // And in the case it's NOT null, we add it in the list of type names to fetch
        if ($output_array[$currentPOI]['type_id'] != NULL) {
            $type_id_list .= '|Q' . $output_array[$currentPOI]['type_id'];
        }
    }
    $type_id_list = substr($type_id_list, 1);
    // ===> Call WikiData to get type_name using the type_id (church, metro station, etc.)
    $apidata_request_wikidata_type_name = 'https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&props=labels&languages=' . $language . '&ids=' . $type_id_list;
    if (!($apidata_json_wikidata_type_name = @file_get_contents($apidata_request_wikidata_type_name))) {
        return array("error" => "Wikidata API is unreachable");
    }
    $apidata_array_wikidata_type_name = json_decode($apidata_json_wikidata_type_name, true);
    // ===> Putting those type_name in the output array
    foreach ($output_array as $currentPOI => $currentPOIdata) {
        $output_array[$currentPOI]['type_name'] = @$apidata_array_wikidata_type_name['entities']['Q' . $output_array[$currentPOI]['type_id']]['labels'][$language]['value'];
    }
    return array_values($output_array);
}
示例#2
0
 $name = $temp_description_array["entities"]["Q" . $poi_id_array_clean["{$i}"]]["labels"]["{$language}"]["value"];
 //==> Get sitelink
 $temp_sitelink_array_json = $curl_return[3];
 if ($temp_sitelink_array_json == FALSE) {
     $error = "API Wikidata isn't responding on request 4.";
     break;
 }
 $temp_sitelink_array = json_decode($temp_sitelink_array_json, true);
 $temp_sitelink = $temp_sitelink_array["entities"]["Q" . $poi_id_array_clean["{$i}"]]["sitelinks"][$language . "wiki"]["url"];
 //=============> Now we make a second call to fetch images and types' titles
 //==> With the sitelink, we make the image's url
 $temp_url_explode = explode("/", $temp_sitelink);
 $temp_url_end = $temp_url_explode[count($temp_url_explode) - 1];
 //==> Calling APIs
 $URL_list = array("https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids=Q" . $temp_poi_type_id . "&props=labels&languages={$language}", "https://" . $language . ".wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&pithumbsize=" . $thumbnailWidth . "&pilimit=1&titles=" . $temp_url_end);
 $curl_return = reqMultiCurls($URL_list);
 //==> Get type
 $temp_description_type_array_json = $curl_return[0];
 if ($temp_description_type_array_json == FALSE) {
     $error = "API Wikidata isn't responding on request 5.";
     break;
 }
 $temp_description_type_array = json_decode($temp_description_type_array_json, true);
 $type_name = $temp_description_type_array["entities"]["Q" . $temp_poi_type_id]["labels"]["{$language}"]["value"];
 //==> Get image
 $temp_image_json = $curl_return[1];
 if ($temp_image_json == FALSE) {
     $error = "API Wikidata isn't responding on request 6.";
     break;
 }
 //We put an @ because it can be null (case there is no image for this article)