Ejemplo n.º 1
0
 /**
  * @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;
 }
Ejemplo n.º 2
0
 /**
  * @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);
 }
Ejemplo n.º 3
0
 /**
  * @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;
 }