public function run($args)
 {
     if (count($args) == 0) {
         die("./yii recalc_ort2ba [Orts-ID|alle]\n");
     }
     if ($args[0] == "alle") {
         /** @var OrtGeo[] $orte */
         $orte = OrtGeo::model()->findAll(["order" => "id"]);
     } else {
         /** @var OrtGeo[] $orte */
         $orte = OrtGeo::model()->findAll(["condition" => "id = " . IntVal($args[0])]);
     }
     /** @var Bezirksausschuss[] $bas */
     $bas = Bezirksausschuss::model()->findAll();
     foreach ($orte as $ort) {
         $found_ba = null;
         foreach ($bas as $ba) {
             if ($ba->pointInBA($ort->lon, $ort->lat)) {
                 echo $ort->id . " - " . $ort->ort . ": " . $ba->ba_nr . "\n";
                 $found_ba = $ba->ba_nr;
             }
         }
         if ($found_ba) {
             $ort->ba_nr = $found_ba;
             $ort->save();
         }
     }
 }
 /**
  * @param float $lat
  * @param float $lng
  * @param float $radius
  * @param int $seite
  */
 public function actionAntraegeAjaxGeo($lat, $lng, $radius, $seite = 0)
 {
     $krits = new RISSucheKrits();
     $krits->addGeoKrit($lng, $lat, $radius);
     $solr = RISSolrHelper::getSolrClient("ris");
     $select = $solr->createSelect();
     $krits->addKritsToSolr($select);
     $select->setStart(30 * $seite);
     $select->setRows(30);
     $select->addSort('sort_datum', $select::SORT_DESC);
     $ergebnisse = $solr->select($select);
     /** @var Antrag[] $antraege */
     $antraege = [];
     /** @var RISSolrDocument[] $solr_dokumente */
     $solr_dokumente = $ergebnisse->getDocuments();
     $dokument_ids = [];
     foreach ($solr_dokumente as $dokument) {
         $x = explode(":", $dokument->id);
         $dokument_ids[] = IntVal($x[1]);
     }
     foreach ($dokument_ids as $dok_id) {
         /** @var Dokument $ant */
         $ant = Dokument::model()->with(["antrag" => [], "antrag.dokumente" => ["alias" => "dokumente_2", "condition" => "dokumente_2.id IN (" . implode(", ", $dokument_ids) . ")"]])->findByPk($dok_id);
         if ($ant && $ant->antrag) {
             $antraege[$ant->antrag_id] = $ant->antrag;
         }
     }
     $geodata = $this->getJSGeodata($krits, $ergebnisse);
     $naechster_ort = OrtGeo::findClosest($lng, $lat);
     ob_start();
     $this->renderPartial('index_antraege_liste', ["aeltere_url_ajax" => $this->createUrl("index/antraegeAjaxGeo", ["lat" => $lat, "lng" => $lng, "radius" => $radius, "seite" => $seite + 1]), "aeltere_url_std" => $this->createUrl("index/antraegeStdGeo", ["lat" => $lat, "lng" => $lng, "radius" => $radius, "seite" => $seite + 1]), "neuere_url_ajax" => null, "neuere_url_std" => null, "antraege" => $antraege, "geo_lng" => $lng, "geo_lat" => $lat, "radius" => $radius, "naechster_ort" => $naechster_ort, "weiter_links_oben" => true, "zeige_jahr" => true]);
     Header("Content-Type: application/json; charset=UTF-8");
     echo json_encode(["datum" => date("Y-m-d"), "html" => ob_get_clean(), "geodata" => $geodata, "krit_str" => $krits->getJson(), "naechster_ort" => $naechster_ort->ort]);
     Yii::app()->end();
 }
Example #3
0
 /**
  * @param float $lng
  * @param float $lat
  * @return OrtGeo
  */
 public static function findClosest($lng, $lat)
 {
     // SQRT(POW(69.1 * (fld_lat - ( $lat )), 2) + POW(69.1 * (($lon) - fld_lon) * COS(fld_lat / 57.3 ), 2 )) AS distance
     $lat = FloatVal($lat);
     $lng = FloatVal($lng);
     $result = Yii::app()->db->createCommand("SELECT *, SQRT(POW(69.1 * (lat - ( " . $lat . ")), 2) + POW(69.1 * (({$lng}) - lon) * COS(lat / 57.3 ), 2 )) AS distance FROM orte_geo ORDER BY distance ASC LIMIT 0,1")->queryAll();
     $res = new OrtGeo();
     $res->setAttributes($result[0]);
     return $res;
 }
Example #4
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]);
 }
 /**
  * @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);
 }
 /**
  * @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;
 }