/** * @param string $name * @throws Exception * @return OrtGeo|null */ public static function getOrCreate($name) { /** @var null|OrtGeo */ $ort = OrtGeo::model()->findByAttributes(["ort" => $name]); if ($ort) { return $ort; } $data = RISGeo::addressToGeo("Deutschland", "", "München", $name); if (($data === false || $data["lat"] == 0) && mb_strpos($name, "-") !== false) { $data = RISGeo::addressToGeo("Deutschland", "", "München", str_replace("-", "", $name)); } if (($data === false || $data["lat"] == 0) && mb_stripos($name, "Str.") !== false) { $data = RISGeo::addressToGeo("Deutschland", "", "München", str_ireplace("Str.", "Straße", $name)); } if ($data["lat"] <= 0 || $data["lon"] <= 0) { return null; } $ort = new OrtGeo(); $ort->ort = $name; $ort->lat = $data["lat"]; $ort->lon = $data["lon"]; $ort->setzeBA(); $ort->source = "auto"; $ort->to_hide = 0; $ort->to_hide_kommentar = ""; $ort->datum = new CDbExpression('NOW()'); if (!$ort->save()) { RISTools::send_email(Yii::app()->params['adminEmail'], "OrtGeo:getOrCreate Error", print_r($ort->getErrors(), true), null, "system"); throw new Exception("Fehler beim Speichern: Geo"); } return $ort; }
/** * @param Dokument|null $dokument * @return string */ public function getTitle($dokument = null) { if (count($this->krits) == 1) { switch ($this->krits[0]["typ"]) { case "betreff": $such = $this->krits[0]["suchbegriff"]; if ($such[0] == "\"" && $such[strlen($such) - 1] == "\"") { return "Dokumente mit " . $this->krits[0]["suchbegriff"] . " im Betreff"; } return "Dokumente mit \"" . $such . "\" im Betreff"; case "antrag_typ": return "Dokumente des Typs \"" . Dokument::$TYPEN_ALLE[$this->krits[0]["suchbegriff"]] . "\""; case "volltext": $such = $this->krits[0]["suchbegriff"]; if ($such[0] == "\"" && $such[strlen($such) - 1] == "\"") { return "Volltextsuche nach " . $this->krits[0]["suchbegriff"]; } return "Volltextsuche nach \"" . $such . "\""; case "ba": /** @var Bezirksausschuss $ba */ $ba = Bezirksausschuss::model()->findByAttributes(["ba_nr" => $this->krits[0]["ba_nr"]]); return "Bezirksausschuss " . $ba->ba_nr . ": " . $ba->name; case "geo": $ort = OrtGeo::findClosest($this->krits[0]["lng"], $this->krits[0]["lat"]); $title = "Dokumente mit Ortsbezug (ungefähr: " . IntVal($this->krits[0]["radius"]) . "m um \"" . $ort->ort . "\")"; if ($dokument) { /** @var OrtGeo[] $gefundene_orte */ $gefundene_orte = []; foreach ($dokument->orte as $dok_ort_ort) { $dok_ort = $dok_ort_ort->ort; $distance = RISGeo::getDistance($dok_ort->lat, $dok_ort->lon, $this->krits[0]["lat"], $this->krits[0]["lng"]); if ($distance * 1000 <= $this->krits[0]["radius"]) { $gefundene_orte[] = $dok_ort; } } if (count($gefundene_orte) > 0) { $namen = []; foreach ($gefundene_orte as $gef_ort) { $namen[] = $gef_ort->ort; } $title .= ": " . implode(", ", $namen); } } return $title; case "referat": /** @var Referat $ref */ $ref = Referat::model()->findByPk($this->krits[0]["referat_id"]); return $ref->name; break; case "antrag_wahlperiode": return "Dokumente der Wahlperiode " . $this->krits[0]["suchbegriff"]; case "antrag_nr": return "Antrag Nr. " . str_replace("*", " ", $this->krits[0]["suchbegriff"]); } } if (count($this->krits) > 1) { $krits = []; foreach ($this->krits as $cr) { switch ($cr["typ"]) { case "betreff": $krits[] = "mit \"" . $cr["suchbegriff"] . "\" im Betreff"; break; case "antrag_typ": $krits[] = "vom Typ \"" . Dokument::$TYPEN_ALLE[$cr["suchbegriff"]] . "\""; break; case "volltext": $krits[] = "mit dem Suchausdruck \"" . $cr["suchbegriff"] . "\""; break; case "ba": /** @var Bezirksausschuss $ba */ $ba = Bezirksausschuss::model()->findByAttributes(["ba_nr" => $cr["ba_nr"]]); $krits[] = "aus dem Bezirksausschuss " . $ba->ba_nr . ": " . $ba->name; break; case "geo": $ort = OrtGeo::findClosest($cr["lng"], $cr["lat"]); $krits[] = "mit einem Ortsbezug (ungefähr: " . IntVal($cr["radius"]) . "m um \"" . $ort->ort . "\")"; break; case "antrag_nr": $krits[] = "zum Antrag Nr. " . $cr["suchbegriff"]; break; case "referat": /** @var Referat $ref */ $ref = Referat::model()->findByPk($cr["referat_id"]); $krits[] = "im Zuständigkeitsbereich des " . $ref->name; break; case "antrag_wahlperiode": $krits[] = "aus der Wahlperiode " . CHtml::encode($cr["suchbegriff"]); break; default: $krits[] = json_encode($cr); } } $text = "Dokumente "; for ($i = 0; $i < count($krits) - 1; $i++) { $text .= $krits[$i]; if ($i < count($krits) - 2) { $text .= ", "; } } $text .= " und " . $krits[count($krits) - 1]; return $text; } return json_encode($this->krits); }
/** * @throws Exception */ public function geo_extract() { $text = $this->text_ocr_corrected . $this->text_pdf; $strassen_gefunden = RISGeo::suche_strassen($text); /** @var array|AntragOrt[] $bisherige */ $bisherige = AntragOrt::model()->findAllByAttributes(["dokument_id" => $this->id]); $bisherige_ids = []; foreach ($bisherige as $i) { $bisherige_ids[] = $i->ort_id; } $neue_ids = []; $indexed = []; foreach ($strassen_gefunden as $strasse_name) { if (!in_array($strasse_name, $indexed)) { $indexed[] = $strasse_name; $geo = OrtGeo::getOrCreate($strasse_name); if (is_null($geo)) { continue; } $neue_ids[] = $geo->id; if (!in_array($geo->id, $bisherige_ids)) { $antragort = new AntragOrt(); $antragort->antrag_id = $this->antrag_id; $antragort->termin_id = $this->termin_id; $antragort->rathausumschau_id = $this->rathausumschau_id; $antragort->dokument_id = $this->id; $antragort->ort_name = $strasse_name; $antragort->ort_id = $geo->id; $antragort->source = "text_parse"; $antragort->datum = date("Y-m-d H:i:s"); try { if (!$antragort->save()) { RISTools::send_email(Yii::app()->params['adminEmail'], "Dokument:geo_extract Error", print_r($antragort->getErrors(), true), null, "system"); throw new Exception("Fehler beim Speichern: geo_extract"); } } catch (Exception $e) { var_dump($antragort->getAttributes()); die; } } } } foreach ($bisherige_ids as $id) { if (!in_array($id, $neue_ids)) { AntragOrt::model()->deleteAllByAttributes(["dokument_id" => $this->id, "ort_id" => $id]); } } $this->orte = AntragOrt::model()->findAllByAttributes(["dokument_id" => $this->id]); }
/** * @return OrtGeo[] */ public function get_geo() { $return = []; $strassen_gefunden = RISGeo::suche_strassen($this->top_betreff); $indexed = []; foreach ($strassen_gefunden as $strasse_name) { if (!in_array($strasse_name, $indexed)) { $indexed[] = $strasse_name; $geo = OrtGeo::getOrCreate($strasse_name); if (is_null($geo)) { continue; } $return[] = $geo; } } return $return; }