Files
dev-chiefworks 47f4fad75c Added Other AP
2022-04-26 11:30:34 -04:00

105 lines
3.7 KiB
PHP

<?php
class Geofence {
public static function getAnchor($db, $lat, $lng) {
error_log("Geofence::getAnchor(\$db, $lat, $lng)");
$limit_lat = (float)$lat;
$limit_lng = (float)$lng;
// Step 0: Find out city
$city_id = 2; // 1096; // TODO!!!!!!!!!!!
// Step 1: Find out area
$q = "SELECT * FROM geofence_area WHERE city_id=${city_id}";
$r = pg_query($db, $q);
if (!$r || pg_num_rows($r)<1) {
// TODO: load closest city address
return [NULL, "This city has no areas available"];
}
$area = NULL;
while ($f=pg_fetch_assoc($r)) {
// TODO: Remember area coordinates
// TODO: Calculate distance to area coordinates
if ($f["type"]=='polygon') {
$data = json_decode($f["boundaries"],true);
if (is_array($data) && array_key_exists('polygon',$data) && is_array($data["polygon"]) && count($data["polygon"])>0) {
$polygon = $data["polygon"];
$polygonCoords = [];
foreach ($polygon as $coord) {
$polygonCoords[] = "$coord[0] $coord[1]";
}
$polygonCoordsString = implode(",", $polygonCoords);
$q = "SELECT ST_Contains(ST_GeomFromText('POLYGON((${polygonCoordsString}))', 4326), ST_SetSRID(ST_Point (" . $lng . ", " . $lat . "), 4326)) as iscorrect";
$i = pg_query($db, $q);
if ($i && pg_num_rows($i) && $j = pg_fetch_assoc($i)) {
if ($j["iscorrect"] == 't') {
$area = $f;
break;
} // Is not within the polygon
} // Polyfon data processing failed
} // Polygon data is missing
} // Not polygon
}
// Step 2: Find out anchor
if (is_array($area) && array_key_exists('id',$area) && $area["id"]>0) {
$q = "SELECT a.title,b.*,ST_DistanceSphere(b.geometry::geometry, ST_SetSRID(ST_MakePoint(" . $lng . ", " . $lat . "),4326)) AS distance ";
$q.= " FROM geofence_area_anchor a, address b WHERE a.geofence_area_id=" . $area["id"] . " AND b.id=a.address_id";
$r = pg_query($db, $q);
if (!$r || pg_num_rows($r)<1) {
// TODO: other?
return [NULL, "Geofence area has no anchors"];
}
$distance = PHP_INT_MAX;
$address = NULL;
while ($f=pg_fetch_assoc($r)) {
// TODOL We might need direction or another parameter
if ($distance>$f["distance"]) {
$distance = $f["distance"];
$address = $f;
}
}
if (is_array($address) && array_key_exists('address',$address) && $address["address"]!="") {
return [$address, NULL];
}
}
// No area, try GPS coordinates?
return [NULL, "Anchor address not found"];
}
public function youVsOthersOnCategory($db, $gpsdb, $data) {
error_log('Compare::youVsOthersOnCategory($db, $gpsdb, $data) ');
$db_country = pg_escape_string($data['country']); // is not used for now...
$db_address = pg_escape_string($data['address']);
$member_id = (int)$data['member_id'];
$category = $data['category']; // see ByCategory::CATEGORIES
$days = (int)$data['days'];
//$member_id = 3; // DEBUG
if ($member_id<1) {
error_log("Invalid member_id='${member_id}'");
return NULL;
}
if ($category=='' || !array_key_exists($category,ByCategory::CATEGORIES)
|| ByCategory::CATEGORIES[$category]!=1) {
error_log("Invalid category='${category}'");
return NULL;
}
if ($days<7) $daya = 7;
$you = ByCategory::andMemberIdForDaysTotal($db, $category, $member_id, $days);
$avg = ByCategory::averageForDaysTotal($db, $category, $member_id, $days);
return [
"member_id" => $member_id,
"category" => $category,
"days" => $days,
"you" => $you,
"average" => $avg,
"compare" => self::compareYouVsAverage($you,$avg)
];
}
}
// vi:ts=2