/** * @return \yii\db\ActiveQuery */ public function getWeatherAlertAreas() { return $this->hasMany(WeatherAlertArea::className(), ['WeatherAlert_id' => 'id']); }
private function getAlertIdInformation($alertId) { try { if ($alertId) { $alertData = models\WeatherAlert::findOne($alertId); if (!$alertData) { throw new Exception('Record with alertId=' . $alertId . ' not found in our database'); } $WeatherAlertArea = models\WeatherAlertArea::find()->where(['WeatherAlert_id' => $alertData->id])->one(); $areaForAlertData = models\AreaDefinition::findAll(['WeatherAlertArea_id' => $WeatherAlertArea->id]); $alertCircle = new \stdClass(); $alertPolygonCoordinates = []; foreach ($areaForAlertData as $coordinates) { if ($coordinates->radius) { $alertCircle->radius = $coordinates->radius; //Radius can be only one record $alertCircle->centerLat = $coordinates->latitude; //Radius can be only one record $alertCircle->centerLon = $coordinates->longitude; //Radius can be only one record } else { $alertPolygonCoordinates[] = $coordinates->latitude . ' ' . $coordinates->longitude; } } // var_dump($alertPolygonCoordinates);die; $propertiesList = models\NRESProperty::find()->where(['status' => models\NRESProperty::STATUS_ACTIVE])->all(); $pointChecker = new PointInPolygon(); $this->_affectedProperties = []; foreach ($propertiesList as $property) { $isPropertyAffectedByAlert = false; if (isset($alertCircle->radius)) { //Checking circle coordinates if ($pointChecker->pointInsideCircle($alertCircle->centerLat, $alertCircle->centerLon, $alertCircle->radius, $property->latitude, $property->longitude)) { $isPropertyAffectedByAlert = true; } } if (!empty($alertPolygonCoordinates)) { if ($pointChecker->pointInPolygon($property->latitude . ' ' . $property->longitude, $alertPolygonCoordinates) !== "outside") { $isPropertyAffectedByAlert = true; } } if ($isPropertyAffectedByAlert) { $this->_affectedProperties[] = $property; } } if (!$this->_affectedProperties) { throw new Exception("There are no properties affected by this Alert. Nothing to export"); } return $alertData; } else { throw new Exception('Please choose Alert that you want to export'); } } catch (\Exception $e) { echo json_encode(['error' => $e->getMessage()]); } Yii::$app->end(); }
public function insertNewLSRRecords($records) { foreach ($records['alerts'] as $record) { if (in_array(strtolower($record['event']), $this->filterEventType)) { $weatherAlertsModel = new models\WeatherAlert(); switch (strtolower($record['event'])) { case 'hurricane': $weatherAlertsModel->event = 0; break; case 'tornado': $weatherAlertsModel->event = 1; break; default: $weatherAlertsModel->event = 2; break; } $weatherAlertsModel->status = models\WeatherAlert::STATUS_ACTUAL; $weatherAlertsModel->type = 1; $weatherAlertsModel->magnitude = $record['magnitude']; $weatherAlertsModel->magnitudeUnit = $record['magnitudeUnit']; //We need to display date in needed format $newTime = substr_replace($record['time'], ':', 2, 0); // $newDate = str_replace('/', '-', $record['date']); $dateforConvertionArray = explode('/', $record['date']); $finalDateTime = $dateforConvertionArray[2] . '-' . $dateforConvertionArray[0] . '-' . $dateforConvertionArray[1] . 'T' . date("H:i:s", strtotime($newTime)); $weatherAlertsModel->date = DateTimeHelper::createUnixtimeFromDate($finalDateTime); $weatherAlertsModel->save(); $weatherAlertAreaModel = new models\WeatherAlertArea(); $weatherAlertAreaModel->WeatherAlert_id = $weatherAlertsModel->id; $weatherAlertAreaModel->save(); $areaDefinitionModel = new models\AreaDefinition(); $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id; $areaDefinitionModel->latitude = $record['latitude']; $areaDefinitionModel->longitude = $record['longitude']; $areaDefinitionModel->save(); $this->insertedAlerts++; $this->consoleLog('One alert entry added (ID: ' . $weatherAlertsModel->id . ')'); } else { $this->ignoredAlerts++; $this->consoleLog('One alert entry skipped (Filtered by event type)'); } } }
public function parseAtomFeed() { $url = Yii::$app->params['AtomFeedParser']['url']; $startTime = time(); $needToUpdateCAP = false; try { $atomGeneralInformation = Yii::$app->CAPParser->getAtomGeneralContent($url); $atomEntriesContent = Yii::$app->CAPParser->getEntriesContent($url); if (!isset($atomGeneralInformation['updated']) || !isset($atomGeneralInformation['id'])) { throw new Exception("Can't parse AtomFeed file by given URL"); } $processedFeedsModel = new models\ProcessedATOMFeeds(); $processedFeedsModelSearch = new models\ProcessedATOMFeedsSearch(); $atomRecordInDb = $processedFeedsModelSearch->findOne(['feedURL' => $atomGeneralInformation['id']]); if (!$atomRecordInDb) { //We don't have records at all for this file $processedFeedsModel->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']); $processedFeedsModel->feedURL = $atomGeneralInformation['id']; $processedFeedsModel->save(); $this->consoleLog('Added ProcessedATOMFeeds Record, id - ' . $processedFeedsModel->feedURL . ', updated - ' . helpers\DateTimeHelper::createDateFromUnixtime($processedFeedsModel->updated) . '(' . $atomGeneralInformation['updated'] . ')'); $needToUpdateCAP = true; } else { if ($atomRecordInDb->updated != helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) { $this->consoleLog('We need to update records in WeatherAlert and WeatherAlertArea tables.Updated time in the database -' . helpers\DateTimeHelper::createDateFromUnixtime($atomRecordInDb->updated) . ', from file - ' . $atomGeneralInformation['updated'] . ' (' . helpers\DateTimeHelper::createDateFromUnixtime(helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) . ')'); $atomRecordInDb->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']); $atomRecordInDb->save(); $needToUpdateCAP = true; } } if (!$needToUpdateCAP) { $this->consoleLog('We DON\'T need to update records in WeatherAlert and WeatherAlertArea tables.'); } if ($needToUpdateCAP) { //change 1 to $needToUpdateCAP foreach ($atomEntriesContent['entries'] as $entry) { $entryContent = $this->_getCapAreaInformationInDatabse($entry); if ($entryContent) { // Now we try to find this alert and check if we have it already in our database $alertModel = models\WeatherAlert::find()->where(['identifier' => $entryContent['identifier'], 'date' => helpers\DateTimeHelper::createUnixtimeFromDate($entryContent['date'])])->one(); if (!$alertModel) { $alertModel = new models\WeatherAlert(); } else { $this->skippedAlertsCount++; $this->consoleLog('One alert entry skipped (Information about this alert is actual in our database, ID = ' . $alertModel->id . ')'); continue; } $alertModel->attributes = $entryContent; $alertModel->date = helpers\DateTimeHelper::createUnixtimeFromDate($alertModel->date); $alertModel->save(); $this->consoleLog('One alert entry added (ID: ' . $alertModel->id . ')'); $this->addedAlertsCount++; if ($alertModel->updates) { //WE need to change status of old alert //TODO: this part of code should be checked on real data $alertModel = models\WeatherAlert::find()->where(['identifier' => $alertModel->updates])->one(); $alertModel->status = models\WeatherAlert::STATUS_UPDATED; $alertModel->save(); } $weatherAlertAreaModel = new models\WeatherAlertArea(); $weatherAlertAreaModel->WeatherAlert_id = $alertModel->id; $weatherAlertAreaModel->save(); if (isset($entryContent['polygon']['0'])) { $coordinatePairs = explode(' ', $entryContent['polygon']['0']); foreach ($coordinatePairs as $pair) { $areaDefinitionModel = new models\AreaDefinition(); $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id; $latLonFromPair = explode(',', $pair); $areaDefinitionModel->latitude = $latLonFromPair[0]; $areaDefinitionModel->longitude = $latLonFromPair[1]; $areaDefinitionModel->save(); } } if (isset($entryContent['circle']['0'])) { $coordinatePair = explode(' ', $entryContent['polygon']['0']); $areaDefinitionModel = new models\AreaDefinition(); $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id; $latLonFromPair = explode(',', $coordinatePair); $areaDefinitionModel->latitude = $latLonFromPair[0]; $areaDefinitionModel->longitude = $latLonFromPair[1]; $areaDefinitionModel->radius = $coordinatePair[1]; $areaDefinitionModel->save(); } } } } $endTime = time(); $this->consoleLog('Start date - ' . date('Y-m-d\\TH:i:s', $startTime)); $this->consoleLog('End date - ' . date('Y-m-d\\TH:i:s', $endTime)); $this->consoleLog('Execution Time - ' . ($endTime - $startTime) . ' seconds.'); $this->consoleLog('Count of added alerts - ' . $this->addedAlertsCount); $this->consoleLog('Count of skipped alerts - ' . $this->skippedAlertsCount); $atomGeneralInformation = array_merge(['start' => date('Y-m-d\\TH:i:s', $startTime), 'end' => date('Y-m-d\\TH:i:s', $endTime)], $atomGeneralInformation); $atomGeneralInformation['entries'] = isset($atomEntriesContent['entries']) ? $atomEntriesContent['entries'] : []; return $atomGeneralInformation; } catch (\Exception $e) { $this->consoleLog('Process ERROR - ' . $e->getMessage()); Yii::$app->end(); } }
/** * @return \yii\db\ActiveQuery */ public function getWeatherAlertArea() { return $this->hasOne(WeatherAlertArea::className(), ['id' => 'WeatherAlertArea_id']); }
public function generatePreStorm() { if ((int) $this->countPreStorm) { for ($i = 0; $i < (int) $this->countPreStorm; $i++) { $preStormModel = new WeatherAlert(); $preStormModel->type = 0; //Pre-storm $preStormModel->status = WeatherAlert::STATUS_ACTUAL; $preStormModel->date = time(); $preStormModel->event = rand(0, 1); $preStormModel->msgType = 1; $preStormModel->severity = 'Moderate'; $preStormModel->save(); $weatherAlertArea = new WeatherAlertArea(); $weatherAlertArea->WeatherAlert_id = $preStormModel->id; $weatherAlertArea->save(); $this->_generateCoordinates($weatherAlertArea->id, false, rand(3, 6)); } } if ((int) $this->countPostStorm) { for ($i = 0; $i < (int) $this->countPostStorm; $i++) { $preStormModel = new WeatherAlert(); $preStormModel->type = 1; //Pre-storm $preStormModel->status = WeatherAlert::STATUS_ACTUAL; $preStormModel->date = time(); $preStormModel->event = rand(0, 1); $preStormModel->msgType = 1; $preStormModel->magnitude = rand(1, 10); $preStormModel->save(); $weatherAlertArea = new WeatherAlertArea(); $weatherAlertArea->WeatherAlert_id = $preStormModel->id; $weatherAlertArea->save(); $this->_generateCoordinates($weatherAlertArea->id, true); } } if ((int) $this->countStormPath) { $this->isStormPath = true; for ($i = 0; $i < (int) $this->countStormPath; $i++) { //generate pre-storm path $stormCount = rand(3, 6); $identifierOfUpdates = null; $event = rand(0, 1); for ($j = 0; $j < $stormCount; $j++) { $isLast = $stormCount - 1 - $j ? false : true; $preStormModel = new WeatherAlert(); $preStormModel->status = WeatherAlert::STATUS_UPDATED; $preStormModel->type = 0; //Pre-storm if ($isLast) { $preStormModel->status = WeatherAlert::STATUS_ACTUAL; } $preStormModel->date = time(); $preStormModel->event = $event; $preStormModel->identifier = 'identifier' . $j; $preStormModel->severity = 'Moderate'; $preStormModel->msgType = 1; $preStormModel->updates = $identifierOfUpdates; $preStormModel->save(); $identifierOfUpdates = $preStormModel->identifier; $weatherAlertArea = new WeatherAlertArea(); $weatherAlertArea->WeatherAlert_id = $preStormModel->id; $weatherAlertArea->save(); $this->_generateCoordinates($weatherAlertArea->id, false); } } } }