abrain / einsatzverwaltung

WordPress plugin for public incident reports for fire departments and other rescue services
https://einsatzverwaltung.org
GNU General Public License v2.0
57 stars 17 forks source link

Google Map des Einsatzortes #98

Open jhbriese opened 9 years ago

jhbriese commented 9 years ago

Moin,

erstelle gerade eine Seite für unsere FF und fand dein Plug-In sehr gelungen und hilfreich. Einzig die Anzeige einer Map mit dem Einsatzort hat mir noch gefehlt.

Ich habe das ganze mal getestet und mit einer extra Funktion eingepflegt. Kannst du gerne Verwenden, wenn du magst:

/**
 * Erzeugt den Kopf eines Einsatzberichts
 *
 * @param WP_Post $post Das Post-Objekt
 * @param bool $may_contain_links True, wenn Links generiert werden dürfen
 * @param bool $showArchiveLinks Bestimmt, ob Links zu Archivseiten generiert werden dürfen
 *
 * @return string Auflistung der Einsatzdetails
 */
public function getEinsatzberichtHeader($post, $may_contain_links = true, $showArchiveLinks = true)
{
    if (get_post_type($post) == "einsatz") {
        $make_links = $may_contain_links;

        $alarmierungsarten = Data::getAlarmierungsart($post->ID);
        $alarm_string = self::getAlarmierungsartString($alarmierungsarten);

        $duration = Data::getDauer($post->ID);
        $dauerstring = ($duration === false ? '' : Utilities::getDurationString($duration));

        $einsatzart = Data::getEinsatzart($post->ID);
        $showEinsatzartArchiveLink = $showArchiveLinks && Options::isShowEinsatzartArchive();
        $art = self::getEinsatzartString($einsatzart, $make_links, $showEinsatzartArchiveLink);

        $fehlalarm = Data::getFehlalarm($post->ID);
        if (empty($fehlalarm)) {
            $fehlalarm = 0;
        }
        if ($fehlalarm == 1) {
            $art = (empty($art) ? 'Fehlalarm' : $art.' (Fehlalarm)');
        }

        $einsatzort = Data::getEinsatzort($post->ID);
        $einsatzleiter = Data::getEinsatzleiter($post->ID);
        $mannschaft = Data::getMannschaftsstaerke($post->ID);

        $fahrzeuge = Data::getFahrzeuge($post->ID);
        $fzg_string = self::getFahrzeugeString($fahrzeuge, $make_links, $showArchiveLinks);

        $exteinsatzmittel = Data::getWeitereKraefte($post->ID);
        $ext_string = self::getWeitereKraefteString($exteinsatzmittel, $make_links, $showArchiveLinks);

        $alarmzeit = Data::getAlarmzeit($post->ID);
        $alarm_timestamp = strtotime($alarmzeit);
        $datumsformat = Options::getDateFormat();
        $zeitformat = Options::getTimeFormat();
        $einsatz_datum = ($alarm_timestamp ? date_i18n($datumsformat, $alarm_timestamp) : '-');
        $einsatz_zeit = ($alarm_timestamp ? date_i18n($zeitformat, $alarm_timestamp).' Uhr' : '-');

        $headerstring = "<strong>Datum:</strong> ".$einsatz_datum."<br>";
        $headerstring .= "<strong>Alarmzeit:</strong> ".$einsatz_zeit."<br>";
        $headerstring .= $this->getDetailString('Alarmierungsart:', $alarm_string);
        $headerstring .= $this->getDetailString('Dauer:', $dauerstring);
        $headerstring .= $this->getDetailString('Art:', $art);
        $headerstring .= $this->getDetailString('Einsatzort:', $einsatzort);
        $headerstring .= $this->getDetailString('Einsatzleiter:', $einsatzleiter);
        $headerstring .= $this->getDetailString('Mannschaftsst&auml;rke:', $mannschaft);
        $headerstring .= $this->getDetailString('Fahrzeuge:', $fzg_string);
        $headerstring .= $this->getDetailString('Weitere Kr&auml;fte:', $ext_string);

        //MODIFICATION TO DISPLAY GOOGLE MAP
        return "<p>$headerstring</p>" . $this->getEinsatzberichtMap($einsatzort);
    }
    return "";
}

/**
 * Erzeugt eine Google Map des Einsatzortes
 * 
 * @author Jan-Hendrik Briese, www.janbriese.de
 *
 * @param WP_Post $post Das Post-Objekt
 * @param bool $may_contain_links True, wenn Links generiert werden dürfen
 * @param bool $showArchiveLinks Bestimmt, ob Links zu Archivseiten generiert werden dürfen
 *
 * @return string Code zum Erzeugen der Google-Map mit Markierten einsatzort
 */
public function getEinsatzberichtMap($einsatzort)
{
if($einsatzort)
{   
  $mapstring = "<style>html, body, #map-canvas {height: 300px; width: 500px margin: 0px; padding: 0px }</style>\n";
      $mapstring .= "<script>\n";
      $mapstring .= "var geocoder;\n";
      $mapstring .= "var map;\n";
      $mapstring .= "function initialize() {\n";
      $mapstring .= "  geocoder = new google.maps.Geocoder();\n";
      $mapstring .= "  var latlng = new google.maps.LatLng(53.523463, 9.482329);\n";
      $mapstring .= "  var mapOptions = {\n";
      $mapstring .= "    zoom: 13,\n";
      $mapstring .= "    center: latlng\n";
      $mapstring .= "  }\n";
      $mapstring .= "  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); \n";
      $mapstring .= "  var address = '" . $einsatzort . "';\n";
      $mapstring .= "  geocoder.geocode( { 'address': address}, function(results, status) {\n";
      $mapstring .= "    if (status == google.maps.GeocoderStatus.OK) {\n";
      $mapstring .= "      map.setCenter(results[0].geometry.location);\n";
      $mapstring .= "      var marker = new google.maps.Marker({\n";
      $mapstring .= "          map: map,\n";
      $mapstring .= "          position: results[0].geometry.location\n";
      $mapstring .= "      });\n";
      $mapstring .= "    } else {\n";
      $mapstring .= "      map.setCenter(new google.maps.LatLng(53.523463, 9.482329));\n";
      $mapstring .= "    }\n";
      $mapstring .= "  });\n";
      $mapstring .= "}\n";
      $mapstring .= "google.maps.event.addDomListener(window, 'load', initialize);\n";
      $mapstring .= "</script>\n";
      $mapstring .= "<p id='map-canvas'></p>\n";

      return $mapstring;
}
else
{
  return "";
}
}

Hoffe ich konnte etwas beisteuern ;)

Gruß Jan

abrain commented 9 years ago

Super, danke :) Das Feature wird in der Tat immer häufiger angefragt, wird also auch noch seinen Weg in das Plugin finden. Ob es allerdings Google Maps wird, oder doch OpenStreetMap muss ich noch sehen.

sebastianroming commented 9 years ago

@abrain Vorschlag: warum nicht den User selbst auswählen lassen? Ich persönlich nutze z.B. nur Google Maps, kein OSM. Biete dem User eine Möglichkeit, einen API Key für Google Maps zu hinterlegen - dann sollte das kein Problem sein :-)

abrain commented 9 years ago

Stimmt, der API Key ist immer der springende Punkt bei Open Source Software. Aber richtig, das kann der User bei Bedarf dann selbst entscheiden. Danke!

sebastianroming commented 9 years ago

@abrain Sofern "Implementationsunterstützung" besteht - einfach Bescheid geben. Ich bastel schon ziemlich lang' mit Google Maps.

SebastianSchultz commented 8 years ago

Hallo zusammen,

ich habe soeben den obigen Code mal bei mir eingefügt, da ich die Funktion auch gern verwenden wollte, allerdings wird bei mir nur eine freie Fläche und keine Karte angezeigt?!

Hat jemand ne Idee, woran das liegt?

jhbriese commented 8 years ago

Habs gerade erst gesehen, könnte am Theme liegen. Hab gestern eine neue Version via Pull Request eingestellt. Hab es selber aber auch nur mitt unserem Theme gestestet, sollte aber normalerweise nichts besonderes dran sein. Eventuell fehlt auch einfach das API Script, ist im Pull Request jetzt registriert.

HeikoBornholdt commented 7 years ago

Moin,

gibt es schon was Neues zu diesem Thema?

Ich würde mich über eine Google Maps-Integration freuen.

jhbriese commented 7 years ago

Moin wie sieht es mit der Integration von PR #114 aus? Soll ich ggf noch etwas anpassen?

abrain commented 7 years ago

Siehe https://github.com/abrain/einsatzverwaltung/pull/114#issuecomment-306630065

podogu commented 7 years ago

Könnte man eventuell auch eine Karte generieren, die für ein Jahr alle Einsätze anzeigt? Und wo muss der Code eingefügt werden?

Markkuuss commented 6 years ago

Das Thema war ja schon relativ weit. Wie sieht's denn aus? Kann man demnächst mit der Integration der Karte rechnen?

abrain commented 6 years ago

Eine ganz grundsätzliche Frage, die mir bei diesem Issue durch den Kopf geht: Eine einfache Karte ist nur dann sinnvoll, wenn ich darauf einen Ort markiere. Das wäre in diesem Kontext der Einsatzort. Ich hoffe allerdings, dass wir uns an der Stelle einig sind, dass genaue Adressen von Einsatzorten nicht Teil des Einsatzberichts auf der Webseite sein sollten.

Die Angabe des Einsatzortes nur auf den Straßennamen zu beschränken wird die Markierung auf einen beliebigen Punkt in der Straße setzen (i.d.R. die Mitte). Hier ist die Angabe der Markierung sogar irreführend, weil davon ausgegangen wird, dass ein exakter Ort markiert werden soll.

Mein Vorschlag wäre daher folgender: Das Freitextfeld für den EInsatzort bleibt in seiner jetzigen Form bestehen. Das bietet allen Benutzern die gleiche Flexibilität, egal ob die Karte verwendet wird, oder nicht. Die Eingabemaske für Einsatzberichte erhält zusätzlich eine Möglichkeit, eine (möglicherweise exakte) Adresse anzugeben. Diese wir aber nicht gespeichert, sondern nur einmalig zur Auflösung der Koordinate verwendet. Alternativ kann die Koordinate auch direkt angegeben werden. Zu dieser Koordinate wird in einem ausreichend groben Gitter eine Zelle herausgesucht. Nur die Zugehörigkeit zu dieser Zelle wird dann mit dem Einsatzbericht gespeichert.

Dieses Konzept kann man sich beispielsweise auf der Karte von luftdaten.info ansehen. Hierbei werden die exakten Standorte der Messtationen, die bei Privatleuten aufgestellt sind, verschleiert. Zum Einsatz kommt dafür d3-hexbin.

Die Farbe der Sechsecke gibt hierbei über den Durchschnitt der Messwerte in diesem Bereich Auskunft. Messwerte in diesem Sinn entstehen bei Einsätzen nicht, es wäre aber denkbar die Einfärbung zur Erstellung einer Heatmap zu verwenden. Damit könnte die Häufigkeit von Einsätzen in bestimmten Bereichen sichbar gemacht werden.

jhbriese commented 6 years ago

Moin so wie ich es in meinem Vorschlag implementiert habe kann die Karte (de)aktiviert werden. Neben dem Adressfeld befindet sich ein Button zum auflösen der Koordinate welche in einem extra Geld gespeichert wird. Der Marker kann nun noch mit der Maus versetzt werden

abrain commented 6 years ago

Korrekt, damit ist auch ersteinmal nichts verkehrt. Das ist aber nicht der Punkt, den ich oben ansprechen wollte. Es geht darum, dass genaue Adressen und/oder Koordinaten nicht gespeichert werden sollen.

Ich sehe aktuell keinen Grund, die exakte Koordinate anzuzeigen bzw. überhaupt zu speichern. Das wird alleine schon rechtlich nicht in Ordnung sein. Mich würde dazu interessieren, ob das jemand anders sieht.

jhbriese commented 6 years ago

Da stimme ich mit dir vollkommen überein. Wir handhaben das so, dass wir maximal die Straße angeben, bzw bei VU auch mal die Kreuzung. Deshalb die Funktion, die eingegebene Adresse (Straße) von Google auflösen zu lassen und anschließend den Marker verschieben zu können. Wir gehen immer nur etwa in die Region des Einsatzes. Das sehe ich nicht als kritisch. Oftmals orientieren wir uns auch an den Presseberichten unserer lokalen Zeitung da diese in der Regel mit der POL abgestimmt sind.

Markkuuss commented 5 years ago

Ich sehe aktuell keinen Grund, die exakte Koordinate anzuzeigen bzw. überhaupt zu speichern. Das wird alleine schon rechtlich nicht in Ordnung sein. Mich würde dazu interessieren, ob das jemand anders sieht.

Ich sehe das genauso. Wir speichern auch keine Hausnummern, sondern lediglich Straßennamen ab. Derzeit verwenden wir zwar auch eine Karte, aber das Problem ist einfach: Wo setzt man den Marker hin? Man interpretiert natürlich immer, dass der Einsatzort genau dort ist, wo der Marker gesetzt wurde, selbst wenn der Marker in der Mitte der Straße platziert wurde. Von dieser Lösung wollen wir längst weg. Die Lösung mit d3-hexbin Overlay finde ich sehr gut.

Wir planen derzeit die Umstellung auf Wordpress. Das Plugin mit dieser Overlay-Lösung würde dann keine Wünsche mehr offen lassen.

HeikoBornholdt commented 5 years ago

Man könnte auch den ganzen Straßenzug markieren. Google Maps bietet solch eine Funktion an (siehe https://www.google.com/maps/vt/data=pcVd2DPqHVnYuYa-I5oqqoRz3KoldS0eM3iUod-WJ8MJcWLYcV28vA9UgoXKlCrV324hSxSmRGjKbYcDIqBwq0JcpswA3HOGd3666PM6kBuzH67x9jCRcQk-m4Rr0mCJJTqF2fd21uBx3iS_KR8xHFScM7Z0dPzfETjLeFVkcNzfz8BkwGPvfg72gQn3SD-radqLSzSkvptAzOaHc7_ZjNWRa4duRyUHavtPcbFIY02aCEDb_lQ6lmP5kA3Qm-tiU5Z3ErfdCFg_EswR7PHG93K2f7N9bRMLpQ) Leider gibt es dazu keine öffentliche Schnittstelle.

oiooio commented 2 years ago

@abrain Ist dieses Feature in Planung? Eventuell auch mit Openstreetmap-Kartenlayer anstatt Google Maps. Da gibts ja z.B. mit Leaflet was ganz brauchbares.