English Click this button for the international website

COVID-19 CORONA Data opvragen met PHP

COVID-19 CORONA Data opvragen is eenvoudig met php en cURL. In het vorige artikel kun je lezen hoe je de data van de Coronavirus Disease (COVID-19) GIS Hub REST API kunt ophalen met een ESP32 microcontroller en een sketch, geprogrammeerd in de Arduino IDE. Op verzoek van een aantal lezers volgt er nu een eenvoudig voorbeeld hoe je hetzelfde kunt doen met de programmeertaal PHP. Op deze manier kun je dan de data gebruiken in bijvoorbeeld een website of app.

Coronavirus COVID-19 Global Cases
Coronavirus COVID-19 Global Cases

COVID-19 GIS Hub REST API

Ook deze keer gaan we de gegevens ophalen uit de Coronavirus Disease GIS Hub REST API. Je kunt daar de data in JSON-formaat opvragen. Door middel van de API-Explorer op die website kun je gemakkelijk de juiste query-URL samenstellen.

COVID-19 CORONA Data opvragen met PHP - REST API Query-URL
COVID-19 CORONA Data opvragen met PHP – REST API Query-URL

We kiezen de volgende instellingen:

  • Voor “Country_Region” kies bijvoorbeeld “Indonesia”
  • Bij “Uit velden” vink je alleen “Last_Update”,”Confirmed”, “Deaths”, “Recovered” aan
  • Onder “Uitvoeropties” zet je “Geometrie opvragen” op “False” (en de rest ook)

Rechtsboven zie dan de verkregen query-URL:

https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?where=UPPER(Country_Region)%20like%20%27%25INDONESIA%25%27&outFields=Last_Update,Recovered,Deaths,Confirmed&returnGeometry=false&outSR=4326&f=json

Klik op “Nu proberen” om de instellingen te testen, je ziet dan ongeveer de volgende JSON-code:

{
   "objectIdFieldName": "OBJECTID",
   "uniqueIdField": {
      "name": "OBJECTID",
      "isSystemMaintained": true
   },
   "globalIdFieldName": "",
   "geometryType": "esriGeometryPoint",
   "spatialReference": {
      "wkid": 4326,
      "latestWkid": 4326
   },
   "fields": [
      {
         "name": "Last_Update",
         "type": "esriFieldTypeDate",
         "alias": "Last Update",
         "sqlType": "sqlTypeOther",
         "length": 8,
         "domain": null,
         "defaultValue": null
      },
      {
         "name": "Recovered",
         "type": "esriFieldTypeInteger",
         "alias": "Recovered",
         "sqlType": "sqlTypeOther",
         "domain": null,
         "defaultValue": null
      },
      {
         "name": "Deaths",
         "type": "esriFieldTypeInteger",
         "alias": "Deaths",
         "sqlType": "sqlTypeOther",
         "domain": null,
         "defaultValue": null
      },
      {
         "name": "Confirmed",
         "type": "esriFieldTypeInteger",
         "alias": "Confirmed",
         "sqlType": "sqlTypeOther",
         "domain": null,
         "defaultValue": null
      }
   ],
   "features": [
      {
         "attributes": {
            "Last_Update": 1584528782000,
            "Recovered": 11,
            "Deaths": 19,
            "Confirmed": 227
         }
      }
   ]
}

Deze URL gaan we hieronder in de PHP-code plakken.

PHP Code: JSON data opvragen

Om een API request te kunnen doen heeft PHP de cURL uitbreiding (“Client URL Library”) nodig. Onderstaand PHP-fragment laat zien hoe je met cURL de JSON-data uit de REST API kunt ophalen.

  • de hierboven verkregen URL wordt aan de variabele $url toegewezen
  • dan wordt met curl_exec de API aangesproken
  • de verkregen JSON-string komt dan in de variabele $response terecht
  • daarna wordt met json_decode de JSON-string naar een PHP-variabele omgezet en aan $result toegewezen
  • als laatste wordt de inhoud van $result afgedrukt met behulp van var_dump()
<?php

$url = "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?where=UPPER(Country_Region)%20like%20%27%25INDONESIA%25%27&outFields=Last_Update,Recovered,Deaths,Confirmed&returnGeometry=false&outSR=4326&f=json";

$client = curl_init($url);
curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($client);

$result = json_decode($response);

echo"<pre>";
var_dump($result);
echo"</pre>";

?>

Het resultaat is het onderstaande object:

object(stdClass)#1 (7) {
  ["objectIdFieldName"]=>
  string(8) "OBJECTID"
  ["uniqueIdField"]=>
  object(stdClass)#2 (2) {
    ["name"]=>
    string(8) "OBJECTID"
    ["isSystemMaintained"]=>
    bool(true)
  }
  ["globalIdFieldName"]=>
  string(0) ""
  ["geometryType"]=>
  string(17) "esriGeometryPoint"
  ["spatialReference"]=>
  object(stdClass)#3 (2) {
    ["wkid"]=>
    int(4326)
    ["latestWkid"]=>
    int(4326)
  }
  ["fields"]=>
  array(4) {
    [0]=>
    object(stdClass)#4 (7) {
      ["name"]=>
      string(11) "Last_Update"
      ["type"]=>
      string(17) "esriFieldTypeDate"
      ["alias"]=>
      string(11) "Last Update"
      ["sqlType"]=>
      string(12) "sqlTypeOther"
      ["length"]=>
      int(8)
      ["domain"]=>
      NULL
      ["defaultValue"]=>
      NULL
    }
    [1]=>
    object(stdClass)#5 (6) {
      ["name"]=>
      string(9) "Recovered"
      ["type"]=>
      string(20) "esriFieldTypeInteger"
      ["alias"]=>
      string(9) "Recovered"
      ["sqlType"]=>
      string(12) "sqlTypeOther"
      ["domain"]=>
      NULL
      ["defaultValue"]=>
      NULL
    }
    [2]=>
    object(stdClass)#6 (6) {
      ["name"]=>
      string(6) "Deaths"
      ["type"]=>
      string(20) "esriFieldTypeInteger"
      ["alias"]=>
      string(6) "Deaths"
      ["sqlType"]=>
      string(12) "sqlTypeOther"
      ["domain"]=>
      NULL
      ["defaultValue"]=>
      NULL
    }
    [3]=>
    object(stdClass)#7 (6) {
      ["name"]=>
      string(9) "Confirmed"
      ["type"]=>
      string(20) "esriFieldTypeInteger"
      ["alias"]=>
      string(9) "Confirmed"
      ["sqlType"]=>
      string(12) "sqlTypeOther"
      ["domain"]=>
      NULL
      ["defaultValue"]=>
      NULL
    }
  }
  ["features"]=>
  array(1) {
    [0]=>
    object(stdClass)#9 (1) {
      ["attributes"]=>
      object(stdClass)#8 (4) {
        ["Last_Update"]=>
        int(1584528782000)
        ["Recovered"]=>
        int(11)
        ["Deaths"]=>
        int(19)
        ["Confirmed"]=>
        int(227)
      }
    }
  }
}

De gegevens die we zoeken zit in het laatste stuk data:

  ["features"]=>
  array(1) {
    [0]=>
    object(stdClass)#9 (1) {
      ["attributes"]=>
      object(stdClass)#8 (4) {
        ["Last_Update"]=>
        int(1584528782000)
        ["Recovered"]=>
        int(11)
        ["Deaths"]=>
        int(19)
        ["Confirmed"]=>
        int(227)
      }
    }
  }

Met de onderstaande code halen we de gewenste gegevens uit het object:

$Confirmed = $result->features[0]->attributes->Confirmed;

$Deaths = $result->features[0]->attributes->Deaths;

$Recovered = $result->features[0]->attributes->Recovered;

De (Epoch) timestamp moeten we nog even omzetten naar een leesbare datum en tijd:

$unix_timestamp = $result->features[0]->attributes->Last_Update;

$Last_Update = date("l d F Y, H:i:s", substr($unix_timestamp, 0, 10));

Het codevoorbeeld is ook beschikbaar op GitHub.

Als we alle bovenstaande code samenvoegen dan is de onderstaande code het resultaat:

<?php

$url = "https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?where=UPPER(Country_Region)%20like%20%27%25INDONESIA%25%27&outFields=Last_Update,Recovered,Deaths,Confirmed&returnGeometry=false&outSR=4326&f=json";

$client = curl_init($url);
curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($client);

$result = json_decode($response);

$Confirmed = $result->features[0]->attributes->Confirmed;
$Deaths = $result->features[0]->attributes->Deaths;
$Recovered = $result->features[0]->attributes->Recovered;

$unix_timestamp = $result->features[0]->attributes->Last_Update;
$Last_Update = date("l d F Y, H:i:s", substr($unix_timestamp, 0, 10)); // 13 digit epoch time to date conversion

echo"Confirmed: ".$Confirmed;
echo"<br>";
echo"Deaths: ".$Deaths;
echo"<br>";
echo"Revocered: ".$Recovered;
echo"<br>";
echo"Last Update: ".$Last_Update;

?>

De uitvoer van die de code is dan als onderstaande tekst:

Confirmed: 227
Deaths: 19
Revocered: 11
Last Update: Wednesday 18 March 2020, 11:53:02

COVID-19 CORONA Data opvragen met PHP: jouw project

Zoals met de meeste artikelen op dit blog is deze informatie slechts een aanzet voor het maken van je eigen project. Heb je zelf iets moois gemaakt, laat het dan vooral weten in de commentaren onder deze blog!

COVID-19 CORONA Data opvragen: Kawal Corona

Op verzoek heb ik een voorbeeld gemaakt voor de API op KAWAL CORONA, een website van Ethical Hacker Indonesia. Het codevoorbeeld is ook beschikbaar op GitHub.

<?php

$url = "https://api.kawalcorona.com/indonesia/";

$client = curl_init($url);
curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($client);

$result = json_decode($response);

$Confirmed = $result[0]->positif;

$Deaths = $result[0]->meninggal;

$Recovered = $result[0]->sembuh;

$datetimeString = $result[1]->lastupdate;
$Last_Update = date("l d F Y, H:i:s", strtotime($datetimeString));

echo "Confirmed: ".$Confirmed;
echo "<br>";
echo "Deaths: ".$Deaths;
echo "<br>";
echo "Recovered: ".$Recovered;
echo "<br>";
echo "Last Update: ".$Last_Update;

?>
kawalcorona.com
kawalcorona.com

Wereldwijde totalen

Wederom op verzoek heb ik uitgezocht hoe je de totalen kunt opvragen. Met de API-verkenner kun je alleen statistieken per land of regio opvragen. De wereldwijde totalen opvragen vergt daardoor enige creativiteit.

De kaart op Coronavirus COVID-19 Global Cases toont wel de totalen, maar als je de XHR-requests probeert die daar voor gebruikt worden dan loop je tegen 403-errors aan. Echter, door de hosts die de API-explorer aangeeft te combineren met de queries die de Global Cases-kaart gebruikt lukt het wel. Dat levert dan de volgende URLs op:

Wereldwijde aantal besmettingen:

https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true

Wereldwijd overleden:

https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true

Weredwijd genezen:

https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true

Php code voorbeeld:

<?php

$confirmed = getData("https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Confirmed%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true");

$deaths = getData("https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Deaths%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true");

$recovered = getData("https://services1.arcgis.com/0MSEUqKaxRlEPj5g/arcgis/rest/services/Coronavirus_2019_nCoV_Cases/FeatureServer/1/query?f=json&where=1%3D1&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22Recovered%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&cacheHint=true");

echo"Confirmed: ".$confirmed->features[0]->attributes->value;
echo"<br>";
echo"Deaths: ".$deaths->features[0]->attributes->value;
echo"<br>";
echo"Recovered: ".$recovered->features[0]->attributes->value;

function getData($url){

   $client = curl_init($url);
   curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
   $response = curl_exec($client);

   return json_decode($response);
};

?>

 

Voeg een reactie toe

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *