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); }
$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)