Merge branch 'master' of https://git.vvvvvvaria.org/then/opencoil-paracity
This commit is contained in:
commit
0bd6e64a1a
230
website/curl.php
230
website/curl.php
@ -3,57 +3,143 @@
|
|||||||
// The api key from Scooty's app/account: iPtAHWdOVLEtgkaymXoMHVVg
|
// The api key from Scooty's app/account: iPtAHWdOVLEtgkaymXoMHVVg
|
||||||
// Below is the static html to generate the map, it can also be done more dynamically using https://github.com/LuminFire/leaflet-php but that might be overkill
|
// Below is the static html to generate the map, it can also be done more dynamically using https://github.com/LuminFire/leaflet-php but that might be overkill
|
||||||
|
|
||||||
|
//debugging, enable all error reporting
|
||||||
|
// ini_set('display_errors', 1);
|
||||||
|
// ini_set('display_startup_errors', 1);
|
||||||
|
// error_reporting(E_ALL);
|
||||||
|
//measure script execution time
|
||||||
|
$start_time = microtime(true);
|
||||||
|
$a=1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// array of scooters, artist, title, description
|
||||||
|
global $scooters;
|
||||||
|
|
||||||
// array of scooters
|
|
||||||
$scooters = array(
|
$scooters = array(
|
||||||
//'https://platform.tier-services.io/v1/vehicle/fbd739d6-554f-4eaf-bd9c-afe3d501c94b',
|
array('https://opencoil.show/test-json.php?scooterID=1', 'artist name 0', 'title 0', 'desciption 0' ),
|
||||||
'https://opencoil.show/test-json.php?scooterID=1',
|
array('https://opencoil.show/test-json.php?scooterID=2', 'artist name 1', 'title 1', 'desciption 1' ),
|
||||||
'https://opencoil.show/test-json.php?scooterID=2'
|
array('https://opencoil.show/test-json.php?scooterID=3', 'artist name 2', 'title 2', 'desciption 2' ),
|
||||||
|
//array('https://platform.tier-services.io/v1/vehicle/fbd739d6-554f-4eaf-bd9c-afe3d501c94b', 'artist name 1', 'title', 'desciption'),
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
//make it like this
|
|
||||||
//$scooters = array(
|
|
||||||
|
|
||||||
//'https://opencoil.show/test-json.php?scooterID=1', name of artist, title, desc
|
|
||||||
|
|
||||||
//);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// for each scooter in array get the json (TODO, for each, safe to file/database?)
|
|
||||||
$getJSON = callAPI($scooters[0]);
|
// for each scooter in array get the json (TODO, for each, safe to file/database?) $scooters is a multidimensional array: $scooter[0][0] = the first data (api url) of the first scooter, $scooter[1][0] = the first data (api url) of the second scooter, $scooter[0][1] = the artist name of the first scooter etcetc.
|
||||||
|
|
||||||
|
//$id = 0; //get the first scooter for now
|
||||||
|
|
||||||
|
|
||||||
// decode JSON data to PHP associative array
|
function saveLatestJSON(){
|
||||||
$arr = json_decode($getJSON, true);
|
global $scooters; //"import" the global variable into the function's scope
|
||||||
// access values from the associative array
|
|
||||||
$lat = $arr["data"]["attributes"]["lat"]; // get lattitude
|
//TODO if latestData.json = older than ..2 minutes...call the API again
|
||||||
$lng = $arr["data"]["attributes"]["lng"]; // get longitude
|
$id = 0; //start id
|
||||||
$lst = $arr["data"]["attributes"]["lastLocationUpdate"]; // get time of last position
|
foreach($scooters as $item) {
|
||||||
$rnt = $arr["data"]["attributes"]["isRentable"]; // check if scooter is rentable,
|
$getJSON = callAPI($scooters[$id][0]); //abstract callAPI for neater reuse
|
||||||
$act = $arr["data"]["attributes"]["state"]; // check if scooter is ACTIVE or MAINTAINANCE
|
// GET RID OF JSON DECODE!
|
||||||
|
$arr = json_decode($getJSON, true); // decode JSON data to PHP associative array
|
||||||
|
// access values from the associative array
|
||||||
|
$lat = $arr["data"]["attributes"]["lat"]; // get lattitude
|
||||||
|
$lng = $arr["data"]["attributes"]["lng"]; // get longitude
|
||||||
|
$pos = $lat.', '.$lng; // construct lat/lon for use in leafet
|
||||||
|
$lst = $arr["data"]["attributes"]["lastLocationUpdate"]; // get time of last position
|
||||||
|
$rnt = $arr["data"]["attributes"]["isRentable"]; // check if scooter is rentable,
|
||||||
|
$act = $arr["data"]["attributes"]["state"]; // check if scooter is ACTIVE or MAINTAINANCE
|
||||||
|
// access values from the multidimensional $scooters array
|
||||||
|
$nam = $scooters[$id][1]; // get the artist name
|
||||||
|
$tit = $scooters[$id][2]; // get the works title
|
||||||
|
$des = $scooters[$id][3]; // get the works description
|
||||||
|
|
||||||
|
//construct json with latest data
|
||||||
|
$latestData[] = array( "ID" => $id,
|
||||||
|
"lastPos" => $pos,
|
||||||
|
"lastLocationUpdate" => $lst,
|
||||||
|
"isRentable" => $rnt,
|
||||||
|
"state" => $act,
|
||||||
|
"name" => $nam,
|
||||||
|
"title" => $tit,
|
||||||
|
"desc" => $des);
|
||||||
|
$id++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $latestData; //return array
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// THIS ONLY NEEDS TO RUN EVERY 1 or 2 minutes, possibly in the background, als this should construct historical json as per tom martins post here: https://stackoverflow.com/questions/7895335/append-data-to-a-json-file-with-php/7895384
|
||||||
|
$arrayToEcho = saveLatestJSON();
|
||||||
|
$latestData = json_encode($arrayToEcho, JSON_FORCE_OBJECT); // force object accepts 0 as a key for the array and not NULL
|
||||||
|
|
||||||
|
$file = './latestData.json';
|
||||||
|
file_put_contents($file, $latestData, LOCK_EX);
|
||||||
|
|
||||||
|
|
||||||
|
//TODO make historical json file..
|
||||||
|
//see: https://stackoverflow.com/questions/7895335/append-data-to-a-json-file-with-php/7895384
|
||||||
|
//add something like:
|
||||||
|
// $inp = file_get_contents('./latestData.json');
|
||||||
|
// $tempArray = json_decode($inp);
|
||||||
|
// $tempArray[] .= $latestData;
|
||||||
|
// $jsonData = json_encode($tempArray);
|
||||||
|
// file_put_contents('./latestData.json', $jsonData);
|
||||||
|
|
||||||
|
|
||||||
|
function makeMarker(int $id){ // generate appropriate markers based on latest JSON
|
||||||
|
|
||||||
|
$readJSON = file_get_contents('./latestData.json'); //read latest data
|
||||||
|
$arr = json_decode($readJSON, true);
|
||||||
|
|
||||||
|
$pos = $arr[$id]["lastPos"]; // get last known position
|
||||||
|
$lst = $arr[$id]["lastLocationUpdate"]; // get time of last position
|
||||||
|
$rnt = $arr[$id]["isRentable"]; // check if scooter is rentable,
|
||||||
|
$act = $arr[$id]["state"]; // check if scooter is ACTIVE or MAINTAINANCE
|
||||||
|
// access values from the multidimensional $scooters array
|
||||||
|
$nam = $arr[$id]["name"]; // get the artist name
|
||||||
|
$tit = $arr[$id]["title"]; // get the works title
|
||||||
|
$des = $arr[$id]["desc"]; // get the works description
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//check scooter status and construct marker with corresponding icon
|
||||||
|
|
||||||
|
//check if scooter is rentable
|
||||||
|
if($rnt == true && $act === 'ACTIVE'){
|
||||||
|
$marker = 'var scooter'.$id.' = L.marker(['.$pos.'], {time: "'.$lst.'"}).addTo(map)
|
||||||
|
.bindPopup("<b>'.$tit.'</b><br>'.$des.'<br>Last updated: '.$lst.'<br>Status: Rentable, Gallery Offline")
|
||||||
|
.bindTooltip("'.$nam.'").setIcon(availableIcon);';
|
||||||
|
|
||||||
|
} elseif ($rnt == false && $act === 'ACTIVE') {
|
||||||
|
$marker = 'var scooter'.$id.' = L.marker(['.$pos.'], {time: "'.$lst.'"}).addTo(map)
|
||||||
|
.bindPopup("<b>'.$tit.'</b><br>'.$des.'<br>Last updated: '.$lst.'<br>Status: Rented Out, Gallery Online")
|
||||||
|
.bindTooltip("'.$nam.'").setIcon(isRentedIcon);';
|
||||||
|
|
||||||
|
};
|
||||||
|
//check if scooter is in maintenace
|
||||||
|
if($act !== "ACTIVE"){
|
||||||
|
$marker = 'var scooter'.$id.' = L.marker(['.$pos.'], {time: "'.$lst.'"}).addTo(map)
|
||||||
|
.bindPopup("<b>'.$tit.'</b><br>'.$des.'<br>Last updated: '.$lst.'")
|
||||||
|
.bindTooltip("'.$nam.'").setIcon(isMaintenanceIcon);';
|
||||||
|
};
|
||||||
|
|
||||||
|
return $marker;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//check if scooter is rentable
|
|
||||||
// if($rnt == true){
|
|
||||||
// echo "rentable";
|
|
||||||
// } else {
|
|
||||||
// echo "gallery not available";
|
|
||||||
// };
|
|
||||||
|
|
||||||
//check if scooter status (if ACTIVE)
|
|
||||||
// if($act === "ACTIVE"){
|
|
||||||
// echo "scooter is active";
|
|
||||||
// } else {
|
|
||||||
// echo "scooter is in repair";
|
|
||||||
// };
|
|
||||||
|
|
||||||
|
|
||||||
//// make date time file------
|
//// make date time file------
|
||||||
|
|
||||||
// construct lat/lon for use in leafet
|
|
||||||
$pos = $lat.', '.$lng;
|
|
||||||
|
|
||||||
// TODO save json to file?...mmm one big one? seperate ones, timestamped ones?
|
|
||||||
|
|
||||||
|
///..mmm one big one? seperate ones, timestamped ones?
|
||||||
// 60 second update interval
|
// 60 second update interval
|
||||||
|
|
||||||
// make timestamp file like original python one! to check for updates
|
// make timestamp file like original python one! to check for updates
|
||||||
@ -70,8 +156,9 @@ $pos = $lat.', '.$lng;
|
|||||||
// check if lastlocation is different...if update > latest file (map file..)
|
// check if lastlocation is different...if update > latest file (map file..)
|
||||||
// check if is rentable
|
// check if is rentable
|
||||||
|
|
||||||
// 2 json files: is retantable, latlong, id, status
|
// TODO make two files
|
||||||
// historical: every 60 sec needs update..even tho no state changes
|
// 1: current position and state of scooter, latlong, id, status
|
||||||
|
// 2: historical json file, contains all scooters, updated everytime php file is loaded (or every 60 sec). No state changes, only lat long and time. even if time does not change
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -81,9 +168,7 @@ function checkModified($file, $expiration){ //check if file is older than expira
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseJSON(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function callAPI($url){
|
function callAPI($url){
|
||||||
$curl = curl_init($url);
|
$curl = curl_init($url);
|
||||||
@ -105,6 +190,7 @@ function callAPI($url){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
||||||
@ -150,10 +236,10 @@ function callAPI($url){
|
|||||||
// prefix: glyphicon = bootstrap, list can be found here: https://getbootstrap.com/docs/3.3/components/
|
// prefix: glyphicon = bootstrap, list can be found here: https://getbootstrap.com/docs/3.3/components/
|
||||||
// prefix: fa = fontawesome, list is here: https://fontawesome.com/v4.7.0/cheatsheet/
|
// prefix: fa = fontawesome, list is here: https://fontawesome.com/v4.7.0/cheatsheet/
|
||||||
var availableIcon = L.AwesomeMarkers.icon(
|
var availableIcon = L.AwesomeMarkers.icon(
|
||||||
{"icon": "wifi", "iconColor": "white", "markerColor": "purple", "spin": "true", "prefix": "fa"}
|
{"icon": "wifi", "iconColor": "white", "markerColor": "purple", "prefix": "fa"}
|
||||||
);
|
);
|
||||||
var isRentedIcon = L.AwesomeMarkers.icon(
|
var isRentedIcon = L.AwesomeMarkers.icon(
|
||||||
{"icon": "hourglass-half", "iconColor": "white", "markerColor": "pink", "prefix": "fa"}
|
{"icon": "hourglass-half", "iconColor": "white", "spin": "true", "markerColor": "pink", "prefix": "fa"}
|
||||||
);
|
);
|
||||||
var isMaintenanceIcon = L.AwesomeMarkers.icon(
|
var isMaintenanceIcon = L.AwesomeMarkers.icon(
|
||||||
{"icon": "wrench", "iconColor": "white", "markerColor": "black", "prefix": "fa"}
|
{"icon": "wrench", "iconColor": "white", "markerColor": "black", "prefix": "fa"}
|
||||||
@ -171,51 +257,18 @@ function callAPI($url){
|
|||||||
});
|
});
|
||||||
map.addLayer(Stamen_Toner);
|
map.addLayer(Stamen_Toner);
|
||||||
|
|
||||||
//for each...
|
|
||||||
var scooter1 = L.marker([<?php echo $pos; ?>],
|
|
||||||
{time: "2020-10-09T08:00:29Z"},
|
|
||||||
{icon: availableIcon}).addTo(map)
|
|
||||||
.bindPopup('Last updated <?php echo $lst; ?>')
|
|
||||||
.bindTooltip('artist name')
|
|
||||||
.setIcon(availableIcon); // scooter is available
|
|
||||||
//.setIcon(isRentedIcon); // scooter is rented
|
|
||||||
//.setIcon(isMaintenanceIcon); // scooter is rented
|
|
||||||
//.openPopup();
|
|
||||||
|
|
||||||
|
//for each scooter in $scooters array, request status and construct marker
|
||||||
|
<?php
|
||||||
|
$id = 0; //start id
|
||||||
|
foreach($scooters as $item) {
|
||||||
|
|
||||||
|
// echo makeMarker($id);
|
||||||
|
echo makeMarker($id);
|
||||||
|
|
||||||
|
$id++;
|
||||||
var scooter2 = L.marker([52.508926, 13.355061],
|
}
|
||||||
{time: "2020-10-09T08:00:29Z"},
|
?>
|
||||||
{icon: availableIcon}).addTo(map)
|
|
||||||
.bindPopup('Last updated <?php echo $lst; ?>')
|
|
||||||
.bindTooltip('artist name')
|
|
||||||
//.setIcon(availableIcon); // scooter is available
|
|
||||||
.setIcon(isRentedIcon); // scooter is rented
|
|
||||||
//.setIcon(isMaintenanceIcon); // scooter is rented
|
|
||||||
//.openPopup();
|
|
||||||
|
|
||||||
|
|
||||||
var scooter3 = L.marker([52.506926, 13.348061],
|
|
||||||
{time: "2020-10-09T08:00:29Z"},
|
|
||||||
{icon: availableIcon}).addTo(map)
|
|
||||||
.bindPopup('Last updated <?php echo $lst; ?>')
|
|
||||||
.bindTooltip('artist name')
|
|
||||||
//.setIcon(availableIcon); // scooter is available
|
|
||||||
//.setIcon(isRentedIcon); // scooter is rented
|
|
||||||
.setIcon(isMaintenanceIcon); // scooter is rented
|
|
||||||
//.openPopup();
|
|
||||||
|
|
||||||
//scooter 3 different time and poss
|
|
||||||
var scooter3 = L.marker([52.509926, 13.348061],
|
|
||||||
{time: "2020-10-09T09:00:29Z"},
|
|
||||||
{icon: availableIcon}).addTo(map)
|
|
||||||
.bindPopup('Last updated <?php echo $lst; ?>')
|
|
||||||
.bindTooltip('artist name')
|
|
||||||
//.setIcon(availableIcon); // scooter is available
|
|
||||||
//.setIcon(isRentedIcon); // scooter is rented
|
|
||||||
.setIcon(isMaintenanceIcon); // scooter is rented
|
|
||||||
//.openPopup();
|
|
||||||
|
|
||||||
|
|
||||||
// time slider
|
// time slider
|
||||||
|
|
||||||
@ -226,7 +279,7 @@ function callAPI($url){
|
|||||||
|
|
||||||
// var map = marker1;
|
// var map = marker1;
|
||||||
// layerGroup = L.layerGroup([marker_e7a96a6d6b08479ba6d17d42769e5202]);
|
// layerGroup = L.layerGroup([marker_e7a96a6d6b08479ba6d17d42769e5202]);
|
||||||
layerGroup = L.layerGroup([scooter1, scooter3]);
|
layerGroup = L.layerGroup([scooter0, scooter1, scooter2]); //make this dynamic
|
||||||
var sliderControl = L.control.sliderControl({layer:layerGroup});
|
var sliderControl = L.control.sliderControl({layer:layerGroup});
|
||||||
map.addControl(sliderControl);
|
map.addControl(sliderControl);
|
||||||
sliderControl.startSlider();
|
sliderControl.startSlider();
|
||||||
@ -234,3 +287,10 @@ function callAPI($url){
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
<?php //end of measuring script execution time
|
||||||
|
//end clock time in seconds
|
||||||
|
$end_time = microtime(true);
|
||||||
|
//calculate script execution time
|
||||||
|
$execution_time = ($end_time - $start_time);
|
||||||
|
echo " Execution time of script = ".$execution_time." sec";
|
||||||
|
?>
|
1
website/latestData.json
Normal file
1
website/latestData.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"0":{"ID":0,"lastPos":"52.58619, 13.358061","lastLocationUpdate":"2020-10-09T08:00:29Z","isRentable":true,"state":"ACTIVE","name":"artist name 0","title":"title 0","desc":"desciption 0"},"1":{"ID":1,"lastPos":"52.58619, 13.358061","lastLocationUpdate":"2020-10-09T08:00:29Z","isRentable":true,"state":"ACTIVE","name":"artist name 1","title":"title 1","desc":"desciption 1"},"2":{"ID":2,"lastPos":"52.53619, 13.358061","lastLocationUpdate":"2020-10-09T08:00:29Z","isRentable":true,"state":"ACTIVE","name":"artist name 2","title":"title 2","desc":"desciption 2"}}
|
Loading…
Reference in New Issue
Block a user