Admin-Dokumentation

Aus kvwmap
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Weitere Informationen im kvwmap Forum

Übersicht

kvwmap setzt unter anderem auf Apache, UMN-MapServer, php-Mapscript, MySQL, Postgres mit PostGIS und OGR auf.
Dank an dieser Stelle für die Entwicklung und Bereitstellung der genannten Software.

Dieses Manual wurde erstellt unter Mitwirkung von

Peter Korduan, Stefan Rahn, Markus Hentschel, Hauke Christoph, Heinz Schmidt

und vielen Anderen.

An der Entwicklung von kvwmap waren und/oder sind bisher beteiligt:

Peter Korduan, Stefan Rahn, Hauke Christoph, Conrad Gühler, Swen Hüner, Markus Hentschel, Holger Riedel, Heinz Schmidt

Vielen Dank auch für die Zuarbeiten und Hinweise aus den Katasterämtern der Landkreise Rostock, Vorpommern-Rügen, Vorpommern-Greifswald, Mecklenburgische Seenplatte, Ludwigslust-Parchim und die Landeshauptstadt Schwerin.

Dienstleistungen zu kvwmap werden angeboten von:

GDI-Service Rostock
Prof. Ralf Bill, Uni Rostock


Status des kvwmap-WIKIs: in Work!!

Die Dokumentation erhebt keinen Anspruch auf Vollständigkeit. Sie wird sowohl von den Entwicklern als auch von den Anwendern aktualisiert und laufend gehalten. Dennoch kann es vorkommen, dass bestimmte Inhalte nicht immer ganz zur aktuellsten Version passen. Als registrierter Teilnehmer dieses WIKIs können Sie Fehler selbst beheben und die Dokumentation auf dem aktuellsten Stand halten. Wenn Sie nicht registriert sind, sind Zuarbeiten, Hinweise und Korrekturvorschläge selbstverständlich genauso herzlich willkommen. Schreiben Sie an die o.g. Personen, die auch in der Teilnehmerliste auftauchen.

Die Dokumentation wird in der jeweils aktuellen Version jedem neuen Versionspaket von kvwmap im Unterordner help hinzugefügt. Für die Richtigkeit und Vollständigkeit der folgenden Angaben wird keine Garantie übernommen.

Hintergründe für die Entwicklung

Kvwmap ist eine auf den UMN-MapServer aufsetzende Entwicklung zur Erfassung, Verarbeitung, Analyse und Präsentation von raumbezogenen Information. Die Entwicklung besteht aus einer Reihe von PHP-Skripten, einem Schema für eine MySQL-Datenbank zur Speicherung von Benutzerdaten und einem Schema für eine PostgreSQL-Datenbank mit PostGIS Aufsatz zur Speicherung von raumbezogenen Daten. Die Anwendung nutzt PHP-MapScript für den Zugriff auf die Funktionen des UMN-MapServers und die pdf class von R&OS zur Erzeugung von PDF-Dokumenten.

Funktionalität im Client

Folgende Funktionalitäten werden von dem Client bereitgestellt:

Anzeige

Menüs für gruppierte Funktionen und Layer
Karte und Übersichtskarte
Maßstabszahl und Maßstabsbalken
Anzeige welche Layer aktiv und im Abfragemodus sind
Legenden der Layer, ausschaltbar mit Minus.gif
Menü und Layeranzeige sind ausblendbar mit Double arror left.png und Double arror right.png
Anzeige der Koordinaten an aktueller Cursorposition in Statuszeile Statuszeile.png
Anzeige kvwmap-Version, Datum, angemeldeter Nutzer und aktuelle Stelle

Navigation

Navigationsleiste des SVG-Clients






Back.png Vorheriger Ausschnitt (History-Funktion)
Frwd.png Nächsten Ausschnitt (History-Funktion)
Pan.png Pan (durch Ziehen des Bildschirmausschnittes an eine neue Stelle)
Pan.png Zentrieren (der zu klickende Punkt wird in Kartenmitte versetzt)
Zoomin.png Zoom in (durch Aufziehen einer Box)
MausradZoom.png
Zoomin.png Zoom in (durch Klicken i. d. Karte bei wählbarem Zoomfaktor)
Zoomout.png Zoom out (durch Klicken i. d. Karte bei wählbarem Zoomfaktor)
Jumpto.png Eingabe eines konkreten Koordinatenpaars ('Koordinatenzoom')
  • Eingabe eines konkreten Maßstabs
    Massstab.png
  • Tool-Tipps einblenden
    Tooltip.png
  • Mausrad-Zoom
    • Rad Richtung Bildschirm drehen zum Reinzoomen
    • Rad vom Bildschirm weg drehen zum Rauszoomen
  • Gesten auf Touchpads
    • Zwei Finger aufeinander zubewegen zum Reinzoomen
    • Zwei Finger auseinander ziehen zum Rauszoomen
    • Zwei Finger im gleichen Abstand in eine Richtung ziehen zum Verschieben der Karte
  • Schnellsprung-Zoom, zum schnellen Zoom auf z.B. Gemeinde, Amt, usw.
    • Über die Konstante LAYER_ID_SCHNELLSPRUNG in der config.php kann ein beliebiger Polygonlayer dafür verwendet werden
    • Der Layer muss die "oid" der Tabelle abfragen
    • Das Attribut "oid" muss im Attributeditor als Auswahlfeld mit z.B. folgendem SQL: "select oid as value, name as output from gemeinden order by name" definiert sein

Themenbaum

Legende
  • Gruppierung der Layer
    • Anzeige der Gruppennamen
    • Zuordnung der Layer zu den Gruppen
    • Auf- und Zuklappen der Legende einzelner Gruppen (Plus.gif|Minus.gif vom Gruppennamen)
    • Gleichzeitiges De- oder Aktivieren aller Layer der Gruppe für die Informationsabfrage Pfeil.gif
    • Gleichzeitiges Ein- oder Ausschalten der Sichtbarkeit aller Layer der Gruppe Pfeil.gif
  • Layer
    • Ein- und Ausschalten des Layers für die Anzeige Checkbox.png
    • Ein- und Ausschalten des Layers für die Sachdatenabfrage Checkbox.png
    • Zoom auf die maximale Ausdehnung des Layers (MaxLayerExtent.gif hinter dem Layernamen, geht derzeit nur für aktuell eingeblendete PostGIS Layer)
    • Ein- und Ausschalten der Klassen des Layers (Plus.gif|Minus.gif hinter dem Layernamen)
    • Ausschalten aller Layer für die Anzeige und Abfrage (Symbole ganz oben in der Legende). Letzters ist auch möglich über die go-Variablen "go=reset_layers" bzw. "go=reset_querys"

Legende

Bei einigen Anwendungen wird zusätzlich zu dem Themenbaum auch eine Legende angezeigt. Zwischen Themen und Legende kann mit einem Klick auf die entsprechenden Reiter gewechselt werden, siehe Abbildung.

Abfragen

Das Abfrageergebnis wird in einem eigenen Fenster angezeigt. Spaltenbezeichnungen und Layouteinstellungen können in Vorlagen angepasst werden

  • Auswahl der abfragbaren Layer in Legende
  • Anklicken eines entsprechenden Objekts Query.png
  • Aufziehen einer Box um betreffende Objekte Query.png
  • Abfrage eines Objektes und aller angrenzenden Objekte Touchquery.png
  • Klick in die Karte und Angabe eines Abfrageradius' Query-radius.png
  • Zeichnen eines Abfragepolygons Polyquery.jpg
  • Koordinatenabfrage coord query.PNG
  • Abfrage der ALKIS-Daten beim Flurstückslayer, Ausgabe in PDF im amtlichen Format

Suche

Alle Suchfunktionen funktionieren natürlich nur, wenn die entsprechenden Daten in kvwmap eingebunden sind und auch in der Stelle in der die Suche stattfinden soll verfügbar sind.

  • Flurstücke (Gemeinde-Gemarkung/Flur/Flurstück)
  • Adressen (Gemeinde/Strasse/Hausnummer)
  • Grundbuchblätter (Grundbuchbezirksschlüssel/Grundbuchbezirk-Auswahl/Grundbuchblatt)
  • Namen (Name, Vorname Geburtsname/Firma/geboren am/Firmenzusatz/Strasse Hausnummer/PLZ Ort/Grundbuchbezirk/Grundbuchblatt/Gemarkung, Gemeinde - Auswahl)
  • Festpunkte (Kilometerquadrat/Punktkennzeichen)
  • Jagdbezirke (laufende Nummer/Name/Art)
  • Layer (Layername/zum Layer gehörende Attribute)
Mit der Layersuche lassen sich sowohl PostGIS-Layer als auch WFS-Layer durchsuchen. Die Suchfunktion ist generisch. Das heißt, das Suchfenster wird für die jeweiligen zu durchsuchenden Layer automatisch an Hand der vordefinierten Attribute bereitgestellt. Bei WFS-Layern stehen alle Sachattribute, die der WFS anbietet für die Suche zur Verfügung. Bei PostGIS-Layern können die Attribute durchsucht werden, für die der Nutzer mindestens Leserecht hat.
Layersuche.png


Messen

Streckenmessung mit 2 gefangenen Eckpunkten (rot) und einem über "Ortho-Fang" gefangenen Lotfusspunkt (grün)
  • Koordinaten bestimmen
    Koordinaten.png
  • Streckenmessungen
    Mesure.png Tooltip strecke.png
  • Flächenmessungen
    Polyquery.jpg Flaecheninhalt.gif
Unterhalb der Karte lässt sich ein Punktfang aktivieren. Dadurch werden alle (aber max. 10000) Eckpunkte der in den aktiven PostGIS-Layern vorhandenen Geometrien in der Karte als fangbare Punkte zur Verfügung gestellt. Bewegt man die Maus über einen solchen Punkt, erscheint die tatsächliche Koordinate millimetergenau in der Koordinatenanzeige.
Bei der Streckenmessung lassen sich die Fangpunkte mit in den gemessenen Streckenzug aufnehmen. Außerdem steht hier ein sog. "Ortho-Fang" zur Verfügung. Beim Ortho-Fang ist ein Fangen der Kanten zwischen den Geometrie-Eckpunkten möglich, wobei der Lotfusspunkt auf der Kante berechnet und als fangbarer Punkt zur Verfügung gestellt wird. Dadurch lässt sich der orthogonale Abstand eines beliebigen Punktes zu einer Kante messen.
Die gemessene Strecke wird mit Millimetergenauigkeit angezeigt solange nur gefangene Punkte und keine Freihandpunkte in die Streckenmessung aufgenommen wurden. Sobald Freihandpunkte verwendet werden, wird die Strecke nur so genau angegeben, wie es der aktuelle Maßstab zulässt.

Redlining

  • Freihandpolygon zeichnen Freepolygon.png
  • Text hinzufügen Freetext.png
  • Pfeil hinzufügen Freearrow.png


Der Generische Layereditor GLE

Der generische Layereditor (GLE) stellt zur Laufzeit Oberflächen zur Verfügung, die dynamisch ("generisch") aus den rollenbasierten Nutzerrechten und der layerbasierten Definition erzeugt werden. Diese Oberflächen stehen teilweise nur den Administratoren, teilweise aber auch den Nutzern von kvwmap zur Verfügung:

  • Sachdatensuche (go=Layer-Suche)
  • Sachdatenanzeige und -bearbeitung
  • Erfassung neuer Datensätze
  • Sachdatendruckeditor
  • Filterverwaltung
  • Layerattribut-Definition
  • Layerattribut-Rechteverwaltung

In der Sachdatensuche stellt der GLE die Attribute zusammen, die dem Nutzer in dieser Stelle angezeigt werden. In den Attributen kann dieser dann mit Hilfe von verschiedenen Operatoren umfangreich recherchieren. Die Sachdatensuche kann räumlich eingeschränkt werden, dazu ist der Geometrie-Editor zur Erstellung eines Polygons in die Oberfläche integriert.

In der Sachdatenanzeige (die Ergebnis einer Sachdatensuche oder einer Infoabfrage aus der Karte heraus sein kann) werden die Attribute angezeigt, die dem Nutzer in dieser Stelle per Rechtedefinition zur Verfügung stehen. D.h. der GLE erzeugt an Hand der im Query-Statement des Layers vorkommenden Attribute und den entsprechenden Rechten der aktuellen Stelle ein Layereditor-Formular. Hier ist es dem Nutzer möglich, die Attribute von Postgis-Layern zu bearbeiten - wenn er das Recht dazu hat. Je nach Formularelementtyp des Attributs können verschiedene Möglichkeiten zur Verfügung stehen: einzeilige oder mehrzeilige Textfelder, Auswahlfelder, Checkboxen etc. Mit dem Klick auf 'speichern' werden die geänderten Datensätze in die entsprechende(n) Tabelle(n) geschrieben.

Ein Link ermöglicht die Bearbeitung der Geometrie im Geometrie-Editor. Um Sach- oder Geometriedaten zu verändern, muß das entsprechende Recht in der Layerattribut-Rechteverwaltung gesetzt sein.

Wie die Sachdatenanzeige aussieht, wird durch das stellenbezogene Feld "Template" bestimmt. Es gibt derzeit 3 verschiedene Varianten:

  • Zeilenweise Variante (Standard): Datensätze untereinander und Attribute zeilenweise untereinander: Die standardmäßige Darstellungsvariante des GLE (Feld Template ist leer) sieht so aus, dass die Datensätze untereinander und in jedem Datensatz auch die Attribute zeilenweise untereinander angezeigt werden. Diese Variante eignet sich für die meisten Layer, da es durch die Untereinanderanordnung keine Einschränkung in der Attributanzahl gibt. Im Attributeditor kann man die Anordnung der Attribute optimieren und z.B. mehrere Attribute in einer Zeile darstellen.
  • Spaltenweise Variante: Attribute spaltenweise und Datensätze zeilenweise untereinander: Hat ein Layer nur wenige Attribute und Abfragen auf diesen Layern liefern aber meist sehr viele Datensätze, eignet sich evt. die listenförmige Darstellung (Feld Template="generic_layer_editor.php"). Hier werden die Attribute spaltenweise nebeneinander und die Datensätze zeilenweise in einer Tabelle angezeigt. In dieser Variante hat man außerdem die Möglichkeit, mehrere Datensätze auf einmal zu bearbeiten.
  • Rasterförmige Variante: Diese Darstellungsvariante ("Raster" meint eher "Schachbrett") eignet sich besonders für Dokumente (Feld Template="generic_layer_editor_doc_raster.php"). Damit werden die Datensätze rasterförmig neben- und untereinander angezeigt, wobei in jedem Datensatz nur bestimmte Attribute sichtbar sind. Erst wenn man mit der Maus in einen Datensatz klickt, werden die restlichen Attribute eingeblendet. Im Attributeditor kann man einstellen, welche Attribute anfangs sichtbar sein sollen. Mit dieser Variante lässt sich so z.B. eine schnelle Bildsuche realisieren, indem man nur das Bild-Attribut sichtbar schaltet, so dass nur die Vorschaubilder angezeigt werden. Bewegt man die Maus über eines der Vorschaubilder, erscheint es außerdem vergrößert am rechten Bildschirmrand.

Für die Erfassung von neuen Datensätzen stellt der GLE eine eigene Oberfläche zur Verfügung, in der die Attribute des Layers angezeigt werden, die dem Nutzer in dieser Stelle per Rechtedefinition zur Verfügung stehen. Auch hier kann der Nutzer nur die Attribute bearbeiten, für die er das Recht dazu hat. Der Geometrie-Editor zur Erfassung der Geometrie ist in die Oberfläche integriert.

Damit ein Postgis-Layer mit dem generischen Layereditor bearbeitet werden kann, müssen folgende Voraussetzungen geschaffen sein:

  • In der sog. "Query" der Layerdefinition muss eine SQL-Abfrage formuliert werden, die die Attribute des Layers sammelt, die in der Fachdatenanzeige eine Rolle spielen sollen.
  • Die sog. "Haupttabelle" muss oids besitzen (Das Feld wird beim Anlegen oder Speichern eines Layers automatisch gefüllt, wenn es leer ist. Sollte bei einer Layerdefinition über mehrere Tabellen hinweg dort jedoch die falsche Tabelle stehen, kann man den Namen der Haupttabelle von Hand korrigieren.)
  • Dem Layer darf in der jeweiligen Stelle kein Template zugeordnet sein (mit Ausnahme des Raster-Templates "generic_layer_editor_doc_raster.php", siehe oben)

Über den Template-Eintrag lässt sich also steuern, ob für einen Layer der generische Layereditor oder ein Snippet zur Sachdatenanzeige verwendet werden soll.

Es werden sowohl Punkt-, Linien-, als auch Polygon-Layer unterstützt. Falls die Geometrien auch editiert werden sollen, ist bei den Polygon- und Linienlayern ist darauf zu achten, dass die entsprechenden Geometriespalten als 'MULTIPOLYGON' bzw. 'MULTILINESTRING' angelegt werden. Die Polygon- bzw. Linien-Geometrien die mit dem Geometrie-Editor von kvwmap erzeugt werden, werden nämlich immer als Multi-Geometrien in die Datenbank geschrieben.

Bei der Speicherung der Layerdefinition holt der GLE eine Reihe von Datenbankmerkmalen der jeweiligen Attribute aus der Postgis-DB und verwendet diese in den verschiedenen GLE-Oberflächen (z.B. Constraints, NOT NULL, Defaults etc.).

Die Layerattribut-Rechteverwaltung des generischen Layereditors

Mit dem generischen Layereditor (GLE) ist es möglich, die Daten von Postgis-Layern zu verändern. Damit nicht jeder beliebige Nutzer Daten ändert, gibt es ein Rechtesystem, welches jeder Stelle Privilegien zuordnet, die den Zugriff auf die Attribute eines Layers regeln. Die Layerattribut-Rechteverwaltung wird über die go-Variable Layerattribut-Rechteverwaltung aufgerufen. Zunächst wählt man den gewünschten Layer aus. Jeder Layer hat sog. Default-Rechte, die den "Standardzugriff" auf die Attribute definieren. Diese werden links angezeigt und daneben alle Rechte der Stellen, die diesem Layer zugeordet sind.

Layerattribut-Rechteverwaltung

  • Die Layerzugriffsrechte bestimmen, ob die Nutzer einer Stelle in einem Layer nur lesen bzw. editieren dürfen, ob sie zusätzlich neue Datensätze erzeugen dürfen oder darüber hinaus Datensätze außer erzeugen auch löschen dürfen.
  • Die Layerexportrechte bestimmen, welche Exportmöglichkeiten die Nutzer einer Stelle in einem Layer haben. Man kann den Export entweder ganz verbieten, den Export auf die Sachdaten beschränken oder den Export für Sach- und Geometriedaten erlauben.
  • Darunter werden alle Attribute des Layers untereinander aufgelistet. Diese Liste von Attributen ergibt sich aus dem Query-Statement des Layers. Jedem Attribut ist ein Privileg zugeordnet. Zur Auswahl stehen nicht sichtbar, nur exportieren, lesen und editieren. Standardmäßig sind alle Attribute eines Layers nur lesbar. In der jeweiligen Stelle, der der Layer zugeordnet ist, können entweder die Default-Rechte verwendet oder (i.d.R. bei der Stelle des "Datenherrens") individuelle Rechte vergeben werden.
  • Attribute, die einem Layer im Layereditor nachträglich hinzugefügt werden, erhalten in den Stellen zunächst das Recht "nicht sichtbar". Dieses Recht kann anschließend für jede Stelle angepasst oder von der Default-Rechteeinstellung übernommen werden.

Attributeditor - Formularelementtypen

Die Formularfelder des Generischen Layereditors können verschiedene Typen haben. Um einem Attribut manuell einen Formulartyp zuzuweisen, gibt es den Attributeditor. Dieser läßt sich entweder aus dem Layer-Definitions-Formular über den Button 'erweiterte Einstellungen' oder direkt über 'go=Attributeditor' aufrufen. Der Attributeditor zeigt alle Attribute des ausgewählten Layers an. Attributeditor

Folgende Formularelementtypen stehen zur Auswahl:

Text

Im generischen Layereditor erscheint ein einzeiliges Eingabefeld.

Text automatisch generieren
Es gibt die Möglichkeit den Wert des Textfelds automatisch generieren zu lassen. Im Optionenfeld kann man ein beliebiges SQL definieren, welches auch dynamisch sein kann, indem die Werte der anderen Attribute über $<attributename> einbezogen werden können. Hat ein Textfeld einen Eintrag im Optionenfeld, erscheint neben dem Attribut ein Button "automatisch generieren", der den neuen Wert entsprechend des SQL-Statements berechnet.
automatisch generieren.png
Beispiel: Man hat einen Layer Rechnungen und will für das Attribut Rechnungsnummer den Wert generieren lassen. Die Rechnungsnummer hat folgende Form: <Jahr>-<KundenNr>-<laufendeNummer>. Eine neue Rechnungsnummer soll sich also aus dem aktuellen Jahr, der Kundennummer des aktuellen Auftrags und der um 1 erhöhten laufenden Nummer der letzten Rechnungsnummer des Kunden ergeben.
Im Optionenfeld definiert man dazu folgendes SQL:
SELECT substr(EXTRACT(YEAR FROM CURRENT_DATE)::text, 3) ||'-'|| substr(r.rechnungsnummer, 4, 4) || lpad((substr(r.rechnungsnummer, 8, 3)::integer + 1)::text, 3, '0')
FROM buchung.rechnungen as r, buchung.auftraege as a 
WHERE substr(r.rechnungsnummer, 4, 3) = lpad(a.kunde_id::text, 3, '0') 
AND a.auftrag_id = $auftrag_id
ORDER BY rechnungsnummer DESC limit 1
Text mit einem Eingabewerkzeug generieren
Es gibt die Möglichkeit den Wert des Textfeldes mit Hilfe eines separaten Eingabewerkzeugs zu generieren. Mit Eingabewerkzeug ist hier eine eigenständige Webseite gemeint, welche die ID des Textfelds übergeben bekommt und am Ende den generierten Text in das Textfeld zurückschreibt. Wie der Text auf der Webseite generiert wird, ist völlig beliebig. Beispiele für Eingabewerkzeuge sind z.B. ein SQL-Query-Builder, ein RGB-Color-Chooser oder ein Date-Picker.
Die URL der Webseite, die verwendet werden soll, wird in das Optionenfeld eingetragen. Die URL kann auch dynamisch sein, indem die Werte der anderen Attribute über $<attributename> einbezogen werden können. Neben dem Textfeld erscheint dadurch ein Button "Eingabewerkzeug verwenden". Klickt man auf diesen, wird die Webseite über ein iframe aufgerufen und der Parameter "field_id" übergeben. Das ist die ID des Textfelds, welche von der Webseite am Ende verwendet werden kann, um den generierten Text in das Textfeld zu schreiben. Dies kann auf der Webseite z.B. folgendermaßen ablaufen:
Es gibt ein Hidden-Feld, welches die übergebene ID aufnimmt:
<input type="hidden" id="field_id" value="<? echo $_REQUEST['field_id']; ?>">
Es gibt eine Funktion setValue, welche am Ende, z.B. bei Klick auf einen "Übernehmen"-Button, den Text in das Textfeld schreibt:
function setValue(){
	field_id = document.getElementById('field_id').value;
	top.document.getElementById(field_id).value = 'neuer Wert';
	top.closeCustomSubform();
}
Der String 'neuer Wert' ist in der Funktion natürlich durch eine Variable zu ersetzen, welche den generierten Text enthält.
Ist das Attribut in der Datenbank vom Typ date oder time, wird neben dem Namen des Attributes in der Suche und der Sachdatenanzeige ein Kalendersymbol angezeigt. Ein Klick auf das Symbol öffnet einen Kalender zur Auswahl eines Tages.
Ist das Format time, wird nach der Auswahl im Kalender an das Datum im Formularfeld eine 00:00:00 an das Datum angehängt.
Zahl
Dieser Typ kann für numerische Werte verwendet werden. Die Zahlen werden mit einem Punkt als Tausendertrenner und einem Komma als Dezimaltrenner angezeigt (1.234.567,89).
Textfeld
Im generischen Layereditor erscheint ein mehrzeiliges Eingabefeld. Genauso wie beim Typ "Text" besteht auch hier die Möglichkeit den Wert automatisch generieren zu lassen oder ein Eingabewerkzeug zu verwenden.
Auswahlfeld
Im generischen Layereditor erscheint ein Auswahlfeld. Um die Optionen der Auswahl zu generieren, gibt es mehrere Möglichkeiten:


  • In der Datenbank wird zu dem entsprechenden Attribut ein Check-Constraint definiert, das die möglichen Eingabewerte einschränkt, wie z.B.
CONSTRAINT art CHECK (art::text = 'gjb'::text OR art::text = 'ejb'::text OR art::text = 'tjb'::text)
In diesem Fall wird der Formularelementtyp dieses Attributes automatisch vom Typ Auswahlfeld und kann auch nicht verändert werden. Im GLE erscheint ein Auswahlfeld mit den durch das Constraint bzw. dem ENUM-Datentyp vorgegebenen Werten als Optionen. Bei Auswahl einer Option durch den Nutzer wird genau der Text der Auswahl in das entsprechende Attribut geschrieben.


  • Für das Attribut in der Datenbank wird einen ENUM-Datentyp definiert, der die möglichen Eingabewerte einschränkt, z.B. so:
CREATE TYPE bezirksarten AS ENUM ('gjb', 'ejb', 'tjb');
CREATE TABLE jagdbezirk (
   name text,
   art bezirksarten 
);
Auch in diesem Fall wird der Formularelementtyp dieses Attributes automatisch vom Typ Auswahlfeld und kann auch nicht verändert werden. Im GLE erscheint ein Auswahlfeld mit den durch das Constraint bzw. dem ENUM-Datentyp vorgegebenen Werten als Optionen. Bei Auswahl einer Option durch den Nutzer wird genau der Text der Auswahl in das entsprechende Attribut geschrieben.


  • Im Feld Optionen können die Auswahlmöglichkeiten festgelegt werden. Dabei wird dieselbe Syntax verwendet, wie bei Definition eines ENUM-Typs (die Werte dürfen allerdings kein Komma enthalten). Also
'Wert1','Wert2','Wert3'


  • Die Auswahlmöglichkeiten können aus einer Schlüsseltabelle ausgelesen werden. Im Optionen-Feld wird ein entsprechendes SQL-Statement angegeben. Es muss definiert werden, aus welchem Feld der Schlüsseltabelle der Text der Auswahlmöglichkeiten kommt und aus welchem Feld der Schlüsseltabelle der Wert kommt, der in die Datenbank geschrieben werden soll. Das Statement hat dabei folgende Form:
select <Ausgabespalte> as output, <Schlüsselspalte> as value from <Tabellenname>
Beispiel: Man hat eine Tabelle "projekte", mit den Spalten "projektnr" und "projektname". Im Auswahlfeld sollen nun die Projektnamen aufgelistet werden. Wählt man einen der Projektnamen aus, soll nach Absenden des Formulars die zugehörige Projektnummer übergeben werden. Dazu muß das SQL-Statement folgendermaßen aussehen:
select projektname as output, projektnr as value from projekte
Um doppelte Nennungen zu vermeiden, verwendet man noch ein "distinct":
 select distinct <Ausgabespalte> as output, <Schlüsselspalte> as value from <Tabellenname>
Eine alphabetische Sortierung der Optionen in der Auswahl (hier Projektnamen) erhält man durch ein angehängtes ORDER BY output
 select <Ausgabespalte> as output, <Schlüsselspalte> as value from <Tabellenname> ORDER BY output


  • Auch ohne Schlüsseltabelle können Anzeigetext und zu speichernder Wert definiert werden. Im Optionen-Feld wird ein entsprechendes SQL-Statement angegeben. Sollen z.B. als Werte 0 oder 1 gespeichert und im Auswahlfeld "nein" oder "ja" angezeigt werden, kann man das SQL-Statement z.B. so definieren:
select 'f' as value, 'nein' as output UNION select 't' as value, 'ja' as output
(Achtung: Hier wird nach value sortiert!)


Verknüpfungen von Layern
Wenn es einen Layer gibt, der den Daten im Auswahlfeld entspricht, hat man die Möglichkeit, beide Layer zu verknüpfen. Dazu werden im Optionenfeld nach dem SQL weitere Optionen angehängt. Diese werden mit einem ";" eingeleitet. Durch die Angabe von "layer_id=???" wird der zweite Layer definiert. Im Beispiel könnte das z.B. so aussehen:
select projektname as output, projektnr as value from projekte;layer_id=12
Im GLE erscheint dadurch, wenn das entsprechende Recht gesetzt ist, hinter dem Auswahlfeld ein Link "neu". Dieser öffnet ein neues Fenster und führt direkt zur Erfassung eines neuen Datensatzes des zweiten Layers (im Beispiel ein neues Projekt). Weiterhin hat man die Möglichkeit, die Erfassung des neuen Datensatzes auch ohne ein neues Fenster zu öffnen direkt im Hauptformular durchzuführen. Dazu fügt man im Optionenfeld die Option "embedded" hinzu (durch ein Leerzeichen getrennt). Im Beispiel also so:
select projektname as output, projektnr as value from projekte;layer_id=12 embedded
Dadurch erscheint mit dem Klick auf "neu" das Formular zur Erfassung des neuen Datensatzes direkt unter dem Auswahlfeld. Man kann nun den neuen Datensatz erzeugen und nach dem Klick auf Speichern schließt sich das eingebettete Formular und der neue Datensatz wird den Auswahlmöglichkeiten des Auswahlfeldes hinzugefügt und selektiert. Diese Variante der Layerverknüpfung entspricht einer n:1 Beziehung und ist eine Alternative zu "SubformFK".


Attributabhängige Auswahllisten
Die Optionen in einem Auswahlattribut können von der Auswahl in einem anderen Attribut abhängig sein. Der generische Layereditor ermöglicht die Definition von sogenannten attributabhängige Auswahllisten. Dafür muss immer ein Attribut definiert werden, dass die übergeordnete Auswahl ermöglicht sowie ein Attribut, dass die abhängige Auswahl liefert. Hier ein Beispiel: Es gibt ein Auswahlattribut flurnummer, welches die Fluren einer bestimmten Gemarkung anzeigen soll. Die Gemarkung wird zuvor in einem Auswahlattribut gemarkung ausgewählt.
Das übergeordnete Attribut gemarkung, welches die Gemarkungen auflistet, hat z.B. folgende SQL-Definition Optionen-Feld:
select gemarkung_schluessel as value, gemarkung_name as output from regis.gemarkungen <required by>flurnummer</required by>
Das abhängige Attribut flurnummer, das nur die Fluren der zuvor ausgewählten Gemarkung listet, hat z.B. folgende SQL-Definition Optionen-Feld:
select flur as value, flur as output from regis.fluren as f WHERE f.gemarkung_schluessel = <requires>gemarkung</requires>
Sortierungen mit "ORDER BY" am Ende sind möglich: Bei <requires>...</requires> dahinter, bei <required by>...</required by> davor.
Es ist darauf zu achten, dass das übergeordnete Attribut im Query-Statement des Layers VOR dem abhängigen Attribut aufgezählt wird (hier: gemarkung vor flurnummer). Also in der logischen Reihenfolge, in der man als Nutzer auch beide Auswahlfelder im GLE nacheinander auswählen würde. Die Anzahl der abhängigen Attribute ist jedoch nicht auf ein Attribut beschränkt, so dass sich auch mehrere abhängige Attribute, durch Komma getrennt, definieren lassen. Beispiel:
select gemarkung_schluessel as value, gemarkung_name as output from regis.gemarkungen <required by>flur,gemeinde</required by>
Auch die Anzahl der erforderlichen Attribute in der Definition eines abhängigen Attributes ist nicht auf ein Attribut beschränkt. Beispiel für ein Attribut flurstueckskennzeichen, welches von gemarkung und flurnummer abhängig sein soll:
select flurstuecksnummer as value, flurstuecksnummer as output from regis.flurstuecke where flur = <requires>flurnummer</requires> AND gemarkung_schluessel = <requires>gemarkung</requires>


Das abhängige Attribut muss nicht unbedingt ein Auswahlfeld sein. Es kann auch vom Typ Text sein. Dann wird es nur mit dem ersten Datensatz, die die SQL-Abfrage zurückliefert befüllt.


Auch das übergeordnete Attribut muss nicht unbedingt ein Auswahlfeld sein. Es kann ebenfalls vom Typ Text sein (das abhängige Attribut muss dann aber zwingend ein Auswahlfeld sein). Es ist nur darauf zu achten, dass im übergeordneten Attribut der richtige (richtig geschriebene) Wert steht.


Stellenabhängige Auswahllisten
Es besteht auch die Möglichkeit, die Auswahlmöglichkeiten abhängig von der aktuellen Stelle zu machen. Dafür kann man im SQL das Schlüsselwort $stelleid verwenden, welches dann durch die aktuelle Stellen-ID ersetzt wird. Dies macht insbesondere dann Sinn, wenn die Auswahlmöglichkeiten auch einem Layer entsprechen und verschiedene Stellen in diesem Layer neue Auswahlmöglichkeiten erfassen können aber jede Stelle nur die eigenen Auswahlmöglichkeiten sehen soll. Wenn in diesem Layer ein Attribut vom Typ StelleID existiert, wodurch jedesmal automatisch die Stellen-ID gespeichert wird, kann diese Spalte dann im Auswahlfeld-SQL zusammen mit dem Schlüsselwort $stelleid verwendet werden, um die Auswahlmöglichkeiten auf die Stelle einzuschränken.
Autovervollständigungsfeld

Ein Attribut dieses Formularelementtyps wird zunächst als normales Textfeld dargestellt. Bei jeder Tasteneingabe in diesem Feld wird jedoch eine Liste an möglichen Werten angezeigt, die die bisherige Eingabe vervollständigen. Eine dieser Möglichkeiten kann dann ausgewählt und der Wert übernommen werden. Es ist nicht möglich einen Wert in das Feld einzutragen, den es im Datenbestand nicht gibt. Der Wert des Feldes wird in diesem Fall immer wieder auf den Ausgangswert zurückgesetzt. Damit erfüllt dieser Formularelementtyp die gleiche Funktion wie das Auswahlfeld, indem beliebige Nutzereingaben unterbunden werden. Auch die Definition der Auswahlmöglichkeiten erfolgt nach dem gleichen Schema, wobei hier am Ende immer eine WHERE-Bedingung stehen muss:

select <Ausgabespalte> as output, <Schlüsselspalte> as value from <Tabellenname> where 1=1

Dieser Formularelementtyp eignet sich insbesondere für Attribute, bei denen die Liste an Auswahlmöglichkeiten sehr lang ist und ein normales Auswahlfeld ungeeignet wäre. Z.B. ist dieser Formularelementtyp bei SubFormFK-Layerverknüpfungen als Typ für das Verknüpfungsattribut zu empfehlen, falls dieses editiert werden soll.

Verknüpfungen von Layern
Wenn es einen Layer gibt, der den Daten im Auswahlfeld entspricht, hat man, wie auch schon beim Auswahlfeld, die Möglichkeit, beide Layer zu verknüpfen. Dazu werden im Optionenfeld nach dem SQL weitere Optionen angehängt. Diese werden auch hier mit einem ";" eingeleitet. Durch die Angabe von "layer_id=???" wird der zweite Layer definiert
Im GLE erscheint dadurch, wenn das entsprechende Recht gesetzt ist, hinter dem Autovervollständigungsfeld ein Link "neu". Dieser öffnet ein neues Fenster und führt direkt zur Erfassung eines neuen Datensatzes des zweiten Layers. Weiterhin hat man die Möglichkeit, die Erfassung des neuen Datensatzes auch ohne ein neues Fenster zu öffnen direkt im Hauptformular durchzuführen. Dazu fügt man im Optionenfeld die Option "embedded" hinzu (durch ein Leerzeichen getrennt). Dadurch erscheint mit dem Klick auf "neu" das Formular zur Erfassung des neuen Datensatzes direkt unter dem Auswahlfeld.
SubformPK

Mit diesem Formularelementtyp lassen sich 2 Layer miteinander verknüpfen. Der Benutzer kann in kvwmap über einen Link, der in einem Layer erscheint, direkt in einen zweiten Layer "springen", der Daten enthält, die in Abhängigkeit zum ersten Layer stehen. Das "PK" steht für Primärschlüssel und damit für die Art der Verknüpfung.

Beispiel: Man hat einen ersten Layer 'Verpachtungen' und einen zweiten Layer 'verpachtete Flurstücke'. Beide Layer bilden eine 1:n Beziehung, d.h. eine Verpachtung kann mehrere Flurstücke haben, ein verpachtetes Flurstück ist aber immer genau einer Verpachtung zugeordnet.


Ein eindeutiger Identifikator des ersten Layers, meistens gleichzeitig der Primärschlüssel auf Datenbankebene, wird als sog. "Verknüpfungsattribut" verwendet.

Beispiel: Der Primärschlüssel der Verpachtungen sei hier 'lfdnr'. Im zweiten Layer 'verpachtete Flurstücke' gibt es ebenfalls ein Attribut 'lfdnr', darüber sind beide Layer verknüpft. Weiß man die lfdnr einer Verpachtung, kann man auch alle zugehörigen Flurstücke abfragen.


Um 2 Layer über SubformPK auf diese Weise zu verknüpfen, müssen folgende Voraussetzungen erfüllt sein:

  • Der erste Layer muss einen eindeutigen Identifikator besitzen),
  • Der zweite Layer muss ein Attribut besitzen, welches genau so heißt wie der eindeutige Identifikator des ersten Layers,
  • Außerdem muss in der Query des ersten Layers ein Attribut definiert werden, welches die Verlinkung zum zweiten Layer herstellt. Der Wert dieses Attributs erscheint als Link und dient als "Vorschau" auf die entsprechenden Datensätze des zweiten Layers.
Beispiel: Der zweiten Layer 'verpachtete Flurstücke' enthält ein Attribut "flurstueckskennzeichen", das als Vorschau herangezogen werden kann.
  • Für den ersten Layer muss im Attributeditor beim Vorschau-Attribut als Typ 'SubformPK' ausgewählt werden. Im Feld Optionen wird die Layer-ID des zweiten Layers eingetragen und, durch Komma getrennt, der eindeutige Identifikator. (Primärschlüsselattribut) des ersten Layers.
Beispiel: "152,lfdnr"
Wenn beide Layer über mehrere Attribute verknüpft sind, muss man die entsprechenden Attribute, mit Kommas getrennt, hinter das Primärschlüsselattribut schreiben.
Beispiel: "152,lfdnr,gemkgschl,flur,flurstkennz"

Weitere Optionen (werden mit einem ";" abgetrennt):

  • no_new_window - bewirkt, dass der Link zum verknüpften Layer kein neues Fenster öffnet


Im Query-Statement des ersten Layers kann für das Vorschau-Attribut eine Aggregationsfunktion verwendet werden, um die verknüpften Datensätze zusammenzufassen. Also beispielsweise die Ausgabe der Anzahl der Flurstücke oder die Hintereinanderreihung der Flurstückskennzeichen. Das ist deswegen sinnvoll, damit der Nutzer in der Suche in diesem Verknüpfungsattribut auch suchen kann. Solange im abhängigen zweiten Layer noch kein Datensatz angelegt wurde, der mit einem Datensatz im übergeordneten ersten Layer verknüpft ist, ergibt sich eine Anzahl von 0 Treffern. Damit der "anzeigen"-Button in diesem Fall nicht erscheint, kann die Aggregationsfunktion mit einem CASE ergänzt werden, der für den Fall 0 Treffer einfach einen Leertext ausgibt (In SQL: 2 Hochkomma).


Bei einer 1:n Beziehung möchte man meistens, dass wenn man im ersten Layer einen Datensatz löscht, dann auch die nachgeordneten Datensätze des zweiten Layers (automatisch) gelöscht werden. Das geht am elegantesten, wenn man auf Datenbankebene einen CONSTRAINT in Form eines FOREIGN KEY in der Tabelle des zweiten Layers eingefügt (hierfür MUSS der eindeutige Identifikator wirklich auch ein Primärschlüssel sein):

ALTER TABLE <Name der Tabelle des zweiten Layers>
ADD CONSTRAINT "<irgendein Constraint-Name>" Foreign KEY (<Tabellen-Attributname des zweiten Layers, das der Verknüpfung dient>)
     REFERENCES <Name der Tabelle des ersten Layers> (<Name des Primärschlüsselattributs>) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE CASCADE
Beispiel:
 ALTER TABLE flurstuecke_verpachtet
 ADD CONSTRAINT "fkfstverpachtet" Foreign KEY (lfdnr)
     REFERENCES verpachtungen (lfdnr) MATCH SIMPLE
     ON UPDATE NO ACTION ON DELETE CASCADE



SubformFK

Auch mit diesem Formularelementtyp lassen sich 2 Layer miteinander verknüpfen. Das "FK" steht für Foreign Key (Fremdschlüssel) und damit für die Art der Verknüpfung.

Beispiel: Der erste Layer sei wieder 'Verpachtungen'. Der zweite Layer ist diesmal ein Layer 'Personen'. Verknüpft ist jeweils die Person, die die Pacht bezahlt (Zahler).


In diesem Fall gibt es eine n:1 Beziehung, da eine Verpachtung nur einen Zahler haben kann aber ein Zahler mehrere Verpachtungen. Hier kann also nicht der Primärschlüssel der Verpachtung als Verknüpfungsattribut verwendet werden, da ein Zahler nicht eindeutig einer Verpachtung zugeordnet ist. Stattdessen muss im zweiten Layer ein eindeutiger Identifikator vorhanden sein, der für die Verknüpfung verwendet werden kann. Dieser muss als Attribut auch im ersten Layer vorhanden sein.

Beispiel: Im zweiten Layer existiert ein Primärschlüsselattribut 'personennr'. Im Layer 'Verpachtungen' gibt es auch ein entsprechendes Attribut 'personennr' und darüber sind beide Layer verknüpft. Weiß man die personennr einer Verpachtung kann man den entsprechenden Datensatz im Layer 'Personen' abfragen.


Um 2 Layer auf diese Weise zu verknüpfen, müssen folgende Voraussetzungen erfüllt sein:

  • Der zweite Layer muss einen eindeutigen Identifikator besitzen,
  • Der erste Layer muss ein entsprechendes Attribut besitzen, welches genauso heißen muss,
  • Außerdem muss es ein Attribut geben, welches im ersten Layer einen Bezug zum zweiten Layer herstellt. Dieses Attribut dient als eine Art Vorschau auf den entsprechenden Datensatz des zweiten Layers.
Beispiel: Im Layer 'Personen' gibt es ein Attribut 'Zahler'.

Im Query-Statement können für dieses Attribut auch einige Spalten des zweiten Layers zusammengefasst abgefragt werden, um zu einer sprechenden Vorschau-Anzeige zu kommen.


  • Für den ersten Layer muss im Attributeditor beim Vorschau-Attribut als Typ 'SubformFK' ausgewählt werden.
  • Im Feld Optionen wird die Layer-ID des zweiten Layers eingetragen und, durch Komma getrennt, der eindeutige Identifikator des ersten Layers.
Beispiel: "137,personennr"


Wenn beide Layer über mehrere Attribute verknüpft sind, muss man die entsprechenden Attribute, mit Kommas getrennt, hinter das Primärschlüsselattribut schreiben.

Beispiel: "481,bezirk,blatt,bvnr"


Weitere Optionen (werden mit einem ";" abgetrennt):

  • no_new_window - bewirkt, dass der Link im gleichen Browser-Fenster bzw. Browser-Tab angezeigt wird.


In kvwmap muss ein Layer nicht notwendigerweise eine Geometrie haben. Wie im oben genannten Beispiel kann es z.B. einen Layer 'Personen' geben, dessen Datensätze dann nur über die Layer-Suche oder über Verknüpfungen mit anderen Layern erreichbar sind. Für einen solchen Layer setzt man minscale und maxscale einfach auf "-1", damit erscheinen diese dann auch nicht in der Legende.

Das folgende Bild zeigt, wie der GLE für die 3 verschiedenen Beispiel-Layer aussieht. Hinter den beiden Vorschauattributen 'Flurstücke' und 'Zahler' gibt es 2 Links 'bearbeiten' und 'neu', über die man die entsprechenden Datensätze der beiden verknüpften Layer aufrufen, bzw. neue erzeugen kann.

Subformpk.jpg



SubformEmbeddedPK

Dieser Formularelementtyp kann anstelle des SubfromPK-Typs verwendet werden, wenn die Datensätze des verknüpften Layers nicht in einer extra Sachdatenanzeige dargestellt werden sollen, sondern in Listenform eingebettet innerhalb des Hauptformulars.

Es wird eine Liste der verknüpften Datensätze angezeigt, wobei hier ausgewählte Attribute des zweiten Layers als Vorschau verwendet wird. Diese Vorschau ist gleichzeitig ein Link, der zur normalen Sachdatenanzeige des entsprechenden Datensatzes des zweiten Layers führt.

Die Einstellungen im Attribut-Editor sind die gleichen, wie bei SubformPK, nur dass hier noch der Name des Vorschau-Attributes im Optionen-Feld angehangen wird: <Layer-ID>,<primarykey>,<Name Vorschau-Attribut>

Beispiel: "152,vorhaben_id,vorgangsart"

Es können auch mehrere Attribute des zweiten Layers und auch zusätzlicher Text in der Vorschau verwendet werden. Wichtig ist nur, dass jedes Attribut mit einem Leerzeichen von anderen Attributen bzw. zusätzlichem Text abgetrennt ist.

Beispiel: "152,vorhaben_id,Vorgangsart: vorgangsart vorgangs_id"


Weitere Optionen (werden mit einem ";" abgetrennt):

  • no_new_window - bewirkt, dass der Link zum verknüpften Layer kein neues Fenster öffnet
  • embedded - bewirkt, dass die Formulare des verknüpften Layers direkt im Hauptformular erscheinen
Beispiel: "152,vorhaben_id,vorgangsart;embedded"


Die Datensätze des verknüpften Layers werden in Listenform angezeigt. Mit der Zusatzoption "embedded" wird das Formular des verknüpften Layers direkt im Hauptformular angezeigt.


Das Attribut, das der Verknüpfung dient (im obigen Beispiel "Vorgänge"), ist nicht Bestandteil des ersten Layers, sondern wird in der Query eingefügt. Das heißt, der (scheinbare) Inhalt des Attributs (die "Vorschau") erscheint weder im CSV-Export noch in der Fachdatensuche. Damit im CSV-Export trotzdem der angezeigte Vorschau-Inhalt als Feld-Inhalt erscheint bzw. damit man in der Fachdatensuche trotzdem auch in diesem Attribut nach Inhalten suchen kann, muss ein sog. "Array" für dieses Feld definiert werden. Im Query-Statement steht sowas wie

SELECT vorhaben_id, ..., '' as vorgaenge, ..., FROM bauvorhaben WHERE 1=1

Statt der beiden Hochkommas wird nun ein Array erzeugt und als Text ausgegeben:

SELECT vorhaben_id, ..., 
array2string(array(select vorgangsart from bauantraege as a where a.vorhaben_id=v.vorhaben_id)) as vorgaenge,
..., FROM bauvorhaben AS v WHERE 1=1

array2string ist eine Funktion, die PostgreSQL nicht kennt. Sie muss angelegt werden:

CREATE OR REPLACE FUNCTION array2string(text[])
 RETURNS text AS
$BODY$SELECT array_to_string($1,cast(', ' as text))$BODY$
 LANGUAGE sql IMMUTABLE STRICT
 COST 100;

Wenn man 2 Layer über SubformEmbeddedPK verknüpft hat und beide Layer eine Geometrie haben, dann wird beim Klick auf "neu" zum Erfassen eines neuen Datensatzes im untergeordneten Layer auf das Objekt des übergeordneten Datensatzes gezoomt.

Beispiel: Man hat einen Layer 'Strassen' und einen verknüpften Layer 'Verkehrsschilder'. Beide haben Geometrien. Jetzt sucht man über die Layersuche nach einer Strasse und bekommt die Sachdatenanzeige dieser Strasse. Wenn man jetzt zu dieser Strasse ein neues Verkehrsschild erfassen möchte und auf "neu" klickt, wird automatisch auf das Strassenobjekt gezoomt.

Ist das Vorschau-Attribut im verknüpften Layer vom Typ "Dokument", so werden die Vorschau-Bilder der jeweiligen Dokumente untereinander in Listenform angezeigt:

Dokumente.jpg



Zeitstempel
Dieser Attributtyp setzt immer zum Zeitpunkt der Speicherung automatisch einen Zeitstempel.
Wenn der Typ in der Datenbank text, character, character varying oder eine Form von time ist, setzt sich der Zeitstempel aus Datum und Zeit zusammen. Ist der Typ date, wird nur das aktuelle Datum gespeichert.
Der Typ hat keine Optionen und Felder vom Typ Zeitstempel sind nicht editierbar, egal welche Rechte gesetzt sind.
Wenn der Datenbanktyp time oder date ist, wird in der Suche und der Sachdatenanzeige ein Kalendersymbol neben dem Attributnamen angezeigt.
Das Kalendersymbol ist jedoch beim Typ Zeitstempel nicht anklickbar, weil das Feld nicht editierbar ist.
Wer ein Zeit oder Datumsfeld editierbar haben möchte, muss andere editierbare Typen wie Text oder Auswahlfeld benutzen.
Dokument
Hier kann eine beliebige Datei hochgeladen werden. Die Dateien werden im Ordner 'CUSTOM_IMAGE_PATH' bzw. in dem Dokumentenordner des Layers abgelegt. Je nach Dateityp erscheint in der Sachdatenanzeige ein passendes Vorschaubild mit einem Link auf das Original.
Die Dateien werden auf dem Server nicht mit ihren ursprünglichen Dateinamen abgelegt, sondern bekommen einen Namen, der sich aus dem Zeitstempel und einer Zufallszahl zusammensetzt. Dadurch werden die Dateien nicht überschrieben, wenn gleichnamige Dateien hochgeladen werden. Bei der Anzeige bzw. dem Download der Dateien in kvwmap erscheint wieder der ursprüngliche Dateiname.
Neben dieser standardmäßigen Variante der Dateiablage auf dem Server lassen sich die Dateinamen und auch die Verzeichnisstruktur unterhalb des Dokumentenordners für jeden Layer frei definieren. Dazu besteht die Möglichkeit im Attributeditor im Optionenfeld des Dokumenten-Attributs eine beliebige SQL-Abfrage zu definieren. Die Abfrage muss als Ergebnis die Ordnerstruktur unterhalb des Dokumentenordners inklusive des Dateinamens - aber ohne Dateiendung - liefern.
Wenn man die Dateien in einem Unterordner "kvwmap-like" ablegen will, d.h. mit einem Zufallsnamen bestehend aus timestamp und sechstelliger Zufallszahl, dann kann die Option beispielsweise so formuliert sein:
select 'unterordner/' || to_char(current_timestamp, 'YYYY-MM-DD_HH_MM_SS') || '-' || ceil(random() * 1000000)
Werte der Attribute dieses Layers können über "$<attributname>" in die Abfrage einbezogen werden, so dass der Dateiname aus den Attributen des zugehörigen Datensatzes erzeugt wird. Vorsicht bei Verwendung von Serial-Attributen: Das Select muss dann berücksichtigen, dass es den Datensatz bei einem INSERT noch gar nicht gibt und das Serial-Attribut keinen Wert liefert.
Es lassen sich sogar variabel weitere Unterordner in diesem Unterordner anlegen.
Beispiel: Man hat einen Dokumentenlayer mit einem fortlaufenden Attribut "doc_id". In diesem Layer gibt es sehr viele Dokumente und da diese nicht alle einzeln im Dokumentenordner des Layers liegen sollen, möchte man weitere Unterordner dazwischen einfügen. Es sollen maximal 100 Dateien in jedem Unterordner abgelegt werden. Dazu definiert man im Optionenfeld folgende SQL-Abfrage:
select doc_id/100 || '/' || doc_id from (select CASE WHEN '$doc_id' = '' THEN last_value + 1 ELSE ('$doc_id'||0)::integer / 10 END as doc_id from dokumente_doc_id_seq) as foo
Auf Basis der fortlaufenden Nummer "doc_id" wird ein Pfad generiert, welcher z.B. für die doc_id "3456" folgendermaßen aussieht: "34/3456". Die Datei bekommt also den Namen der doc_id "3456" und wird in einem Unterordner "34" abgelegt. Die Unterabfrage mit der CASE-Bedingung dient dazu, die beiden Fälle Änderung und Neuerfassung zu unterscheiden. Bei einer Änderung eines bestehenden Datensatzes soll die vorhandene doc_id genommen werden und bei Erfassung eines neuen Datensatzes die nächsthöhere Nummer aus der entsprechenden Sequenz.
Link
Verwendet den Wert des Attributes des Datensatzes als href für einen Link. Ist der Link vollständig, also beginnt mit http, wird der Link in einem neuen Tab geöffnet (target=_blank) ansonsten, bei einer relativen URL z.B. index.php?go=xy, nicht.
Bei Schreibrecht erscheint der Link über dem Eingabefeld. Bei nur Leserecht erscheint nur der Link.
Im Optionenfeld kann ein Linktext eingegeben werden, wird nichts eingegeben, wird der letzte Teil der URL als Linktext angezeigt.
dynamischer Link
Der dynamische Link ermöglicht es, eine URL aufzurufen, die von bestimmten Attributen des Layers abhängig ist. D.h. die URL besteht zum einen aus festen Teilen, die immer gleich sind und aus variablen Teilen, welche sich aus den Attributwerten des jeweiligen Datensatzes ergeben. Der dynamische Link wird im Unterschied zum normalen Link-Typ nicht in einer PostGIS-Datenbanktabelle gespeichert, d.h. hier wird keine Tabellenspalte benötigt, stattdessen wird ein Pseudo-Attribut in das Query-Statement aufgenommen. Die dynamische URL zu diesem Attribut wird im Attributeditor im Optionenfeld definiert. Die variablen Teile der URL, die dann später durch die Attributwerte ersetzt werden, werden in der Form $<attributname> in die URL aufgenommen. Wichtig dabei ist, dass nur die Attributnamen als Variablen verwendet werden können, die das Layer-Recht lesen oder editieren haben und auch das Pseudo-Attribut auf lesen gesetzt sein muss.
Ein Beispiel: Man hat einen Layer Schulen. Dieser besitzt u.a. zwei Attribute lat und long, für die geografische Breite und Höhe. Es gibt außerdem eine externe Webanwendung, die eine Bushaltestellensuche über einen URL-Aufruf anbietet. Man kann nun der Sachdatenanzeige des Layers Schulen einen dynamischen Link hinzufügen, welcher alle Bushaltestellen in der Umgebung der Schule sucht. Dazu erweitert man das Query-Statement des Layers Schulen um ein Pseudo-Attribut bushaltestellen. Also z.b. so
SELECT *, '' as bushaltestellen FROM schulen WHERE 1=1
Im Attributeditor kann man nun für das Attribut bushaltestellen den Formularelementtyp "dynamischer Link" auswählen. Im Optionenfeld trägt man nun folgendes ein:
http://www.bushaltestellensuche.de?latitude=$lat&longitude=$long&umkreis=10
Dadurch erhält man in der Sachdatenanzeige für jede Schule einen Link, der die Bushaltestellen in der Umgebung sucht.
Weitere Optionen (werden mit einem ";" abgetrennt):
  • <Linktext> - 1. Option nach der URL kann ein Linktext angegeben werden, der dann anstatt der kompletten URL angezeigt wird
  • no_new_window - 2. Option bewirkt, dass der Link zum verknüpften Layer kein neues Fenster öffnet
  • embedded - 2. Option bewirkt, dass der Link nicht auf eine neue Seite verweist, sondern den Inhalt der aufgerufenen Seite direkt im Hauptformular anzeigt
  • all_not_null - 3. Option bewirkt bei URL's mit mehreren Variablen, dass der Link nur angezeigt wird, wenn alle in der URL angegebenen Attribut-Variablen einen Wert != '' haben.
Es ist nur möglich, den "<Linktext>" mit jeweils einer der beiden 2. Optionen "no_new_window" oder "embedded" zu kombinieren.
Wenn all_not_null nicht gesetzt ist, wird ein Link schon gezeichnet, wenn nur eine der in der URL verwendeten Attribut-Variable != '' ist.


Der dynamische Link ist auch eine Alternative der Verknüpfung von zwei Layern, insbesondere wenn es sich um eine 1:1-Verknüpfung handelt. Da auf denselben Server verwiesen wird, kann dieser Teil der URL entfallen, Beispiel:
index.php?go=Layer-Suche_Suchen&selected_layer_id=38&value_fundplatzid=$fundplatzid&operator_fundplatzid==;anzeigen;no_new_window


MailTo
Dieser Formularelementtyp kann für Email-Adressen verwendet werden. Sie werden damit als mailto-Link dargestellt und mit dem Email-Programm geöffnet.
User
Hier kann nichts eingegeben werden, stattdessen wird der aktuelle Nutzer gespeichert.
UserID
Hier kann nichts eingegeben werden, stattdessen wird die aktuelle Nutzer-ID gespeichert. Die Nutzer-ID kann in der Filterverwaltung verwendet werden, um Datensätze in einer Stelle nutzerbezogen zu filtern.
Stelle
Hier kann nichts eingegeben werden, stattdessen wird die aktuelle Stelle des Nutzers gespeichert.
StelleID
Hier kann nichts eingegeben werden, stattdessen wird die aktuelle Stellen-ID des Nutzers gespeichert. Die Stellen-ID kann in der Filterverwaltung verwendet werden, um Datensätze in einer Stelle auf eine konkrete Stelle zu filtern.
Fläche
Hier kann nichts eingegeben werden, stattdessen wird die Fläche der Polygon-Geometrie gespeichert.
Länge
Hier kann nichts eingegeben werden, stattdessen wird die Länge der Linien-Geometrie gespeichert.
Checkbox
Erzeugt eine Checkbox, welche angehakt werden kann. Dieser Typ ist für Attribute vom Datentyp "boolean" gedacht. Auf Datenbankebene sollten diese Attribute nicht als NOT NULL definiert werden, weil für den Nutzer sonst der irrige Eindruck entsteht, er MUSS einen Haken setzen.


Attributeditor - Aliasname

Wenn ein Attribut in den Formularen und der Sachdatenanzeige nicht so angezeigt werden soll, wie er in der Layerdefinition benannt ist, kann ein Aliasname vergeben werden. Der Aliasname kann Lehr- und Sonderzeichen sowie Groß- und Kleinschreibung beinhalten.

Attributeditor - Gruppierung von Attributen

Damit die Attribute in der Sachdatenanzeige gruppiert angezeigt werden, kann man ihnen im Attributeditor Gruppennamen zuordnen. Alle Attribute mit dem selben Gruppennamen werden zu einer Gruppe zusammengefasst, wobei die Attribute schon in der richtigen Reihenfolge sein müssen. Die Gruppen lassen sich im GLE auf- und zuklappen. Hängt man an den Gruppennamen noch ";collapsed" an, ist diese Gruppe schon zu Beginn zugeklappt.

Attributeditor - Anordnung von Attributen

Die Attribute werden immer in der Reihenfolge angezeigt, wie sie über das Query-SQL abgefragt werden. In der zeilenbasierten Darstellungsvariante wird standardmäßig jedes Attribut in eine neue Zeile geschrieben. Links steht der Attributname bzw. Aliasname und rechts daneben das eigentliche Attribut.

Mit den Feldern "Anordnung" und "Beschriftung" hat man die Möglichkeit, das Layout der Attribute anders zu gestalten. Über das Feld "Anordnung" kann die Anordnung jedes Attributs festgelegt werden. Dieses Feld hat die beiden Auswahlmöglichkeiten "unter dem vorigen" und "neben dem vorigen", wobei der erste Wert der voreingestellte Standardfall ist. Das Attribut wird "unter dem vorigen", also in einer neuen Zeile nach dem vorigen dargestellt. Wählt man "neben dem vorigen", wird es in der selben Zeile dargestellt. Man kann so beliebig viele Attribute nebeneinander anordnen. Über das Feld "Beschriftung" lässt sich einstellen, wie die Beschriftung des Attributs, also der Attribut- bzw. Aliasname dargestellt werden soll. Hier gibt es die Auswahlmöglichkeiten "links neben dem Attribut", "über dem Attribut" und "ohne", wobei der erste Wert wieder der voreingestellte Standardfall ist. Der Attributname wird "links neben dem Attribut" in einer extra Spalte dargestellt. Wählt man "über dem Attribut" wird er in der Zeile über dem Attribut dargstellt. Bei Auswahl von "ohne" wird er gar nicht angezeigt. Mit den geeigneten Einstellungen lässt sich das Layout der Sachdatenanzeige optimieren, so dass der zur Verfügung stehende Platz bestmöglich ausgenutzt wird.

ausgr1.PNG ==> ausgr2.PNG

Attributeditor - Bei der Suche

Im Attributeditor kann für jedes einzelne Attribut eingestellt werden, wie es im Suchformular verwendet werden soll. Folgende Optionen gibt es:

  • nicht sichtbar - Das Attribut wird im Suchformular nicht angezeigt, damit kann man auch nicht danach suchen.
  • anzeigen (default) - Das Attribut wird im Suchformular angezeigt und damit kann man auch danach suchen.
  • Pfichtangabe - Das Attribut wird im Suchformular angezeigt und der Nutzer muss dafür einen Suchbegriff eingeben, sonst startet die Suche nicht.

Attributeditor - Anzeige im Rastertemplate

Wird diese Option für ein Attribut gesetzt, wird es auch im Rastertemplate angezeigt.

Attributeditor - Verwendung für neuen Datensatz

Wird diese Option für ein Attribut gesetzt, wird der Wert des Attributes bei der Übernahme eines Datensatzes für einen neuen Datensatz nicht verwendet. Statt dessen wird der Default-Wert aus der Tabellendefinition verwendet, falls vorhanden. Ist kein Default-Wert gesetzt, wird ein leerer Wert in das Formular des neuen Datensatzes übernommen.

Validierung von Nutzereingaben

Der GLE unterstützt verschiedene Varianten die Gültigkeit von Nutzereingaben zu überprüfen. Alle diese Varianten haben ihre Grundlage in der PostGIS-Datenbank, d.h. die Einschränkungen, die in der Datenbank für eine Tabelle gemacht werden, werden von kvwmap erkannt und in die Oberfläche des GLEs in Form von Validierungstests übertragen. Einige dieser Tests finden statt während der Nutzer eine Eingabe macht (z.B. Test auf Zahl) und einige werden erst durchgeführt, wenn der Nutzer versucht zu speichern (z.B. Test auf NOT NULL).

Folgende Attribut-Informationen werden beim Speichern der Layerdefinition erkannt:

  • NOT NULL: Im GLE erscheint hinter dem Attributnamen ein Sternchen (*), das dem Nutzer signalisiert, dass hier eine Eingabe oder Auswahl Pflicht ist. Bleibt ein Attribut leer, obwohl es "NOT NULL" ist, erscheint beim Speichern eine entsprechende Meldung.
  • DEFAULT: Im GLE erscheint beim Anlegen eines neuen Datensatzes im Wertfeld dieser Default. Bei Auswahlfeldern ist die entsprechende Option bereits ausgewählt etc.
  • CONSTRAINT: Ein Check-Constraint, welches die möglichen Werte einer Spalte auf eine bestimmte Menge einschränkt, wird im GLE automatisch in ein entsprechendes Auswahlfeld übertragen.
  • der Datentyp eines Attributs: Der GLE reagiert, wenn der Nutzer etwas einzutragen versucht, was dem Datentyp widerspricht. Z.B. werden Eingaben von Buchstaben in einem Attribut mit einem Zahlentyp (numeric oder integer) unterdrückt. Außerdem wird bei Zahlentypen die Angabe der (Nachkomma-)Stellen berücksichtigt und bei Fehleingaben erscheint eine entsprechende Meldung.


Auswertung von Regeln

Manchmal gibt es spezielle Anforderungen an die Einträge in einer Tabelle und dann reichen diese Möglichkeiten an Einschränkungen nicht aus. Z.B. kann es die Forderung geben, dass in einer Tabelle entweder Spalte A oder Spalte B mit einem Wert versehen sein muss (die "NOT NULL"-Einschränkung ist hier also nicht ausreichend). Eine andere Forderung könnte sein, dass neue Objekte sich geometrisch nicht mit vorhandenen Objekten überlappen dürfen. Um diese Fälle in der PostGIS-DB abzubilden, ist es möglich, INSERT- und UPDATE-Regeln für die entsprechenden Tabellen zu erstellen. Diese Regeln überprüfen die einzutragenden Werte und führen das INSERT bzw. UPDATE nur aus, wenn die gewünschte Forderung erfüllt ist ("Do INSTEAD", d.h. führe den Befehl nicht aus, sondern mache etwas anderes). Alternativ kann die Regel das INSERT bzw. UPDATE prüfen und beim Vorliegen bestimmter Bedingungen einen zusätzlichen Befehl ausführen ("DO ALSO", d.h. führe den Befehl aus und mache noch etwas anderes).

Wenn die Regeln so erstellt werden, dass beim Vorliegen bestimmter Bedingungen ein entsprechender Fehler- oder Hinweistext ausgegeben wird, kann kvwmap diesen anzeigen und so den Nutzer auf die Bedingungen aufmerksam machen.

Beispiele:

  • In einer Tabelle "denkmale" gibt es u.a. die Spalten "fundgruppe" und "fundart". Mindestens eine der beiden Spalten soll bei einer Neuerfassung ausgefüllt sein:
CREATE OR REPLACE RULE denkmale_insert AS
ON INSERT TO denkmale
WHERE new.fundart IS NULL AND new.fundgruppe IS NULL DO INSTEAD  SELECT 'Die Fundart oder die Fundgruppe muss ausgefüllt sein.';


  • In einer Tabelle "dokumente" wird ein Attribut "datei" gespeichert. Der Nutzer soll einen Hinweis bekommen, wenn Dateien mit gleichem Namen gespeichert werden:
CREATE OR REPLACE RULE insert_pdf_name AS
ON INSERT TO denkmale.dokumente
WHERE (substring(new.datei, position(new.datei, 'original_name=') + 14) IN ( SELECT substring(dokumente.datei, position(dokumente.datei, 'original_name=') + 14) FROM denkmale.dokumente)) 
DO ALSO SELECT 'Hinweis: Eine Datei mit diesem Namen existiert bereits!';


  • In einer Tabelle mit Flächengeometrien "polygons" soll verhindern werden, dass dort Datensätze angelegt werden, deren Geometrie sich mit anderen Datensätzen überlappt.
Die INSERT-Regel hat folgende Form:
CREATE OR REPLACE RULE avoid_overlap_insert AS
ON INSERT TO polygons
WHERE ( SELECT true AS bool
        FROM polygons
        WHERE st_overlaps(new.the_geom, polygons.the_geom)
        LIMIT 1)
DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';
Soll dieser Test auch bei Änderung eines Datensatz erfolgen, muss auch eine entsprechende Regel für ON UPDATE erstellt werden. Diese hat fast die gleiche Form, außer dass die Bedingung für den Überlappungstest etwas anders ist, denn die neue Geometrie darf sich natürlich mit der alten Geometrie schneiden:
CREATE OR REPLACE RULE avoid_overlap_update AS
ON UPDATE TO polygons
WHERE ( SELECT true AS bool
        FROM polygons
        WHERE st_overlaps(new.the_geom, polygons.the_geom) AND NOT polygons.the_geom = old.the_geom
        LIMIT 1)
DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';

Erfolg, Fehler oder Warnung Die Rückmeldung, die in einem Do oder DO INSTEAD Statement erzeugt wird, kann eine zusätzliche Spalte msg_type mit dem Wert 'notice', 'warning' oder 'error' enthalten. Je nachdem was angegeben ist, wird die Message-Box zur Anzeige der Meldung mit einem gelblichen Hintergrund für einen Hinweis oder mit einem rötlichem Hintergrund für einen Fehler ausgegeben. Wird diese Spalte nicht angegeben oder sie enthält einen anderen Wert bleibt der Hintergrund in dem hellblauen Standardton.

Beispiel für Warnung:

CREATE OR REPLACE RULE r1_auftragsdatei_pruefen AS
ON UPDATE TO fortfuehrungslisten.ff_auftraege
WHERE ( SELECT new.auftragsdatei::text <> ::text AND new.antragsnr::text <> "substring"(split_part(new.auftragsdatei::text, 'original_name='::text, 2), 1, 10) )
DO SELECT 'Die Antragsnummer im Dateinamen entspricht nicht der Antragsnummer im Formular oben.', 'warning' AS msg_type;

Beispiel für Fehler:

CREATE OR REPLACE RULE r2_auftrag_sperren AS
ON UPDATE TO fortfuehrungslisten.ff_auftraege
WHERE ( SELECT old.gesperrt)
DO INSTEAD  SELECT 'Die Bearbeitung des Fortführungsnachweises ist gesperrt.', 'error' AS msg_type;

Bearbeitung von Geometrien - Geometrie-Editor

Um die Geometrie eines abgefragten Datensatzes zu bearbeiten, klickt man im generischen Layereditor in der Sachdatenanzeige auf den Link 'Geometrie bearbeiten'. Beim Neuanlegen eines Datensatzes ist der Geometrieeditor bereits integriert. Eine bereits vorhandene Geometrie erscheint blau hervorgehoben und kann bearbeitet werden. Nach Klick auf 'Speichern' wird die veränderte Geometrie in die Postgis-Tabelle eingetragen. Dabei wird nach dem Speichern wieder auf die gesamte Ausdehnung der Geometrie gezoomt. Dies kann gerade bei der Erfassung größerer Geometrien hinderlich sein, wenn man auf einen bestimmten Teil der Geometrie gezoomt hat und zwischendurch speichern möchte. Dafür gibt es den Button 'Zwischenspeichern'. Hier wird die Geometrie auch gespeichert, nur wird der Kartenausschnitt danach nicht verändert.

Je nach Geometrietyp des jeweiligen Layers bietet der Editor verschiedene Werkzeuge und Funktionen zum Bearbeiten an.

Um die Geometrie eines Polygon-Layers zu bearbeiten, gibt es folgende Werkzeuge:

Polyadd.jpg Polygon hinzufügen
Polyremove.jpg Polygon entfernen
Flurstadd.jpg Geometrie eines Layers selektieren und hinzufügen
Flurstremove.jpg Geometrie eines Layers selektieren und entfernen
Buffer.gif die aktuelle Geometrie um eine definierte Breite vergrößern oder verkleinern (negatives Vorzeichen)
buffer line.jpg gepufferte Linie hinzufügen
parallel polygon.jpg linksseitig gepufferte Linie hinzufügen
move geometry.jpg Geometrie verschieben
Vertexedit.jpg Eckpunkte bearbeiten
Coord input.gif Koordinate eingeben

Um die Geometrie eines Linien-Layers zu bearbeiten, gibt es folgende Werkzeuge:

Lineedit.gif Linien hinzufügen
Lineedit2.jpg Linien durch Zeichnen eines Polygons entfernen
Flurstadd.jpg Geometrie eines Layers selektieren und hinzufügen
Flurstremove.jpg Geometrie eines Layers selektieren und entfernen
split lines.jpg Linienzug aufsplitten
reverse.png Linienrichtung drehen
move geometry.jpg Geometrie verschieben
Vertexedit.jpg Eckpunkte bearbeiten
Coord input.gif Koordinate eingeben

Um die Geometrie eines Punkt-Layers zu bearbeiten, gibt es 2 Werkzeuge:

Pointedit.jpg Punkt setzen
Coord input.gif Koordinate eingeben

Die Darstellung der Geometrien erfolgt mit SVG und die geometrischen Operationen werden mit AJAX und Postgis realisiert.


Der Geometrie-Editor bei der Bearbeitung eines Polygonlayer-Datensatzes


In der Eckpunktbearbeitung ist es möglich, Punkte zu löschen (Doppelklick) oder Punkte an beliebiger Stelle in eine Kante (eines Linien- oder Polygonlayers) einzufügen. Bei Linienlayern können außerdem neue Punkte vor den Anfang bzw. hinter das Ende des Linienzuges gesetzt werden.


Zur Bearbeitung von Eckpunkten existiert weiterhin ein Punktfang. Wird dieser eingeschaltet (unter der Kartengrafik), erscheinen alle Eckpunkte der Geometrien aller aktuell aktiven PostGIS-Layer, die in dem aktuellen Kartenausschnitt zu sehen sind. Wenn man nun einen neuen Eckpunkt auf einen solchen Punkt setzt oder einen Punkt der gerade editierten Geometrie auf einen solchen Punkt zieht, wird dieser gefangen und die exakten Koordinaten übernommen.


Punktfang.png


Im Geometrie-Editor gibt es eine Checkbox "weiterzeichnen". Damit kann rollenbezogen eingestellt werden, ob nach dem Navigieren wieder in den Zeichenmodus gewechselt wird oder nicht.

Layer-Suche

Neben der Abfragemöglichkeit über die Karte kann man auch über eine Suchmaske nach Postgis-Layern suchen und die Sachdaten im generischen Layereditor anzeigen und bearbeiten. Die go-Variable dazu heißt Layer-Suche. Hier stehen alle Layer zur Auswahl, die der aktuellen Stelle zugeordnet sind und die abfragbar sind. Nach Auswahl eines Layers kann man als Suchparameter die Layerattribute verwenden, für die man mindestens Leserecht hat. Es stehen folgende Suchoperatoren zur Verfügung:

= gleich
!= ungleich
< kleiner als
> größer als
ähnlich (SQL: LIKE) hier kann man "_" bzw. "%" als Platzhalter verwenden
nicht ähnlich (SQL: NOT LIKE) hier kann man "_" bzw. "%" als Platzhalter verwenden
ist leer (SQL: IS NULL)
ist nicht leer (SQL: IS NOT NULL)
befindet sich in (SQL: IN) hier können mehrere mögliche Werte durch ein "|" getrennt angegeben werden
zwischen (SQL: BETWEEN) hier kann ein Anfangs- und Endwert angeben werden

Das Ergebnis der Suche erscheint dann im generischen Layer-Editor bzw., falls dem Layer ein Template zugeordnet ist, das entsprechende Template.

Sachdaten-Druck

Die Sachdaten von PostGIS-Layern lassen sich neben der Anzeige im GLE auch als PDF ausgeben. Im Sachdatendruck-Layouteditor (go=sachdaten_druck_editor) lassen sich für jeden Layer verschiedene Layouts erstellen, die anschliessend den gewünschten Stellen zugewiesen werden können.

Das Prinzip der Layoutdefinition ist ähnlich dem der Druckrahmen für den PDF-Kartendruck. Jedes Attribut kann über einen x- und y-Wert auf der PDF-Seite positioniert und mit einer bestimmten Schriftgröße und -Art ausgegeben werden. In der Vorschau des Layouts im Layouteditor werden die Attributnamen verwendet, beim späteren Druck eines Datensatzes die Attributwerte. Auch das Geometrieattribut kann dem Layout zugeordnet werden. An dieser Stelle erscheint dann ein quadratisches Kartenbild des entsprechenden Objekts in der angegebenen Breite. Auch hier können beliebig viele Freitexte und ein Hintergrundbild im Layout angeordnet werden.

In Freitexten können auch die Attributwerte verwendet werden. Dazu muss man einfach das Schlüsselwort $<attributname> in den Text einbauen, welches dann später durch den jeweiligen Attributwert ersetzt wird.

Wenn man in einem Drucklayout Attribute ausgeben möchte, die Text über mehrere Zeilen enthalten und dieser Text unterschiedlich lang sein kann, ist die Positionierung der nachfolgenden Attribute und Freitexte schwierig. In diesem Fall kann man die y-Position der nachfolgenden Elemente relativ zu den vorhergehen Attributen angeben. Dazu wählt man für alle nachfolgenden Elemente im Auswahlfeld "unterhalb von" das Attribut aus, auf das sich die relative Position beziehen soll und gibt als y-Wert den Abstand zu diesem Attribut an.

Es gibt 3 verschiedene Layouttypen:

  • Typ 1: pro Datensatz eine Seite
  • Typ 2: Datensätze untereinander
  • Typ 3: eingebettet

Ein Layout vom Typ 1 erzeugt ein PDF, in dem jeder Datensatz eines zu druckenden Abfrageergebnisses einer neuen Seite im PDF entspricht.

Beim Layouttyp 2 werden die Datensätze untereinander im PDF angeordnet, so dass eine Listenform entsteht. Die Positionsangaben die man für ein solches Layout macht, gelten also für den ersten Datensatz, die folgenden Datensätze werden fortlaufend darunter angeordnet. Für Freitexte kann man bei diesem Layouttyp angeben, ob sie fixiert sein sollen, wie z.B. für Überschriften, oder auch mit jedem Datensatz untereinander angeordnet werden sollen, wie z.B. für Attributbeschriftungen.

Der Typ 3 entspricht von der Darstellung dem Typ 2, d.h. auch hier werden die Datensätze untereinander angeordnet. Allerdings wird dieser Layouttyp für eingebettete Drucklayouts verwendet.

Mit eingebetteten Layouts lassen sich die 1:n Beziehungen, die in der Sachdatenanzeige über verknüpfte Layer (SubFormPK, SubFormEmbeddedPK) abgebildet werden, auch in die Sachdaten-Drucklayouts integrieren. Das Prinzip ist, dass man für jeden der beiden Layer ein Layout definiert, wobei das für den abhängigen Layer vom Typ 3 "eingebettet" ist. Das eingebettete Layout enthält auch keinen Druckkopf oder ähnliches, sondern nur die gewünschten Attribute und Freitexte, die dann in Listenform dargestellt werden. Im Layout für den übergeordneten Layer kann man über das Pseudo-Attribut, welches vom Formularelementtyp "SubFormPK" bzw. "SubFormEmbeddedPK" ist, das andere Drucklayout einbetten. Hier erscheint eine Auswahlliste mit allen verfügbaren Layouts des verknüpften Layers, welche den Typ 3 "eingebettet" haben. Über die x-y-Werte lässt sich das gesamte eingebettete Layout positionieren.

Grunddaten.png + Kontrolldaten2.png = Kontrolldaten.png

Ist für einen Layer ein Sachdaten-Drucklayout vorhanden und der entsprechenden Stelle zugewiesen, so erscheint in der Sachdatenanzeige des GLE ein Link "ausgewählte Datensätze: drucken". Wenn es mehrere Layouts gibt, muss der Nutzer noch das gewünschte Layout auswählen, ansonsten erscheint beim Klick darauf eine Druckvorschau der ersten Seite des PDFs. Ein Klick auf "Drucken" erzeugt schliesslich das PDF.


dynamische Layerdefinitionen

kvwmap unterstützt auch die Definition von dynamischen Layern. Ein Layer ist z.B. dann dynamisch, wenn in seinem Data-SQL bestimmte Parameter verwendet werden, die verschiedene Werte annehmen können und so unterschiedliche SQL-Statements ergeben. Die Parameter können vom Administrator frei definiert werden. Die Nutzer können den aktuellen Wert jedes Parameters selbst auswählen.

Ein Beispiel: Man hat eine Gemeinde-Tabelle mit Bevölkerungs-Prognosezahlen. In der Tabelle ist die prognostizierte Bevölkerungszahl für die nächsten 20 Jahre enthalten. Jedes Jahr entspricht einer eigenen Spalte (bev_2016 - bev_2036).

Jetzt möchte man die Bevölkerungszahlen für jede Gemeinde und jedes Jahr in der Karte farblich klassifiziert darstellen. Man kann nun entweder 20 verschiedene Layer anlegen, oder einen dynamischen Layer mit variablem Data-SQL. Das Data-SQL könnte z.B. so aussehen:

the_geom from (select the_geom, name, id, bev_$jahr as bev from gemeinden) as foo using unique id using srid=25833

Hier wurde der Parameter $jahr verwendet. In diesem Beispiel wurde er so definiert, dass er die Werte 2016 - 2036 annehmen kann. Je nachdem, welchen Wert ein Nutzer für diesen Parameter auswählt, zeigt der Layer die Bevölkerungszahlen des entsprechenden Jahres an.

Definition der Parameter

Die Layer-Parameter können über go=Layer_Parameter definiert werden. Es muss ein Name, ein Aliasname, ein Standardwert und eine SQL-Abfrage für die Auswahlmöglichkeiten eingegeben werden. Die SQL-Abfrage für die Auswahlmöglichkeiten kann genauso aufgebaut sein, wie bei der Definition eines Auswahlfeldes im Attributeditor. Sie muss eine Spalte "value" für den Wert und eine Spalte "output" für den angezeigten Text liefern. Für das obige Beispiel könnte die SQL-Abfrage z.B. so aussehen:

SELECT jahr AS value, jahr AS output FROM generate_series(2016,2036) AS jahr
Verwendung der Parameter in der Layer-Definition

Die Parameter können bei der Layer-Definition in der Form "$<name>" im Query-SQL, im Data-SQL, im Feld Classitem und im Feld Klassifizierung verwendet werden. Wenn man im Feld Klassifizierung einen dynamischen Layer-Parameter verwendet, kann innerhalb des Layers zwischen verschiedenen Klassifizierungen gewählt werden.

Auswahl der Parameter-Werte

Wenn die aktuelle Stelle Layer enthält, die dynamische Parameter verwenden, erscheint rechts oben im Header ein Optionen-Button. Ein Klick darauf öffnet ein Formular, in dem alle in der Stelle verwendeten Parameter aufgeführt sind. Hier können die Werte ausgewählt und gespeichert werden. Wenn eine eigene Header-Datei verwendet wird, kann das Parameter-Formular über die Zeile

<? include(SNIPPETS.'params.php'); ?>

in den eigenen Header an geeigneter Stelle integriert werden.

vordefinierte Parameter

Neben den o.g. selbst definierten Parametern, gibt es in kvwmap auch 2 vordefinierte Parameter, die in den Layer-Definitionen verwendet werden können.

  • $language: Dieser Parameter enthält die aktuell ausgewählte Sprache (german, english, ...)
  • $hist_timestamp: Dieser Parameter enthält den in den Optionen auswählbaren Zeitpunkt für historische Daten. Dieser Zeitpunkt kann für für eine zeitliche Navigation in Daten mit Vollhistorie verwendet werden (wie z.B. bei den ALKIS-Daten).

Style- und Labeleditor

Mit dem Style- und Labeleditor lassen sich die Styles der Geometrie und der Beschriftung der Klassen von Layern editieren.

Der Editor (go=Style_Label_Editor) wird entweder aus dem Menü Layerverwaltung oder dem Formular zum Ändern von Layereigenschaften aufgerufen. Im Editor wählt man zunächst links oben den Layer aus. Nach Aufruf aus dem Layereditor ist der Layer schon voreingestellt. Anschließend wählt man die Klasse aus, für die man den Style anpassen will. Daraufhin erscheinen ein Feld mit den zugeordneten Styles und Labels. Ein Klick auf den Style oder das Label öffnet das dazugehörige Formular mit den entsprechenden Parametern des Mapserver-STYLE- bzw. LABEL-Objekts.

Im rechten Bereich befinden sich oben Hilfsmittel zur Auswahl von Farben und Fonts und unten eine Vorschau der Layer. Wenn der Style eines Layers geändert wird, sollte dieser auch eingeschaltet sein. Änderungen von Styles werder erst sichtbar, wenn man unter dem Formular auf Speichern geklickt hat und danach die Karte aktualisiert. Es können mehr als ein Style pro Klasse erzeugt werden oder wieder gelöscht werden. Style- und Labeleinstellungen gelten derzeit stellenübergreifend. Das heißt ein Layer sieht in allen Stellen gleich aus. Sollen Layer in verschiedenen Stellen unterschiedlich aussehen, kann man die Layer einfach kopieren und anpassen.

Es ist möglich, einen Style zu kopieren (bei den Labels geht das nicht). Man trägt in einem neuen oder vorhandenen Style einfach die Nummer eines bereits existierenden Sytels ein und speichert.

Style- und Labeleditor

Import/Export-Funktionen

Daten-Export

Mit dem Daten-Export lassen sich PostGIS-Layer in andere Vektor-Formate exportieren. Der Daten-Export wird über die go-Variable "Daten_Export" aufgerufen oder indem man in aus einer Sachdatenanzeige heraus auf den Export-Button klickt. In einer Liste werden nun alle PostGIS-Layer angezeigt, die in der aktuellen Stelle abfragbar sind und für die das Recht zum Exportieren gesetzt ist. Wenn man den zu exportierenden Layer auswählt, erhält man weitere Optionen für den Export. Das Exportformat kann gewählt werden (bisher stehen Shape, GML, KML, GeoJSON, CSV, OVL und UKO zur Verfügung) und das Koordinatensystem, falls die Geometrie des Layers transformiert werden soll. Weiterhin können die Attribute ausgewählt werden, die exportiert werden sollen.

Es ist außerdem möglich, nicht den gesamten Datenbestand des Layers zu exportieren, sondern durch räumliche Auswahl den Export auf bestimmte Datensätze zu beschränken. Dazu hat man die Möglichkeit ein Polygon zu zeichnen und so bestimmte Datensätze zu selektieren.

Nach Klick auf "Exportieren" wird der Daten-Export gestartet. Der Export liefert entweder ein zip-Archiv bei mehreren Dateien oder die einzelne Exportdatei. Damit das Zippen funktioniert, muss die Konstante "ZIP_PATH" richtig gesetzt sein. Sie verweist auf ein Zip-Programm, welches von der Kommandozeile gestartet werden kann. Bei Linux-Servern reicht in der Regel "zip". Bei Windows-Servern z.B. "c:/programme/Zip/bin/zip.exe".

Daten-Import

Daten können von den Nutzern in den Formaten Shape, GeoJSON, DXF, OVL, GPX und Punktliste importiert werden. Über die entsprechenden go-Variablen gelangt man entweder direkt zum Import-Formular eines bestimmten Formats oder man verwendet go=Daten_Import und gelangt dadurch zur Auswahl des gewünschten Formats. Durch den Import entstehen immer abfragbare Rollenlayer, die nur der jeweilige Nutzer sieht. Diese Rollenlayer und die zugehörige Tabelle existieren nur solange, wie die Rollenlayer aktiv sind.

Shape-Import

Shape-Dateien können über go=SHP_Anzeigen importiert werden. Die Dateien des Shapes müssen zuvor gezippt werden. Wenn eine prj-Datei vorhanden ist, wird versucht, das Koordinatenreferenzsystem aus ihr zu ermitteln. Ansonsten muss das Koordinatenreferenzsystem angegeben werden.

GeoJSON-Import

GeoJSON-Dateien können über go=GeoJSON_Anzeigen importiert werden.

DXF-Import

DXF-Dateien können über go=DXF_Import importiert werden. Das Koordinatenreferenzsystem muss bekannt sein. Hier entstehen 3 Rollenlayer für die Geometrietypen Polygon, Linie und Punkt.

OVL-Import

OVL-Dateien können über go=OVL_Import importiert werden.

GPX-Import

GPX-Dateien können über go=GPX_Import importiert werden. Hier kann ausgewählt werden, ob die Tracks, die Waypoints oder beides importiert werden soll. Es entstehen je nach Auswahl einer oder zwei Rollenlayer.

Punktlisten-Import

Über go=Punktliste_Anzeigen können Textdateien importiert werden, die zeilenbasierte Koordinaten-Listen enthalten. Jede Zeile muss mindestens 2 Spalten für den Hoch- und den Rechts-Wert enthalten. Zusätzlich können weitere Spalten vorhanden sein. Als Trennzeichen der Spalten sind Komma, Semikolon, Tab und Leerzeichen erlaubt. Das Koordinatenreferenzsystem muss bekannt sein und es dürfen keine Leerzeilen in der Datei vorkommen. Nach dem Klick auf "Datei laden" muss noch festgelegt werden, welche Spalten als Hoch- und Rechts-Wert verwendet werden sollen. Die Auswahl einer Beschriftungsspalte ist optional.

Kartenausschnitt speichern/laden

Unter dem Kartenfenster befinden sich die Links: Ausschnitt speichern | Ausschnitt laden. Sie dienen dem Speichern von Einstellungen des aktuellen Kartenfensters und dem Abrufen gespeicherter Einstellungen von Kartenfenstern.

Speichern:

  • Um einen bestimmen Kartenauschnitt zu speichern, passen sie das Kartenfenster und die entsprechenden Layern an.
  • Zum Speichern des aktuellen Kartenfenstern wählen Sie den Link "Ausschnitt speichern".
  • Sie gelangen auf die Oberfläche, in der der gewählte Kartenauschnitt gezeigt wird. Darüber befindet sich ein Eingabefeld, in dem es möglich ist ein Kommentar zum entsprechenden Kartenausschnitt hinzuzufügen. Der Kommentar ist in sofern wichtig, dass nach dem Zeitstempel nur so eine eindeutige Identifikation des gespeicherten Kartenausschnittes möglich ist.
  • Durch das betätigen des "Speichern"-Button werden die Einstellungen des Kartenausschnittes und der dazugehörige Kommmentar gespeichert.
  • Mit Hilfe des "Zurücksetzen"-Button können Sie die Eingabe im Kommentarfeld löschen. Es wird dabei nur das Kommentarfeld zurücksgesetzt, ohne den Kartenausschnitt zu speichern.
  • Mit betätigen des "Abbrechen"-Button beenden sie den Vorgang ohne den Kartenausschnitt zu speichern.

Wählen:

  • Wenn ein gespeicherter Kartenausschnitt geladen werden soll, betätigen Sie dazu den Link "Ausschnitt laden".
  • Es folgt eine Liste aller gespeicherten Kartenausschnitte des jeweiligen Nutzers.
  • Durch betätigen des entsprechenden Zeitstempels gelangen Sie auf die Oberfläche, mit angepassten Kartenfenster, zurück.

Drucken

Drucken eines frei wählbaren Kartenausschnittes unter Angabe des Maßstabes und der Drehung des Druckbereiches, siehe Drucken in PDF.

Weitere Funktionalitäten

  • Kartengröße wahlweise einstellbar
  • Kartenausschnitt als Rasterbild abspeicherbar
  • Bildschirm-Ansichten drucken (Browserfunktionalität)
  • Druck-Voransicht (Browserfunktionalität)
  • Layer wahlweise ein-/ausschaltbar
  • Hilfe-Funktion

Funktionen auf dem Server

  • Speicherung und Verwaltung der Karteneinstellungen
    In der MySQL-Datenbank werden die Informationen vorgehalten, die für eine Kartenausgabe erforderlich sind. Es handelt sich im Wesentlichen um die Daten, die sonst in der Map-Datei für den UMN-MapServer enthalten sind, nur dass sie in der Datenbank für verschiedene Karten nicht redundant abgespeichert werden.
  • Speicherung und Verwaltung von Benutzerdaten
    In der MySQL-Datenbank werden Daten zu den Benutzern, zu den Stellen und zu den Rollen, die die Benutzer in den Stellen einnehmen können gespeichert. Folgende Informationen können zu den Nutzern gespeichert werden.
    • login-Name, Passwort, Name, Tel., E-Mail, Funktion, letzte besuchte Stelle des Benutzers
    • Bezeichnung, Gültigkeitsdauer, maximale Kartenausdehnung, Referenzkarte, Wappen, Datenbankverbindung, OWS-Metadaten
    • aktuelle Kartenausdehnung, Fenstergröße, Zoomfaktor, Referenzsystem, letztes gewähltes Werkzeug, Layoutgestaltung der GUI (Skin) können für jeden Benutzer innerhalb der Stelle gespeichert werden.
  • Einlesen von ALB-Daten im WLDGE-Format in eine PostgreSQL-Datenbank
  • Freie Gestaltung von Menüpunkten und Zusammenfassung von Menüunterpunkten zu Obermenüs.

Fachschalen

Zu kvwmap gehört eine Reihe von Funktionen, die in Fachschalen zusammengefasst wurden. Eine Fachschale beinhaltet thematisch zusammengehörende Funktionen zur Erfüllung fachspezifischer Aufgaben. Die anderen Funktionen stehen parallel dazu immer zur Verfügung. Die benötigten Funktionen können über das frei konfigurierbare Menü thematisch zu einer Fachschale und über zugriffsrechtlich über die Rolle eines Benutzers in einer Stelle zugeordnet werden.


Änderung der Eigentümeranschriften

Die in der Sachdatenanzeige der Flurstücke angezeigten Eigentümeranschriften können von autorisierten Nutzern geändert werden. Die Änderungen werden in zwei separaten Tabellen ax_person_temp und ax_anschrift_temp gespeichert und können als NAS-Fortführungsauftrag exportiert werden, um damit den ALKIS-Bestand zu aktualisieren.

Um diese Funktionen nutzen zu können, müssen folgende Voraussetzungen erfüllt sein:

  • In der PostgreSQL-DB müssen die Tabellen ax_person_temp und ax_anschrift_temp vorhanden sein (siehe ALKIS-Schema).
  • In der MySQL-DB müssen die beiden folgenden Layer angelegt werden:
SET @group_id = 1;
SET @connection = 'user=xxxx password=xxxx dbname=kvwmapsp';

INSERT INTO layer (`Name`,`alias`,`Datentyp`,`Gruppe`,`pfad`,`maintable`,`Data`,`schema`,`document_path`,`tileindex`,`tileitem`,`labelangleitem`,`labelitem`,`labelmaxscale`,`labelminscale`,`labelrequires`,`connection`,`printconnection`,`connectiontype`,`classitem`,`filteritem`,`tolerance`,`toleranceunits`,`epsg_code`,`template`,`queryable`,`transparency`,`drawingorder`,`minscale`,`maxscale`,`offsite`,`ows_srs`,`wms_name`,`wms_server_version`,`wms_format`,`wms_connectiontimeout`,`wms_auth_username`,`wms_auth_password`,`wfs_geom`,`selectiontype`,`querymap`,`logconsume`,`processing`,`kurzbeschreibung`,`datenherr`,`metalink`,`privileg`) VALUES('Adressänderungen Anschrift','','5',@group_id,'SELECT gml_id, ort_post, postleitzahlpostzustellung, strasse, hausnummer, ortsteil, datum, user_id FROM ax_anschrift_temp WHERE 1=1','ax_anschrift_temp','','alkis','','','','','','50000','0','',@connection,'','6','lfd_nr','','3','pixels','2398','','1',NULL,NULL,'-1','-1','','EPSG:2398','','1.1.0','image/png','60','','','','','0','0','','','','','0');
SET @last_layer_id162=LAST_INSERT_ID();
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'datum','datum','ax_anschrift_temp','ax_anschrift_temp','timestamp','','','1',NULL,NULL,'','Time','','Datum','','','','','','',NULL,NULL,'6','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'gml_id','gml_id','ax_anschrift_temp','ax_anschrift_temp','varchar','','PRIMARY KEY','0','16',NULL,'','Text','','','','','','','','',NULL,NULL,'0','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'hausnummer','hausnummer','ax_anschrift_temp','ax_anschrift_temp','varchar','','','1',NULL,NULL,'','Text','','Hausnummer','','','','','','',NULL,NULL,'4','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'ortsteil','ortsteil','ax_anschrift_temp','ax_anschrift_temp','varchar','','','1',NULL,NULL,'','Text','','','','','','','','',NULL,NULL,'5','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'ort_post','ort_post','ax_anschrift_temp','ax_anschrift_temp','varchar','','','1',NULL,NULL,'','Text','','Ort','','','','','','',NULL,NULL,'1','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'postleitzahlpostzustellung','postleitzahlpostzustellung','ax_anschrift_temp','ax_anschrift_temp','varchar','','','1',NULL,NULL,'','Text','','PLZ','','','','','','',NULL,NULL,'2','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'strasse','strasse','ax_anschrift_temp','ax_anschrift_temp','varchar','','','1',NULL,NULL,'','Text','','Strasse','','','','','','',NULL,NULL,'3','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id162,'user_id','user_id','ax_anschrift_temp','ax_anschrift_temp','int4','','','1','32',NULL,'','UserID','','User-ID','','','','','','',NULL,NULL,'7','0','0');

INSERT INTO layer (`Name`,`alias`,`Datentyp`,`Gruppe`,`pfad`,`maintable`,`Data`,`schema`,`document_path`,`tileindex`,`tileitem`,`labelangleitem`,`labelitem`,`labelmaxscale`,`labelminscale`,`labelrequires`,`connection`,`printconnection`,`connectiontype`,`classitem`,`filteritem`,`tolerance`,`toleranceunits`,`epsg_code`,`template`,`queryable`,`transparency`,`drawingorder`,`minscale`,`maxscale`,`offsite`,`ows_srs`,`wms_name`,`wms_server_version`,`wms_format`,`wms_connectiontimeout`,`wms_auth_username`,`wms_auth_password`,`wfs_geom`,`selectiontype`,`querymap`,`logconsume`,`processing`,`kurzbeschreibung`,`datenherr`,`metalink`,`privileg`) VALUES('Adressänderungen Person','','5',@group_id,'SELECT * FROM ax_person_temp WHERE 1=1','ax_person_temp','','alkis','','','','','','50000','0','',@connection,'','6','lfd_nr','','3','pixels','2398','','1',NULL,NULL,'-1','-1','','EPSG:2398','','1.1.0','image/png','60','','','','','0','0','','','','','0');
SET @last_layer_id827=LAST_INSERT_ID();
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id827,'datum','datum','ax_person_temp','ax_person_temp','timestamp','','','1',NULL,NULL,'','Time','','Datum','','','','','','',NULL,NULL,'2','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id827,'gml_id','gml_id','ax_person_temp','ax_person_temp','varchar','','PRIMARY KEY','0','16',NULL,'','Autovervollständigungsfeld','select array_to_string(array[vorname, nachnameoderfirma], \' \') as output, gml_id as value from alkis.ax_person where 1=1','Name','','','','','','',NULL,NULL,'0','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id827,'hat','hat','ax_person_temp','ax_person_temp','_varchar','','','1',NULL,NULL,'','Autovervollständigungsfeld','select strasse||\' \'||hausnummer||\' \'||postleitzahlpostzustellung||\' \'||ort_post||\' \'||coalesce(ortsteil, \'\') as output, gml_id as value from alkis.ax_anschrift UNION select strasse||\' \'||hausnummer||\' \'||postleitzahlpostzustellung||\' \'||ort_post||\' \'||coalesce(ortsteil, \'\') as output, gml_id as value from alkis.ax_anschrift_temp where 1=1 order by output;layer_id=162 embedded','Anschrift','','','','','Geben Sie die ersten Buchstaben der neuen Anschrift ein und wählen die richtige Anschrift aus. Wenn die Anschrift bislang nicht existiert, legen Sie eine neue Anschrift an und wählen sie anschließend hier aus.','',NULL,NULL,'1','0','0');
INSERT INTO layer_attributes (`layer_id`,`name`,`real_name`,`tablename`,`table_alias_name`,`type`,`geometrytype`,`constraints`,`nullable`,`length`,`decimal_length`,`default`,`form_element_type`,`options`,`alias`,`alias_low-german`,`alias_english`,`alias_polish`,`alias_vietnamese`,`tooltip`,`group`,`raster_visibility`,`mandatory`,`order`,`privileg`,`query_tooltip`) VALUES(@last_layer_id827,'user_id','user_id','ax_person_temp','ax_person_temp','int4','','','1','32',NULL,'','UserID','','User-ID','','','','','','',NULL,NULL,'3','0','0');

UPDATE layer_attributes SET options = REPLACE(options, '162', @last_layer_id162) WHERE layer_id IN(@last_layer_id162, @last_layer_id827) AND form_element_type IN ('SubFormPK', 'SubFormFK', 'SubFormEmbeddedPK', 'Autovervollständigungsfeld', 'Auswahlfeld');
UPDATE layer_attributes SET options = REPLACE(options, '827', @last_layer_id827) WHERE layer_id IN(@last_layer_id162, @last_layer_id827) AND form_element_type IN ('SubFormPK', 'SubFormFK', 'SubFormEmbeddedPK', 'Autovervollständigungsfeld', 'Auswahlfeld');
  • In der config.php müssen die beiden Konstanen LAYER_ID_ADRESSAENDERUNGEN_PERSON und LAYER_ID_ADRESSAENDERUNGEN_ANSCHRIFT auf die IDs des beiden neuen Layer gesetzt werden.
  • Es muss die Funktion Adressaenderungen angelegt und den Stellen zugewiesen werden, die Anschriftenänderungen vornehmen dürfen.
  • Das Exportieren der Anschriftenänderungen erfolgt über die go-Variable Adressaenderungen_Export. Dieser Menüpunkt sollte nur der Stelle zugewiesen werden, die die gespeicherten Änderungen exportieren darf (im Normalfall der Administrator).
  • In der Rechteverwaltung muß den gewünschten Stellen für den Layer "Adressaenderungen Person" das Recht zum Erzeugen von Datensätzen gegeben werden. Die Attribute "gml_id", "datum" und "user_id" sollten nur lesbar sein und nur das Attribut "hat" editierbar. Für den Layer "Adressaenderungen Anschrift" muss ebenfalls das Recht zum Erzeugen von Datensätzen eingetragen werden. Auch hier sollten die Attribute "gml_id", "datum" und "user_id" wieder nur lesbar sein und die restlichen 5 Attribute editierbar.

Hat ein Nutzer in einer Stelle das Recht Adressänderungen vorzunehmen, so erscheint in der Sachdatenanzeige der Flurstücke neben jeder Eigentümeradresse ein Link Anschrift aktualisieren. Der Link öffnet ein eingebettetes Formular zur Auswahl der neuen Anschrift über ein Autovervollständigungsfeld. Hier ist die aktuelle Anschrift vorausgewählt und alle Anschriften aus ax_anschrift und ax_anschrift_temp sind auswählbar. Zusätzlich zur neuen Anschrift wird die User-ID, das Datum und als Schluessel die gml_id der Person gespeichert. Wenn es die neue Anschrift noch nicht im Datenbestand gibt, ist es über den Link "neu" möglich, eine neue Anschrift zu erstellen. Dazu öffnet sich ein weiteres Unterformular und die neue Anschrift kann hier eingegeben werden. Danach ist die neu erstellte Anschrift im o.g. Autovervollständigungsfeld auswählbar. Auch für neu erstellte Anschriften wird die User-ID und das Datum gespeichert. Wurde die Anschrift eines Eigentümers bereits geändert, erscheint bei Abfrage des entsprechenden Flurstücks unter der alten Anschrift die neue Anschrift mit Angabe des Datums und des Nutzers, welcher die Änderung vorgenommen hat. Daneben erscheint ein Link Aktualisierte Anschrift ändern, um die neue Anschrift zu bearbeiten.

Um die neuen Anschriften in einen NAS-Fortführungsauftrag zu exportieren, ruft man die go-Variable Adressaenderungen_Export auf. Hier kann man nun die Exportdatei erzeugen und sie anschließend herunterladen.

Vor jedem Export werden die beiden temp-Tabellen bereinigt, d.h. die bei der letzten Fortführung übernommenen Anschriften werden aus dem temp-Tabellen gelöscht.

Bauleitplanungsänderung

Bei der Veränderung von B-Pläne etc. soll den Gemeinden, als Träger der Bauleitplanung, die Möglichkeit gegeben werden, um die zu verändernden Stellen ein Polygon zu zeichnen und somit die betroffenen Stellen unkenntlich zu machen. Damit soll gewährleistet werden, dass die betroffenen Teile der Pläne als nicht aktuell gekennzeichnet werden und somit seitens der Kreisverwaltung keine Falschaussagen getroffen werden.

Um die Fachschale Bauleitplanungsänderung aufrufen zu können, muss es einen entsprechenden Menüpunkt mit der go-Variable 'bauleitplanung' geben (Tabelle: u_menues). Außderdem muss dieser Menüpunkt der Stelle (Tabelle: u_menue2stelle) und dem Nutzer dieser Stelle (Tabelle: u_menue2rolle) zugeordnet werden. In der Fachschale ist es möglich ein Polygon zu zeichnen, um so das betroffene Gebiet innerhalb eines B-Planes zu markieren. Desweiteren muss eine E-Mail-Adresse angegeben werden, an die eine Mail mit der Änderungsbenachrichtigung geschickt wird. Zu dieser Benachrichtung gehört die Nummer des bearbeiteten B-Planes und eine Bemerkung zur Änderung. Nach dem Absenden des Formulars wird das Polygon gespeichert, und die Mail wird automatisch versandt.

Damit die geänderten Bereiche in den B-Plänen nicht mehr zu sehen, bzw. markiert sind, muss es einen Layer geben, der über dem Layer der B-Pläne liegt. Dieser Layer könnte beispielsweise so aussehen:

INSERT INTO layer VALUES (106, 'Bauleitaenderungen', 2, 4, "", 'the_geom from (select the_geom,id
from bp_aenderungen where loeschdatum is null) as foo using unique id using
srid=2398', "", "", "", "", 50000, 0, "", 'user=kvwmap password=kvwmap dbname=kvwmapsp',
6, "", "", 3, 'pixels', 0, '2398', 'EPSG:2398', "", '1.1.0', 'image/png', 60, NULL);

Für die Darstellung des Layers wird dann natürlich noch eine entsprechende Klasse und ein Style benötigt. Damit gewährleistet ist, dass dieser Layer stets aktiv ist, wenn der Layer B-Pläne aktiv ist, wird in das Feld requires in der Tabelle used_layer folgende Bedingung eingetragen:

([B-Plaene]=1)

Dadurch ist der Layer Bauleitaenderungen vom Layer B-Pläne abhängig, immer aktiv wenn dieser aktiv ist und sein Name nicht in der Legende zu sehen. Gibt man der Klasse des Layers Bauleitaenderungen keinen Namen, so erscheint auch die Klasse des Layers nicht in der Legende.

Um den die gespeicherten Polygone der Bauleitänderung trotzdem abfragen zu können, wird ein zweiter Layer angelegt. Dieser sieht z.B. so aus:

INSERT INTO layer VALUES (112, 'B-Plan Änderungen', 2, 4, 'SELECT id,
username,hinweis,bemerkung,the_geom,datum FROM bp_aenderungen WHERE 1=1', 'the_geom from (select
the_geom,id from bp_aenderungen where loeschdatum is null) as foo using unique id using srid=2398', "",
"", "", "", 50000, 0, "", 'user=kvwmap password=kvwmap dbname=kvwmapsp', 6, "", "", 3, 'pixels', 0,
'2398', 'EPSG:2398', "", '1.1.0', 'image/png', 60, NULL);

Dieser Layer ist dann nach Zuweisung von Klasse und Style in der Legende zu sehen und kann auch ausgeschaltet werden.

Die Polygone, die man in der Fachschale erstellt hat, lassen sich auch wieder löschen, jedoch werden sie nicht wirklich gelöscht, sondern nur als gelöscht markiert. Um Polygone löschen zu können, muss es in u_funktionen eine Funktion "BplanAenderungLoeschen" geben und diese muss der gewünschten Stelle zugeordnet werden. Nach einer Sachdatenabfrage auf den Layer "B-Plan Änderungen" lassen sich nun die aufgeführten Polygone löschen.


Notizen

Mit der Funktion Notizen können Textnotizen an jede beliebige Position innerhalb des Kartenbereichs einer Stelle gesetzt werden .

Voraussetzungen:

  • Der Stelle muss das Menü Notizen zugewiesen worden sein. (Tabelle: u_menue2stelle)
  • Dem Nutzer muss die Zuordnung der Stelle zum Menü Notizen zugewiesen sein. (Tabelle: u_menue2rolle)
  • Es muss ein Layer Notizen eingetragen worden sein.
  • Der Stelle muss der Layer Notizen zugewiesen sein.
  • Der Layer muss dem Nutzer zugewiesen worden sein.
  • Ebenso müssen Class und Label sowie die Zuordnung zur Klasse und Layer eingetragen sein. Nutzen Sie für all diese Eintragungen den Abschnitt Notizen aus mysql_install_help.php aus dem Verzeichnis layouts/sql_dumps
  • Es muss eine Datenquelle in der postgis Datenbank vorhanden sein. Das heißt die Tabelle für Notizen muss existieren. Wenn nicht kann diese mit dem SQL-Statement aus postgres_install.sql angelegt werden. (in layouts/sql_dumps)

Erst wenn diese Voraussetzungen erfüllt sind, erscheint das Menü zum Anlegen neuer Notizen.

Image002.jpg

Klicken Sie auf Notizen und legen eine neue Notiz an. Diese erscheint nach dem Absenden und dem aktiv schalten im Kartenfenster. Die zu definierende Textposition zeigt auf die Spitze des Bezugspfeils.

Image004.jpg

Wenn man Text in mehreren Zeilen haben möchte, muss man im Textfeld mit der Enter-Taste feste Zeilenumbrüche eingeben.

Image006.jpg

Wenn man eine Notiz ändern möchte macht man die Abfrageoption des Layers Notizen aktiv, wählt den Infoknopf und selektiert in der Karte die Notiz, die man ändern möchte. Dort kann man dann auf ändern klicken und kommt wieder in das Formular, welches zum anlegen neuer Notizen dient.

Image008.jpg

Kataster

Darstellung der ALKIS-Daten. Neben der Darstellung der Verwaltungseinheiten, Flurstücke, Gebäude und Nutzungsartenflächen werden zahlreiche weitere Themen aus ALKIS in Karten und Tabellenform angezeigt. Eine detaillierte Beschreibung welche Layer es gibt und wie diese definiert sind findet sich hier: Gruppen_und_Themen_für_ALKIS

Abgesehen davon, dass man jeden Layer über die Suchfunktion des GLE suchen kann, gibt es für die Suche nach Adressen, Flurstücken, Grundbuchblättern, Eigentümern und historischen Flurstücken spezielle Suchformulare in denen eine hierarchische Suche mit Auswahllisten unterstützt wird.

Die Fortführung des ALKIS-Datenbestandes erfolgt über die NAS Schnittstelle mit ogr2ogr in Anlehnung an die PostNAS Suite.

Für die Datenaufbereitung werden nutzerspezifische Skripte verwendet, die bei der Fortführung automatisch ausgeführt werden.

Flächenversiegelung

Erfassung und Darstellung von Versiegelungsflächen auf der Grundlage von Luftbildern

Aufbau des PHP-Skript

Die Anwendung ist so programmiert, dass alle Aufrufe über die Datei index.php erfolgen. Die Seiten, die der Benutzer im Browser angezeigt bekommt, werden zur Laufzeit durch den Server zusammengesetzt.

index.php

Die Datei index.php startet mit dem Einbinden einer Konfigurationsdatei config.php und einer Startdatei start.php, unterscheidet und verzweigt in Anwendungsfälle mit einer switch-Anweisung und endet mit einer Enddatei end.php. Zur Unterscheidung der Anwendungsfälle nutzt das Skript den Parameter $go und $go_plus. Wenn $go_plus einen Wert enthält, wird dieser an $go angehängt. Wenn $go leer ist, wird ein Standardfall ausgeführt. In den jeweiligen Anwendungsfällen (cases), werden die entsprechenden Funktionen der Benutzeroberfläche als Methoden der Klasse GUI der Klassenbibliothek kvwmap.php aufgerufen.

config.php

Die Konfigurationsdatei enthält verschiedene Voreinstellungen zur Konfiguration der Anwendung, die in den PHP-Dateien verwendet werden. Die Voreinstellungen werden über das Setzen von Konstanten realisiert. Die Konstanten sind thematisch in Gruppen zusammengefasst und umfassen z.B. Einstellungen zu Dateipfaden, Layout und WMS-Capabilities Metadaten. Des Weiteren wird in der Konfigurationsdatei eingestellt, welche Klassenbibliotheken geladen werden sollen und diese eingebunden. Dazu gehört auch die Bibliothek php_mapscript.so bzw. dll. Außerdem wird ein Debugdatei-Objekt $debug aus der Klasse debugfile der Klassenbibliothek kvwmap.php mit einem vorgegebenen Debuglevel eingestellt, und Datenbankobjekte für den Zugriff auf die Benutzer-, Karten- und Geometriedaten initialisiert.

start.php

In der Startdatei wird zunächst das Objekt für die Benutzeroberfläche initialisiert. Die Klasse GUI für die Benutzeroberfläche ist in der Klassenbibliothek kvwmap.php enthalten. Anschließend werden alle an das Skript übergebenen Variablen aus der PHP-Systemvariable $_REQUEST an das Objekt $GUI in das Array $formvars übergeben. Wird die PHP-Anwendung über CLI aufgerufen, werden die Argumente aus der Kommandozeile an $formvars übergeben. In start.php kann eingestellt werden, das wievielte Argument an welches Element von $formvars übergeben werden soll. In weiteren Schritten werden die Datenbankobjekte an $GUI übergeben und geöffnet. Zur Identifizierung des zugreifenden Benutzers wird die vom Web-Server bereitgestellte PHP-Konstante REDIRECT_REMOTE_USER verwendet. An Hand von $login_name werden aus der Benutzerdatenbank alle Benutzerdaten ausgelesen und dem Objekt $user aus der Klassenbibliothek user.php zugewiesen, incl. der von ihm zuletzt genutzten Stelle. Soll beim aktuellen Aufruf keine neue Stelle eingestellt werden, wird diese Stelle für den Benutzer verwendet, ansonsten neu gesetzt. Vor dem Erzeugen des Stellenobjektes wird geprüft, ob der Nutzer auf die Stelle zugreifen darf. Abschließend wird für den Benutzer die Stelle als Rolle gesetzt, ein Menü-Objekt in $GUI->Menue initiiert und das Menü für die Stelle geladen. Je nach Einstellungen erfolgen zwischendurch Ausgaben in die Debug-Datei.

end.php

In der Datei end.php werden die offenen Datenbankverbindungen und die Debug-Datei geschlossen.

kvwmap.php

In der Klasse GUI sollten alle Funktionen enthalten sein, die die Interaktion des Benutzers mit dem Programm betreffen. Einige allgemeine Funktionen, wie das Lesen der Karteninformationen aus der Datenbank übernimmt die Klasse GUI, andere fachspezifische Aufgaben werden durch separate Objekte übernommen. Das gilt vor allem für die Funktionen der Fachschalen.

kvwmap mobil

Derzeit ist die Entwicklung einer App für die Erfassung von Geodaten im Offline-Modus mit Synchronisierungsfunktion in Arbeit. Damit wird es möglich sein Daten von Layern, die in kvwmap definiert wurden auf mobilen Endgeräten wie Handys oder Tablets zu erfassen oder zu bearbeiten. Details bitte bei den Entwicklern nachfragen.

Überblick

Mit kvwmap ist es möglich, auf einem mobilen Gerät, z.B. einem Tablet-PC oder Laptop, GPS-gestützt Daten zu erfassen. Diese Daten können dann anschließend auf den kvwmap-Hauptserver gespielt und mit den dort schon vorhandenen Daten synchronisiert werden. Auf dem mobilen Gerät wird ein eigener kvwmap-Server aufgesetzt, damit man komplett offline arbeiten kann und von keiner Internetverbindung abhängig ist. Um das mobile Gerät und den Server zu verbinden und die Daten zu synchronisieren, haben beide Maschinen eine gegenseitige PostgreSQL-Datenbankverbindung und können so Daten austauschen. Dokumente, wie z.B. Fotos werden über http ausgetauscht.

Voraussetzungen für die GPS-gestützte Erfassung

Um auf dem mobilen Gerät das GPS nutzen zu können, muss es entweder über einen eingebauten GPS-Empfänger verfügen oder es muss ein GPS-Empfänger per USB angeschlossen werden. Ist das GPS-Gerät installiert, ist es unter Windows über einen COM-Port (z.B. COM7) verfügbar. Damit kvwmap auf die Daten des GPS-Gerätes zugreifen kann, wird ein Programm benötigt, das die empfangenen GPS-Daten in eine Datei schreibt. Im Internet finden sich dazu diverse Programme. Am einfachsten ist es aber, das Abgreifen des Datenstroms über eine Batch-Datei mit folgendem Inhalt zu machen:

MODE COM7: baud=9600 parity=N data=8 stop=1
TYPE COM7 > "c:\PFAD\gpslog.txt"

Dieser Dateipfad im zweiten Befehl ist die Datei, in die die Daten geschrieben werden. Der Pfad muss in die config.php als Konstante „GPSPATH“ eingetragen werden. Damit das Loggen der GPS-Daten automatisch mit dem Systemstart beginnt, empfiehlt es sich, die Batch-Datei als Task einzurichten. In der config.php muss außerdem die Konstante „MOBILE“ auf „true“ gesetzt werden, damit man beim Einloggen die Möglichkeit hat, die GPS-Unterstützung auszuwählen.

Voraussetzungen für die Datenübertragung

Netzwerk, Firewall

Damit beide Rechner Daten austauschen können, muss jeder Rechner eine feste IP-Adresse besitzen und die Firewalls müssen entsprechende Ausnahmen für den Datenbank-Port 5432 (Eingang u. Ausgang) haben. Schliesst man das mobile Gerät an das Netzwerk, in dem sich auch der Server befindet an, sollten sich beide Maschinen gegenseitig sehen können.

Datenbankkonfiguration

Sowohl das mobile Gerät, als auch der kvwmap-Hauptserver müssen auf die PostgreSQL-DB des jeweils anderen zugreifen können. Dazu muss in der Datei „pg_hba.conf“ ein entsprechender Eintrag mit der IP-Adresse der anderen Maschine und der Authentifizierungsart „trust“ hinzugefügt werden. Auch der Zugriff auf die eigene Datenbank muss auf „trust“ gesetzt werden.

Beispiel:

local   all         all                               	        trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          	        trust
host    all         all         andereIP/32             	trust
# IPv6 local connections:
host    all         all         ::1/128                   	trust

config.php

Auf jeder der beiden Maschinen muss es ein Synchronisationsverzeichnis geben, welches in der config.php durch die Konstante „SYNC_PATH“ definiert wird. Außerdem muss der Pfad zum bin-Verzeichnis von PostgreSQL gesetzt sein (POSTGRESBINPATH).

Layer und Tabellen

Um auf dem mobilen Gerät Geodaten erfassen zu können und diese dann mit den auf dem Server vorhandenen Daten zu synchronisieren, müssen die zu erfassenden Layer auf beiden kvwmap-Systemen vorhandenen und komplett identisch sein. Die von den Layern verwendeten Tabellen müssen identisch sein und auch die Schemata der Tabellen müssen gleich heißen. Um die Datenbankverbindung zwischen beiden Systemen herstellen zu können, gibt es zusätzlich zu den Layern, die auf die jeweils eigene PostgreSQL-DB zugreifen auch noch Layer, die auf die Datenbank der jeweils anderen Maschine zugreifen. Abbildung 1 stellt dieses Konzept an Hand des Beispiellayers „Baumkataster“ schematisch dar.

Konzept mobil.png

Abbildung 1: Konzept des gegenseitigen Datenbankzugriffs über Layer in kvwmap

Damit die Datensätze, die vom Hauptserver auf das mobile Gerät gespielt werden, für die weitere Bearbeitung gesperrt werden können, muss es in jeder Tabelle eine Spalte „lock“ vom Typ character varying(50) geben. Hier wird beim Auspielen der Daten vom Hauptserver eine Lock-ID gespeichert, die einerseits den Datensatz sperrt und es außerdem möglich macht, beim Einspielen der Daten vom mobilen Gerät, die geänderten Datensätze den vorhandenen zuzuordnen. Werden auch auf dem Hauptserver Daten erfasst, müssen die Tabellen außerdem noch eine Spalte „client_id“ vom Typ character varying(10) besitzen, die als Standardwert den Namen des kvwmap-Servers speichern. Also bspw. „server“ oder „mobil1“. Der Primärschlüssel einer solchen Tabelle ergibt sich in diesem Fall aus einer fortlaufenden Spalte, z.B. „id“ und aus der Spalte „client_id“. Dadurch ist gewährleistet, dass bei gleichzeitiger Erfassung auf beiden kvwmap-Servern, es beim Zusammenspielen der Daten zu keinem Konflikt durch gleiche „id“ Werte kommt. Wenn es Verknüpfungen (subformPK,…) zwischen Layern gibt, müssen hier als Verknüpfungsattribute auch beide Spalten (id, client_id) verwendet werden. Das Datenmodell der Tabelle für den Layer Baumkataster sieht z.B. folgendermaßen aus:

CREATE TABLE grunddaten_baum(
  baumid serial,
  baumnummer integer NOT NULL,
  status character varying(10) NOT NULL,
  baumart character varying(255),
  kontrollintervall character varying(50) NOT NULL,
  "lock" character varying(50),
  client_id character varying(10) NOT NULL DEFAULT 'server',
  the_geom geometry,
  CONSTRAINT baumid_client_id PRIMARY KEY (baumid, client_id),
  CONSTRAINT enforce_dims_the_geom CHECK (ndims(the_geom) = 2),
  CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 25833)
)
WITH (OIDS=TRUE);

Enthält ein Layer Attribute vom Typ „Dokument“, um z.B. mit dem mobilen Gerät Fotos erfassen zu können, müssen diese auch beim Synchronisieren übertragen werden. Dazu muss auf jedem der beiden kvwmap-Systeme im Attributeditor für den jeweils fremden Layer im Optionenfeld des Dokumentattributes die Url der fremden Maschine mit folgendem Anwendungsfall eingetragen werden:

http://SERVER/kvwmap/index.php?go=sendeDokument&dokument=

Die Layer-Rechte werden so eingestellt, dass auf beiden Systemen Schreibrecht auf den eigenen Layern besteht. Die jeweils fremden Layer müssen nur Leserecht haben. Wichtig ist, dass auch die Spalte „lock“ auf lesend gesetzt wird und bei Layerverknüpfungen auch die Spalte „client_id“.

Aufspielen von Primärdaten auf den mobilen Client

Um bereits erfasste Daten vom Hauptserver auf das mobile Gerät zu spielen, gibt es den Anwendungsfall „go=export_layer“. Dieser sollte auf dem mobilen Gerät als Menüpunkt eingerichtet werden. Hat das mobile Gerät eine Netzwerkverbindung kann man den Menüpunkt aufrufen. Daraufhin erhält man ein Kartenbild und eine Legende mit allen externen Layern und allen gerade aktiven nicht-PostGIS-Layer (Abbildung 2). Man kann nun die Layer auswählen, von denen man Datensätze exportieren möchte. Wenn man auf „Neu Laden“ klickt, sollten die externen Layer in der Karte zu sehen sein. Ist dies nicht der Fall, funktioniert der Datenbankzugriff mobiles Gerät  Server möglicherweise nicht (siehe Abschnitt 3). Um die Datensätze räumlich einzugrenzen, wird ein Polygon gezeichnet. Zusätzlich kann man noch auswählen, ob die Tabellen auf dem mobilen Gerät geleert werden sollen, was zu empfehlen ist. Um auch Dokumente zu übertragen, muss man die Anmeldedaten für den Login am mobilen Gerät eingeben, da diese für die http-Übertragung der Dokumente benötigt werden. Ist alles richtig eingestellt, kann man auf „einlesen“ klicken.

Screen1 mobil.png

Abbildung 2: Anwendungsfall Primärdaten auf das mobile Gerät einlesen

Die Datensätze der ausgewählten Layer, die sich innerhalb des Polygons befinden, werden dadurch auf das mobile Gerät übertragen. Gleichzeitig werden die Datensätze auf dem Hauptserver gesperrt, was zum einen bewirkt, dass sie nicht noch einmal übertragen und außerdem nicht mehr editiert werden können. Die Sperrung bleibt solange erhalten, bis die Datensätze wieder vom mobilen Gerät auf den Hauptserver zurückgespielt werden.

Datenerfassung mit dem mobilen Client

Um für die Geodaten-Erfassung mit dem mobilen Gerät GPS-Unterstützung zu erhalten, muss im Anmeldefenster von kvwmap die Option „mobil“ ausgewählt werden. Nach der Anmeldung sollte im Kartenfenster ein zusätzlicher Button „GPS“ erscheinen. Mit diesem Button kann man die GPS-Verfolgung ein- oder ausschalten. GPS-Verfolgung heißt, dass, sobald sich die GPS-Position aus dem Kartenausschnitt bewegt, der Kartenausschnitt wieder auf die GPS-Position verschoben wird. Ist in der Karte keine GPS-Position als rotes Fadenkreuz zu erkennen, kann die GPS-Verfolgung aktiviert werden und es sollte dann auf die GPS-Position gezoomt werden. Ist dies nicht der Fall, werden möglicherlicherweise keine gültigen GPS-Positionsdaten in die GPS-Logdatei geschrieben (siehe Abschnitt 2). Im Geometrie-Editor gibt es 2 neue Buttons. Der erste ist der schon bekannte „GPS-Verfolgsmodus“. Der zweite „GPS“-Button dient dazu, die aktuelle Position als Koordinate für die Digitalisierung zu verwenden. Dadurch kann man z.B. die Grenzen eines zu erfassenden Gebietes ablaufen und nacheinander die Positionen als Stützpunkte des Polygons übernehmen (Abbildung 3). Alle anderen Funktionalitäten bei der Datenerfassung können in der gleichen Weise wie beim normalen kvwmap auch verwendet werden.

Screen2 mobil.png

Abbildung 3: GPS-gestützte Erfassung einer Fläche

Synchronisation der erfassten Daten mit dem Server

Nach der mobilen Datenerfassung können die Daten wieder vom mobilen Gerät auf den kvwmap Hauptserver gespielt werden. Dazu wird das mobile Gerät an das Netzwerk angeschlossen und auf dem Hauptserver wird der Anwendungsfall „go=import_layer“ aufgerufen. Dadurch erhält man eine ähnliche Maske wie beim Auslesen der Daten (Abbildung 4). Hier kann man wieder die externen Layer, die nun auf das mobile Gerät zugreifen, auswählen und die Verbindung in der Karte überprüfen. Außerdem kann die Dokumentenübertragung wieder optional aktiviert werden. Nach dem Klick auf „importieren“ werden die Daten vom mobilen Gerät auf den Hauptserver übertragen. Dabei werden zum einen die neu erfassten Daten als neue Datensätze auf dem Server angelegt. Die zuvor vom Hauptserver auf das mobile Gerät überspielten und dort möglicherweise editierten Daten werden auch auf den Hauptserver übertragen und dort aktualisiert. Dabei werden die Sperrungen der Datensätze entfernt. Wurden Datensätze auf dem mobilen Gerät gelöscht, werden diese auch auf dem Hauptserver gelöscht.


Screen3 mobil.png

Abbildung 4: Zurückspielen der erfassten Daten auf den Server

Installation

Da sich kvwmap frei in bestehende Systeme integrieren lässt gibt es auch keinen vorgegebenen Weg wie man die Anwendung installiert. Es kann sein, dass die Datenbanken schon existieren, dass es schon Datenbanknutzer gibt, dass schon ein Apache läuft oder auch vielleicht schon ein MapServer und die Postgis-Erweiterung. In solchen Fällen reicht es kvwmap als Web-Site zum Apache hinzuzufügen. Soll kvwmap erstmalig auf einem neuen Server eingesetzt werden, wird die Installation in einem Docker Container empfohlen. Das ist die einfachste und schnellste Variante und wird als Referenzinstallation gepflegt. Wer kvwmap in einem Docker Container laufen lässt kann sich über git nicht nur die jeweils neue Version von kvwmap holen, sondern auch die für kvwmap benötigten Softwarekomponenten vom dockerhub. Das kvwmap Image setzt auf Debian auf und nutzt die Images mdillon/postgis und mysql. Unterstützt der verwendete Server kein docker wird die Einrichtung unter einem Linux wie Debian oder Ubuntu empfohlen, weil hier viele Komponenten schon in den Repositories der Betriebssysteme bereitgestellt werden. Dennoch ist es etwas aufwendiger die einzelnen Komponenten zu installieren, zu konfigurieren und kvwmap so anzupassen, das es mit den Komponenten zusammenarbeiten kann. Da MapServer, Apache, MySQL und PostgreSQL auch unter Windows laufen kann auch kvwmap auf solchen einem Server betrieben werden. Nützlich zur Einrichtung der Komponenten sind hier Installer wie ms4w oder OSGeo4W. Ein einfacher WebServer und PostgreSQL reichen nicht aus. Es muss immer auch eine Unterstützung für phpMapScript und PostGIS vorhanden sein.

Eine Reihe zum Teil veralteter und nicht mehr gepflegter Installationsanweisungen findet man hier.

Voraussetzungen

In diesem Abschnitt wird eine Übersicht darüber gegeben, was alles für kvwmap installiert werden sollte bzw. aus welchen Komponenten die Anwendung besteht.

Folgende Komponenten werden für die Nutzung dieses Internet-GIS vorausgesetzt:

Serverseite

  • Apache - Es ist eine Version >= 2.0.48 eingesetzt werden, damit die Umgebungsvariable REDIRECT_REMOTE_USER genutzt werden kann. Diese wird zur Identifizierung des Nutzers verwendet. (siehe auch Apache bug-report)
    Session sollte z.Z. noch aktiv geschaltet werden, aber die Anwendung wird umgestellt, so dass sie ohne Session läuft und alle relevanten Parameter der Benutzer in der Datenbank zwischengespeichert werden.
  • PHP - Die Entwicklung von kvwmap läuft derzeit auf der Version 4.3.7
    Zur Konfiguration von php wurden in unserem Beispiel folgende Parameter gesetzt.
    ./configure --enable-force-cgi-redirect --with-config-file-path=/opt/lampp/etc --with-regex=system *:--with-gd=/usr/local/gd --with-freetype-dir=/usr/local/freetype --enable-gd-native-ttf *:--with-png-dir=/usr/local/libpng --with-jpeg-dir=/usr/local/libjpeg --with-zlib --with-zlib-dir=/usr/local/zlib *:--enable-dbase –with-pgsql=/usr/local/pgsql
    Diese Parameter müssen Sie an Ihr System anpassen oder ggf. ergänzen.
    Ob PHP richtig kompiliert wurde erkennen Sie durch die Ausgabe eines phpinfo() Befehls. Erzeugen Sie dazu eine Datei mit folgendem Inhalt in einem Verzeichnis unterhalb von wwwroot.
     <?php
       phpinfo();
     ?>
  • oder fügen Sie dieses Programmschnipselchen in eine andere php Datei ein.
    Das sollte dann eine Ausschrift erzeugen, die folgendes beinhaltet:

PHP Version 4.3.10

System

Linux berg 2.6.5-7.97-smp #1 SMP Fri Jul 2 14:21:59 UTC 2004 x86_64

Build Date

Jul 20 2005 18:31:02

Configure Command

'./configure' '--enable-force-cgi-redirect' '--with-regex=system' '--enable-dbase' '--with-pgsql=/usr/local/pgsql' '--with-gd=/usr/local/gd'

Server API

CGI


In Configure Command sollte --with-pgsql=… stehen und weiter unten:

GD Support

enabled

GD Version

2.0 or higher

GIF Read Support

enabled

GIF Create Support

enabled

JPG Support

enabled

PNG Support

enabled

WBMP Support

enabled

mysql

MySQL Support

enabled

Active Persistent Links

0

Active Links

0

Client API version

3.23.49

MYSQL_MODULE_TYPE

builtin

MYSQL_SOCKET

/tmp/mysql.sock

MYSQL_INCLUDE

no value

MYSQL_LIBS

no value

pgsql

PostgreSQL Support

enabled

PostgreSQL(libpq) Version

8.0.1

Multibyte character support

enabled

SSL support

enabled

Active Persistent Links

0

Active Links

0

Directive

Local Value

Master Value

pgsql.allow_persistent

On

On

pgsql.auto_reset_persistent

Off

Off

pgsql.ignore_notice

Off

Off

pgsql.log_notice

Off

Off

pgsql.max_links

Unlimited

Unlimited

pgsql.max_persistent

Unlimited

Unlimited

Darin erkennt man ob MySQL, GD und PostgreSQL wirklich unterstützt werden und z.B. welche PostgresSQL-Version unterstützt wird.

Wenn die Angaben z.B. zu pgsql nicht zu finden sind, sollte man php mit --with-pgsql=/pgsql-install-pfad neu kompilieren und wieder die entstandene PHP aus /usr/local/php/sapi/cgi ins cgi-bin Verzeichnis vom Webserver kopieren und neu testen.

Wenn das auch nichts bringt, greift das Lampp vielleicht auf eine ganz andere php zu, z.B. auf eine dynamisch geladene Bibliothek (libphp4.so). Testen durch das umbenennen von php in cgi-bin in php-bla. Danach sollte die Fehlermeldung vom Apache kommen, dass er die php-Datei nicht ausführen kann, oder der Quellcode gesendet werden, was dem gleich kommt. Dann suchen nach dem wahren Ort wo lampp php ausführt.

Informationen darüber findet man in den Anleitungen zum Ausführen von php in

Apache. In der httpd.conf steht zum Beispiel:

LoadModule php4_module modules/libphp4.so Um pgsql in libphp4.so nutzen zu können müsste man die pgsql Unterstützung eben da hinein kompilieren. Alternativ dazu steht die Variante php als cgi-Version einzurichten mit den entsprechenden Optionen in der httpd.conf:


Action php-script /cgi-bin/php


  1. AddHandler cgi-script .cgi

AddHandler php-script .php .php3


Dann könnte man also php als CGI-Version kompilieren mit:

--with-regex=system

Dazu zur Sicherheit gibt man an:

--enable-force-cgi-redirect

Um anzugeben, wo die Konfigurationsdateien zu finden sind: --with-config-file-path=/opt/lampp/etc


Nach dem Kompilieren von PHP gegebenenfalls php.ini anpassen:

short_open_tag = On            - erlaubt den verkürzten Tag für php 
session.auto_start = 1          - für Authentifizierung über PHP notwendig
session.gc_maxlifetime = xxxx  - Länge der php-Session in Sekunden
  • gd - wenn die Druckrotation funktionieren soll, gd nicht selbst kompilieren, sondern PHP kompilieren mit --with-gd
  • MapServer - Version ab 5.x wird empfohlen
    Zur Konfiguration von MapServer und damit auch phpMapScript wurden folgende Parameter gesetzt:
    OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT INPUT=EPPL7 INPUT=POSTGIS INPUT=GDAL INPUT=SHAPEFILE
    Welche Optionen für configure wirklich notwendig sind, hängt davon ab welche Datenarten und welche Services der MapServer unterstützten soll.
  • phpMapScript - ist in der Version: 1.194.2.3
    phpMapScript wird mit installiert, wenn die Option –with-php angegeben wird.
  • PDFClass – installieren in www-root Verzeichnis
    Quelle: http://www.ros.co.nz/pdf/
  • Imagemagick und Ghostscript - zur Druckvorschau und Bildkonvertierung, siehe Installation von ImageMagick mit JPEG-, PNG- und TIF-Unterstützung
  • MySQL – irgendeine aktuelle Version, verwende noch Tabellentyp MyISAM, wer Transaktionen machen will braucht eine Version die InnoDB unterstützt.
  • phpMyAdmin
    Zur Administration der MySQL Datenbank kann phpMyAdmin installiert werden. Jedes andere DB-Frontend mit ODBC-Treiber für MySQL ist natürlich auch möglich. Ich benutze z.B. auch MS-Access mit MySQL-ODBC.
  • PostgreSQL - Version ab 9.0
    Zur Verwaltung von PostgreSQL setzten wir bei GDI-Service pgAdmin III ein. Es ginge aber auch phpPgAdmin wobei pgAdmin III schon etwas mächtiger ist. Voraussetzung hierfür ist eine Verbindung über TCP/IP über Port 5432 und die Freischaltung von Postgres für externe Zugriffe in postgres.conf und eventuell das Eintragen der eigenen IP in pg_hba.conf.
  • PostGIS - Version ab 1.5
    Die Verwaltung von Geometrie geht recht gut mit dem Desktop GIS QuantumGIS. Darin kann man direkt Tabellen mit PostGIS Geometrie als Layer einbinden um schnell mal was anzeigen zu lassen oder räumlich zu bearbeiten.

Clientseite

  • pgAdmin III
    Zur Administration von PostgreSQL würde ich pgAdminIII empfehlen, aber es geht natürlich auch pgMyAdmin oder andere DB-Frontends mit ODBC für MySQL, z.B. MS-Access
    Quelle: http://www.pgadmin.org
  • ODBC-Treiber für PostgreSQL
    Für den Zugang zum Server von einem lokalen Recher aus, muss der ODBC-Treiber für PostgreSQL installiert werden.
    Quelle: http://www.postgresql.org/ftp/odbc/versions
  • PostGIS – aktuellste Version mit der modifizierten shp2pgsql aus dem Ordner kvwmap/tools
  • EDBS2WKT
    Konverter zum Einlesen von ALK-Daten in die postgresql Datenbank.
    Quelle: http://62.153.231.87/alk/edbs2wkt
    Vor dem Einlesen von ALK-Daten in die PostGIS-Datenbank sollte eben PostgreSQL mit PostGIS unterstützung installiert sein.

UMN-MapServer

Hinweise zur Installation des UMN-MapServers finden Sie unter: http://mapserver.gis.umn.edu/docs

Siehe auch: http://wiki.osgeo.org/index.php/Installation_von_MapServer%2C_Apache_und_PostgreSQL/PostGIS_auf_Debian_4.0 http://en.giswiki.org/wiki/UMN_MapServer_Installationsanleitung_von_Kai_Behncke http://freegis.org/pipermail/mapserver-de/2005-July/001408.html

UMN MapServer für Linux ist im Packet FGS und für Windows im Packet ms4w enthalten. Siehe dazu unter: http://www.maptools.org/fgs bzw. http://www.maptools.org/ms4w/

PostgreSQL mit PostGIS Erweiterung

PostgreSQL

Laden Sie sich PostgreSQL von http://www.postgresql.org

Zur Installation von PostgreSQL lesen Sie die INSTALL-Anweisung im Installationsverzeichnis von postgresql. Führen Sie aber zur Nutzung von Geos den configure Befehl folgendermaßen durch:

> LDFLAGS=-lstdc++ ./configure

an Stelle von einfach nur

> ./configure

Danach

> make

> make install

Zum Einrichten der Datenbank für kvwmap

> adduser postgres

Oft ist schon ein postgres user im system vorhanden, dann lassen.

Datenverzeichnis anlegen

> mkdir /usr/local/pgsql/data

Verzeichnis dem user postgres zuweisen

> chown postgres /usr/local/pgsql/data

Wechseln zum user postgres (als postgres anmelden)

> su – postgres

Datenbank initialisieren

> /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

Postmaster starten. (Diese Zeile in Startskript von Rechner aufnehmen, sonst immer nach Neustart von Server neu starten)

> /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data >logfile 2>&1 &

Kvwmap Datenbank anlegen.

> /usr/local/pgsql/bin/createdb <Datenbankname>

Als Datenbankname geben Sie den Namen an, den Sie in der config.php im kvwmap-Verzeichnis an die Variable $pgdbname übergeben haben. Z.B. kvwmapsp1-4-2

Zum Testen in Datenbank einloggen.

> /usr/local/pgsql/bin/psql kvwmapsp1-4-2

Alle Programme für postgres befinden sich in /usr/local/pgsql/bin.

Am besten den Pfad anpassen.

> export PATH=$PATH:/usr/local/pgsql/bin


Konfiguration:

Der Datenbankserver von PostgreSQL wird über die Datei postgres.conf konfiguriert. Diese Datei befindet sich im mit „initdb –D Verzeichnis“ angelegten data-Verzeichnis, z.B. in /usr/local/pgsql/data. Wenn was nicht funktioniert, kann man mal dort nachschauen, ob alles korrekt eingestellt ist. z.B. wenn der Zugang zur pgsql Datenbank von einem entfernten Rechner aus mit pgAminIII nicht funktioniert liegt das entweder daran, dass die Firewall den Port 5432 nicht frei gibt, oder die Verbindungen nur vom localhost erlaubt sind. Das kann man mit dem Parameter listen_addresses einstellen in der postgres.conf. Für den Zugriff von entfernten Rechner muss für Postgres der Port 5432 offen sein (entsprechend /etc/services). In /etc/hosts sollte der Rechner eingetragen sein, der zugreifen will. In /etc/hosts.allowed können auch Zugangsbeschränkungen eingetragen werden.


Projektdatenbank: Zur Einbindung von ALK-Daten in eine PostGIS-Datenbank sollte mit EDBS2WKT zunächst eine Datenbank neu erstellt werden, die die Tabellen für die ALK-Objekte enthält. Damit man diese Postgres-Datenbank dann mit kvwmap zusammen nutzen kann, muss man das Skript postgis_install.sql aus dem Verzeichnis /layouts/sql_dump von kvwmap in postgres ausführen. Danach sollten alle relevanten Tabellen in der Datenbank enthalten sein.

PROJ

Wenn Sie PROJ noch nicht für UMN-MapServer installiert haben, laden Sie sich PROJ von http://www.remotesensing.org:16080/proj

Entpacken von proj-version.tar.gz nach /usr/local

Erzeugen eines symbolischen Links:

  1. ln –s proj-version proj

Installieren mit:

  1. ./configure
  1. make
  1. make install

GEOS

Laden Sie sich GEOS von http://geos.refractions.net

Entpachen von geos-version.tar.gz nach /usr/local

Erzeugen eines symbolischen Links:

  1. ln –s geos-version geos

Installieren mit

  1. ./configure
  1. make
  1. make install

PostGIS

Man muss den PostgreSQL Source haben und PostgreSQL installiert haben.

Laden Sie sich PostGIS von http://postgis.refractions.net

Folgen Sie der Installationsanleitung in README.postgis

Zur Aktivierung der PROJ und GEOS Unterstützung in Makefile.config USE_PROJ und USE_GEOS auf 1 setzen und als Pfade /usr/local angeben.

Installieren mit: make -> make install

Zur Einrichtung der PostGIS Erweiterung für die kvwmap Datenbank:

  1. createlang plpgsql <Datenbankname>
  1. psql -f lwpostgis.sql -d <Datenbankname>

Als Datenbankname geben Sie den Namen an, den Sie in der config.php im kvwmap-Verzeichnis an die Variable $pgdbname übergeben haben. Z.B. kvwmapsp1-4-2

Anlegen der Tabellen für die Koordinatensysteme

  1. pgsql –f spatial_ref_sys.sql

Es muss auch ein Benutzer angelegt sein, mit dem Sie von kvwmap aus auf die Datenbank zugreifen. Nutzer hinzufügen:

  1. createuser –P <Benutzername>

<Benutzername> ist der Name unter dem Sie auf die Datenbank von kvwmap aus zugreifen, z.B. kvwmap Anschließend werden Sie nach einem Passwort <Passwort> für den Nutzer gefragt. Der hier angegebene Name bzw. Passwort wird dann in der config.php im kvwmap Verzeichnis auf die Variable $PostGISdb->user=’<Benutzername’ bzw. $PostGISdb->passwd='<Passwort>' gesetzt. 2.3.5 Datenbank Sichern und Wiederherstellen

Eine PostGIS Datenbank lässt sich mit dem pg_dump Befehl sichern. Dabei wird eine sql-Datei erzeugt, die später zur Wiederherstellung eines alten Standes verwendet werden kann. Um die Sicherung ausführen zu können melden Sie sich am Besten auf Ihrer Konsole als postgres an.

  1. su postgres

Anschließend wechseln Sie in ein Verzeichnis, in dem postges Schreibrechte hat, z.B.

  1. cd /usr/local/pgsql/data

Dort führen sie den dump Befehl aus.

  1. ../bin/pg_dump -f <dateinamedersicherung.sql> <datenbankname>

Zum wiederherstellen müssen Sie die alte Datenbank löschen.

  1. dropdb <datenbankname>

Anschließend legt man die Datenbank wieder an, fügt den PostGIS Support und die Referenzsystem hinzu und läd dann die Sicherung ein.

  1. createdb <datenbankname>
  1. createlang plpgsql <datenbankname>
  1. psql -f postgis.sql -d <datenbankname>
  1. psql –f spatial_ref_sys.sql –d <datenbankname>
  1. psql -f <dateinamedersicherung.sql> -d <datenbankname>
  1. vacuumdb -z <datenbankname>

Die Dateien postgis.sql und spatial_ref_sys.sql befinden sich in dem share Verzeichnis des pgsql Verzeichnisses. Die letzte Zeile dient dem Auffrischen der Tabellen und der Neuorganisation der Indizee und des Speicherplatzes.

MySQL

Installieren Sie auf Ihrem System einen MySQL Server. Folgen Sie den Installationsanleitungen unter: http://dev.mysql.com/doc/index.html Führen Sie zum einrichten der der kvwmap-Tabellen die Datei mysql_install.sql aus dem Verzeichnis /layouts/sql_dump

Schritte zur Installation von kvwmap

Um kvwmap nutzen zu können müssen die oben beschriebenen Komponenten installiert sein.

Nachfolgend werden die Schritte beschrieben, die absolviert werden sollten, damit man im Client eine Karte sehen kann. Dazu gehören einige Einstellung die den Server betreffen. Diese werden in der Datei config.php vorgenommen. Die meißten Einstellungen werden über Konstanten vorgenommen. Wenn noch Einstellungen vorgenommen werden müssen, die irgentwo anders im Quellcode fest verankert sind lassen Sie es mich wissen, dann baue ich das auch als Konstane in die config.php ein.

Und es sind eine Reihe von Eintragungen in der MySQL-Datenbank vorzunehmen, z.B. das Anlegen einer Steller, Benutzer, Layer, Menüpunkte etc.

Verzeichnisse

  • Entpachen sie das Packet kvwmap_Version in das www-root
  • In www-root (z.B. /usr/local/httpd/htdocs) sollten folgende zusätzlichen Verzeichnisse angelegt werden:
  • /tmp – für die dynamisch generierten Bilder vom MapServer. Dies ist der Pfad der in der MapDatei für IMAGEPATH steht.
  • Auf der gleichen Ebene wie www-root (z.B. /usr/local/httpd) sollten folgende Verzeichnisse angelegt werden.
  • /logs – Log- und Debugdateien lässt sich in config.php ändern
  • /var – Datenverzeichnis, lässt sich auch in config.php anpassen.
  • Unter dem Verzeichniss var legen sie standardmäßig /data an und darunter die Verzeichnisse für Ihre Daten

config.php

Eine Reihe von Einstellungen für das Programm kann über die Werte von Konstanten in einer zentralen Konfigurationsdatei der config.php in der Wurzel des Programmverzeichnisses erfolgen. Im folgenden werden die definierten Konstanten und ihre aktuell eingestellten Werte angezeigt. Die Standardwerte stehen in Klammern dahinter. Einige Werte setzen sich aus anderen zusammen. Die Konstanten und Werte sind mit Punkt getrennt. Die Punkte gehören nicht zum Wert.

  • INSTALLPATH = /opt/lampp/ (/opt/lampp/)
  • WWWROOT = /opt/lampp/htdocs/ (INSTALLPATH.htdocs/)
  • URL = 139.30.110.27/ (localhost)
  • LOGPATH = /opt/lampp/logs/ (INSTALLPATH.logs)
  • LAYOUTPATH = /opt/lampp/htdocs/kvwmap_1.4.0/layouts/ (WWWROOT.APPLVERSION.'layouts/)
  • SNIPPETS = /opt/lampp/htdocs/kvwmap_1.4.0/layouts/snippets/ (LAYOUTPATH.snippets/)
  • diese Liste ist unvollständig

Datenbankeinträge für die Anzeige im Client

Um in der Benutzeroberfläche des kvwmap-Clients überhaupt etwas sehen zu können, müssen mindestens eine Stelle und ein Benutzer eingetragen werden und ein Layer angelegt sein. Eine Beschreibung zur Verwaltung von Benutzerdaten und Karteninformationen finden Sie unter Abschnitt 5.

Installation mit ms4w

Hier wird die Installation von kvwmap unter MapServer für Windows (ms4w) beschrieben.

Voraussetzung ist das aktuelle Packet von ms4w, download unter: http://www.maptools.org/ms4w/

Installation mit fgs

Hier wird die Installation von kvwmap in der Free OpenSource GIS Suite (fgs) beschrieben.

Voraussetzung ist das aktuelle Packet von fgs, download unter: http://dl.maptools.org/dl/fgs/releases/1.0/1.0.0/self-installers/

--Markus Hentschel 16:53, 25. Jul 2007 (CEST)
Vorteil FGS: sehr leichte Installation, leichte Nachinstallation von weiteren Komponenten.
Nachteil FGS: einige Funktionalitäten gehen nicht, weil alle Komponenten vorkompiliert sind und nicht geändert werden können. Beispiel: Druck rotieren geht nicht. Bei Mapserver < 5.0: Mapserver ist mit den Standardeinstellungen der map.h und mapsymbol.h kompiliert, z.B. MS_MAXIMAGESIZE_DEFAULT=2048 oder MS_MAXSYMBOLS=64 (In der neuesten FGS-Version 1.0 nicht mehr nötig).
--Pkorduan 14:09, 28. Okt 2007 (CET)
Weiterer Nachteil bei Version 0.2: Das Modul postgis-lib:1.0.6 ist ohne proj Unterstützung kompiliert. Selbst von das proj-lib Modul für fgs installiert ist, kann postgis trotzdem keine transformationen rechnen. Der SQL Befehl transform() funktioniert nicht und somit auch keine Koordinatentransformationen mit PostGIS on-the-fly. (Hat nichts mit MapServer zu tun. Der transformiert fleißig mit Proj) Wenn man kvwmap mit Layern in unterschiedlichen EPSG-Codes verwenden möchte, dann muss PostGIS transformieren können. Der Parameter USE_PROJ=1 muss für postgis gesetzt sein. Man muss also in dem Fall postgis für fgs neu kompilieren (In der neuesten FGS-Version 1.0 nicht mehr nötig).

Zum Installieren von FGS bzw. von Modulen innerhalb der FGS-Umgebung siehe auch drei HowTo's:



Administration

Die Administrationsoberfläche

Die Administrationsoberfläche kann über "go=Administratorfunktionen" aufgerufen werden. Hier findet man verschiedene Funktionen, die die Administration von kvwmap vereinfachen.

Aktualisierung des Quellcodes per git

Bei der Entwicklung von kvwmap wird die Versionsverwaltungssoftware git verwendet. Auf https://github.com/srahn/kvwmap wird die Entwicklung gehostet. Auch wenn man nicht selber an der Entwicklung teilnimmt, kann man git nutzen, um damit den Quellcode des eigenen kvwmap auf Knopfdruck zu aktualisieren.

Es ist empfehlenswert, sich vor der Einrichtung dieser Funktionalität zu entscheiden, ob man kvwmap in der stabilen Releaseversion (branch: kvwmap) oder in der Entwicklungsversion (branch: develop) betreiben möchte. Bei der Verwendung der Releaseversion umfasst die Aktualisierung des Quellcodes nur das Einspielen der Bugfixes. Bei der Entwicklungsversion werden Bugfixes und neue Funktionalitäten eingespielt.

Voraussetzungen:

  • git muss auf dem eigenen Server installiert sein
  • der kvwmap-Ordner muss ein git-Repository sein:
Ein solches Repository wird folgendermaßen erstellt: In dem Verzeichnis, in dem der kvwmap-Ordner liegen soll, führt man diesen Befehl aus:
git clone -b <branch> https://github.com/srahn/kvwmap <kvwmap-Ordner>
<branch> muss dabei durch "kvwmap" oder "develop" ersetzt werden und <kvwmap-Ordner> durch den gewünschten Ordnernamen von kvwmap.
Die aktuelle Version von kvwmap wird nun von github heruntergeladen und unter dem ausgewählten Ordner abgelegt.
Jetzt muss man dieses kvwmap noch lauffähig machen, indem man seine config.php, alle custom-Ordner und seine Wappen hineinkopiert, mindestens:
  • /graphics/custom
  • /fonts/custom
  • /layouts/custom
  • /layouts/snippets/custom
  • /symbols/custom
  • /graphics/wappen
Eigene Fonts, Symbols, Snippets etc., die noch nicht in den custom-Ordnern liegen, müssen dorthin verschoben werden.
  • der Apache-Nutzer muss das Recht haben, git auszuführen und zwar als der Nutzer, der das Repository angelegt hat
Dazu muss die Datei /etc/sudoers editiert werden und zwar als root mit dem Befehl "visudo". Hier fügt man dann z.B. eine Zeile in folgender Form hinzu:
www-data        ALL=(fgs) NOPASSWD: /usr/bin/git
In diesem Beispiel heißt der Apache-Nutzer "www-data", der Nutzer, der das Repository angelegt hat, heißt "fgs" und der Pfad zum git lautet "/usr/bin/git".
  • in der config.php muss die Konstante "GIT_USER" auf den Nutzer gesetzt sein, der das Repository angelegt hat

Wenn alle Voraussetzungen erfüllt sind, erscheint in der Administrationsoberfläche ein Modul "Aktualisierung des Quellcodes". Hier wird der Status des eigenen Quellcodes angezeigt, indem mit dem Stand auf github verglichen wird. Falls der Status nicht aktuell ist, wird die Anzahl der neuen commits auf github angezeigt und man kann auf "aktualisieren" klicken um die Änderungen einzuspielen.

update code.PNG

Aktualisierung der Datenbanken

In diesem Modul wird der Status der MySQL- und PostgreSQL-Datenbank überprüft. Dies geschieht dabei separat für jede Komponente von kvwmap, also für das Hauptprogramm und für jedes aktivierte Plugin. Wenn der Status nicht aktuell ist (wenn es also neue Migrationsdateien in den db-Ordnern gibt, weil man zuvor gerade den Quellcode aktualisiert hat), kann man die Datenbanken durch Klick auf "aktualisieren" auf den aktuellen Stand bringen.

Stelle

Stelle anlegen

Zum Anlegen einer neuen Stelle kann der Menüpunkt „Stelle Anlegen“ aus der Menügruppe „Stellenverwaltung“ verwendet werden.

Zu einer Stelle können neue Menügruppen, Layer und Benutzer hinzugefügt werden.

z.Z. können nur ganze Gruppen von Menüs hinzugefügt werden. Wenn einzelne Menüpunkte hinzugefügt werden sollen, am besten den Menüpunkt in der Tabelle

u_menues anlegen und einer Gruppe zuordnen, Reihenfolge beachten. Anschließend diese Gruppe aus der Stelle löschen und wieder neu hinzufügen. Dann werden

alle Untermenüs auch zu der Stelle übernommen.

Die Rechte der Nutzer in den Stellen werden allgemein durch die Zuordnung der Layer und Menüpunkte geregelt. Die Rechte an extra in der Tabelle

u_funktionen eingetragenen Funktionen müssen extra in die Tabelle u_funktionen2stelle eingetragen werden.

Stellen anzeigen

Über den Menüpunkt „Stellen anzeigen“ der Menügruppe Stellenverwaltung können Stellen angezeigt werden, gelöscht und geändert werden.

Stellen ändern

Zur Änderung von Stellen siehe „Stelle anlegen“.

Maximale Ausdehnung des Kartenfensters für eine Stelle ändern

Die Koordinaten für die maximale Ausdehnung des Kartenfensters einer Stelle läßt sich über die Angaben zu minxmax, minymax, maxxmax, maxymax in der

Tabelle stelle in der Zeile der entsprechenden Stelle ändern.

Neben der maximalen Ausdehnung kann über das Setzen von Filtern (siehe Tabelle 'used_layer' -> Filter) der Inhalt von Layern, dessen Objekte in der

PostgreSQL-Datenbank gehalten werden, stellenbezogen weiter eingeschränkt werden.

Einschränkung der Stellen bezüglich Inhalt des Kartenfensters und entsprechender räumlicher Anfragen, die mittels Raumbezug (Polygon) zuvor festgelegt

werden können, befindet sich z.Z. in der Entwicklung und wird in der nächsten Version zur Verfügung stehen!

Filterverwaltung

Die Filterverwaltung ermöglicht nicht nur das stellenbezogene räumliche bzw. inhaltliche Einzuschränken von Layern, sondern auch deren Sachdaten. Dazu wählt man den Menüpunkt „Filterverwaltung“ (go-Variable: "Filterverwaltung").

Es werden nur Layer berücksichtigt, die einen Data-Eintrag haben. Damit auch ein reiner MS-Query-Layer filterbar ist, bekommt er im DATA eine Pseudo-Geometrie:

geom from (select oid, *, st_geometryfromtext('POINT(0 0)', 25833) as geom
from public.antraege) as foo ...

Hier wird als nächsten Schritt die entsprechende Stelle und dann der betroffene Layer mit Hilfe der Auswahllisten gewählt. Damit wird eine Liste von Attributen geladen, über die der Layer eingeschränkt werden kann. Wichtig: Jedes Attribut, das in der Filterverwaltung geladen werden soll, muss im DATA-Statement des Layers eingetragen sein. Filterverwaltung.jpg

Zu jedem Attribut kann jetzt ein Wert festgelegt werden, um den der Layer eingeschränkt werden soll. Mit den Operatoren lassen sich die Einschränkungen noch flexibler gestallten, wie in den folgenden Beispielen gezeigt wird:

Filter1.jpg

1. In diesem Beispiel werden nur Informationen vom Layer ausgegeben, die den Wert „132100“ im Attribut „gemkgschl“ aufweisen.

Filter2.jpg

2. Wie in diesem Beispiel können den Werten auch Platzhalter hinzugefügt werden. Hier werden all Layerinformationen ausgegeben, die im Attribut „gemkgschl“ mit dem Wert „1321“ beginnen. Platzhalter lässt sich beliebig verschieben.

Ist einem Layer eine Geometrie zugeordnet, wird in der Liste der Attribute „the_geom“ geladen. In dem Fall ist es möglich die Einschränkung zum Layer räumlich durch ein Polygon festzulegen (Das gilt natürlich nicht für die o.a. MS_Query-Layer mit Dummy-Geometrie). Dazu setzt man das Häkchen bei „Polygon“ und legt im Anschluss das Polygon im Kartenfenster fest. Als Operator kann man zwischen „Intersects“ oder „Within“ wählen. „Intersects“ schränkt die Objekte des Layers räumlich so ein, dass alle Objekte die vom Polygon geschnitten oder innerhalb des Polygons liegen abfragbar sind und dargestellt werden. Der „Within“-Operator stellt dabei nur die Objekte dar, die zu 100% innerhalb des Polygons liegen.

Als letzter Schritt müssen die Einstellungen noch mit dem „Speichern“-Button gesendet bzw. gespeichert werden.

Um die Einschränkungen eines Layer zu ändern, löscht man die entsprechenden Werte zu den Attributen oder ersetzt diese durch neue Werte. Im Falle einer räumlichen Einschränkung durch ein Polygon reicht es, wenn der Wert „Polygon“ zum Attribut „the_geom“ deaktiviert und die Änderung gespeichert wird. Um ein Polygon neu zu übernehmen, aktiviert man den Wert „Polygon“, löscht das geladene Polygon und legt ein neues Polygon fest, dass dann wieder gespeichert wird.

  • Stellenbezogene Filterung: Besitzt der Layer ein Attribut vom Formularelementtyp StelleID, dann kann hier in diesem Attribut eine konkrete Stelle (in der Regel wahrscheinlich die Stelle, die gerade gefiltert wird) eingetragen werden. Der Nutzer sieht in der Stelle nur die Datensätze, die im Feld Stelle-ID den entsprechenden Eintrag haben. Vorsicht bei Nutzern, die mehreren Stellen zugeordnet sind!
  • Nutzerbezogene Filterung: Besitzt der Layer ein Attribut vom Formularelementtyp UserID, dann kann statt einem festen Wert hier in diesem Attribut auch die Varibale $userid eingetragen werden, welche durch kvwmap bei Anwendung des Filters durch die jeweilige Nutzer-ID ersetzt wird. So wird es möglich, einen Filter zu definieren, durch den jeder Nutzer nur seine eigenen Datensätze sehen, abfragen und bearbeiten darf.

Stellen ohne Authentifizierung

In kvwmap können mehrere Stellen eingerichtet werden, die jeder Benutzer ohne vorherige Authentifizierung aufrufen kann. Diese werden im Folgenden Gast-Stellen genannt. Zur Einrichtung sind folgende Einstellungen notwendig:

  • In der Konfigurationsdatei config.php ist für die Konstante GAST_STELLE ein Array mit ID's einzutragen, die als Gast-Stellen fungieren sollen. z.B. für die Stellen mit der id 1 und 35:
$gast_stellen = array(1, 35);
  • In der stellenbezogenen Layereinstellung kann festgelegt werden welche Layer eingeschaltet sein sollen, wenn sich ein Nutzer die Stelle als Gast aufruft. Dazu "Stellen anzeigen" dann "Layer" der entsprechenden Stelle auswählen und auf "Ändern" in der Spalte "Eigenschaften stellenbezogen" klicken. Für aktiv bei Gast kann dann ja oder nein ausgewählt werden, siehe Abbildung.
aktiv bei Gast
  • Man kann sich aus einer Gast-Stelle wieder ausloggen über den passenden im Menü befindlichen Menüpunkt oder über den Parameter go=logout. Nach dem ausloggen landet der Nutzer auf der Anmeldeseite von kvwmap.

Ist ein Gast-Stelle eingerichtet, kann diese wie folgt genutzt werden:

  • Aufruf der URL von kvwmap mit dem zusätzlichen Parameter gast. Als Wert für den Parameter gibt man die ID der Stelle an, die man als Gast benutzen möchte. z.B.: http://www.gdi-service.de/kvwmap/index.php?gast=35
  • Der Kartenausschnitt der aufgerufenen Stelle stellt sich beim Aufrufen der Seite auf die maximale Ausdehnung der Stelle ein.
  • Es sind alle Layer aktiv, die in den stellenbezogenen Layereigenschaften der Gaststelle unter "aktiv bei Gast" auf "ja" gesetzt wurden.
  • Es sind alle Layergruppen geöffnet, in denen sich aktive Layer befinden.
  • Ruft ein neuer Gastnutzer kvwmap auf, wird für diesen in der Tabelle user ein neuer Nutzer mit dem Attribut Funktion="gast" angelegt. Dieser Nutzer wird solange genutzt, wie die Session im Browser gilt. Meldet sich der Nutzer aktiv ab oder schaltet den Browser aus, wird beim nächsten Aufruf der Gaststelle wieder ein neuer Gastnutzer angelegt.
  • Da die Anzahl der Gastnutzer schnell ansteigen kann, sollten die Tabellen in denen Einstellungen der Gastnutzer stehen, möglicherweise auch durch ein Cron-Job bereinigt werden. Dazu kann dieses Script verwendet werden.

Nutzerverwaltung

Authentifizierung über PHP

Seit der Version 1.6.5 erfolgt die Authentifizierung über PHP und die für die Nutzereinstellungen verwendete MySQL Datenbank. Das PHP Skript prüft ob ein Benutzer sich bereits authentifiziert hat, wenn nicht, erscheint ein Dialog zur Eingabe von Benutzername und Passwort. Nach absenden diese Formulares wird in der MySQL Datenbank von kvwmap nachgesehen ob der Benutzername zum Passwort passt.

Anmeldefenster

Wenn ja, wird der Benutzername in einer Sessionvariable gespeichert und für die Session immer mitgeführt. Damit die Sessionfunktion für PHP auch funktioniert, muss in der php.ini die Variable session.auto_start=1; gesetzt sein. Danach erfolgen die weiteren Prüfungen, die aber dann genauso wie die Prüfung der Authentifizierung immer wieder ausgeführt werden. Erst wenn man sich eine bestimmte Zeit nicht beim Server gemeldet hat, wird die Session gelöscht und man muss sich wieder neu anmelden. Die Dauer der Gültigkeit der Session ist standardmäßig bei 24 Minuten (1440 Sekunden). Möchte man das ändern, kann man das über den Parameter session.gc_maxlifetime in der php.ini Datei. Nach der Änderung Apache neu starten oder graceful. Die Authentifizierung erfolgt in der Datei login.php in snippets. Dort kann man auch das Layout des Anmeldefensters anpassen. Wenn man seine eigene Datei bei update schützen möchte, lege man diese in snippets/custum ab und ändere den Pfad auf die Datei login.php in index.php in der Zeile:

  include(LAYOUTPATH.'snippets/login.php');

PHP Authentifizierung bedeutet also für alle, die kvwmap von vorherigen Versionen kennen, dass die Authentifizierung über den Web-Server wegfallen kann. Die in der Apache Konfiguration vorgenommenen Einschränkungen bezüglich der Authentifizierung können also herausgenommen werden, jedoch sollte man überlegen die Restriktionen der IP´s oder IP Bereiche weiterhin aufrecht zu erhalten. Also z.B.

 Order deny,allow
 Deny from all
 Allow from 139.30.110.0/255.255.255.0 # Ein ganzes Netz freigeben
 Allow from 62.159.207.22 # Einen Einzelnen Rechner freigeben

Dies ist unabhängig von der Persönlichen Authentifizierung.

Authentifizierung über den Web-Server

Nutzer von kvwmap müssen sich authentifizieren, damit die Anwendung weiß wen sie vor sich hat. Alle benutzerseitigen Einstellungen werden über den Benutzernamen gesteuert, die der Web-Server liefert, wenn die Authentifizierung anerkannt wurde.

Es gibt mehrere Möglichkeiten der Authentifizierung mit Apache siehe Dokumentation: http://httpd.apache.org/docs/2.0/howto/auth.html

Neben der Authentifizierung über das Standardmodul mod_auth kann auch mod_auth_mysql verwendet werden. Wir der Name schon sagt erfolgt dabei die Authentifizierung über eine MySQL-Datenbank und ist das sinnvollerweise die kvwmap-Datenbank, wenn man nicht schon eine andere Datenbank mit den Benutzern hat.

Authentifizierung mit Apache und MySQL

mod_auth_mysql.so sollte im Ordner modules vom apache Verzeichnis zu finden sein. Wenn nicht downloaden und compilieren nach Installanweisungen.

--HolgerR 10:54, 9. Aug 2006 (CEST)
Unter SuSE Version > 9 müssen apache2-devel und mysql-devel installiert sein, damit einerseits apxs2 auf dem System vorhanden ist und andererseits die Bibliotheken von mysql zur Verfügung stehen

Man muss zunächst in der httpd.conf das Modul mod_auth_mysql einbinden

Also das Komentarzeichen von folgender Zeile wegnehmen:

LoadModule mysql_auth_module modules/mod_auth_mysql.so

Dadurch wird in der Zeile:

<IfModule mod_auth_mysql.c>
   Include conf/mod_auth_mysql.conf
</IfModule>

Ebendieses Konfigurationsdatei geladen. Der entscheidende Teil für kvwmap sieht folgendermassen aus und muss für die eigene Version, das eigene Verzeichnis angepasst werden. Hier ist kvwmap_1.5.7 das zu schützende Verzeichnis


<Location /kvwmap-1.5.7>
 AuthName "MySQL Secured Place"
 AuthType Basic
 require valid-user
 AuthMySQLHost localhost
 # Der Name der Datenbank wo die Nutzer drin stehen.
 AuthMySQLDB kvwmap
 # Der Name des Nutzers, der sich da anmelden soll bei der Datenbank zum   nachsehen.
 AuthMySQLUser apachedemon
 AuthMySQLPassword # Das Passwort von apachedemon wenn es eins hat.
 AuthMySQLUserTable user # Die Tabelle wo die Nutzer drin stehen.
 AuthMySQLNameField login_name # Die Spalte wo die loginnamen drin stehen.
 AuthMySQLPasswordField passwort # Die Spalte wo die Passwörter drin stehen.
 # Setzen von Bedingungen, z.B. Einschraenkung des Zugriffs auf die Funktion --HolgerR 18:02, 3. Aug 2006 (CEST)
 AuthMySQLUserCondition "Funktion = 'user'" # Mehrere Bedingungen in Klammern setzen; Verknüpfungen mit 'and' 'or' moeglich
 ## AuthMySQLGroupTable user_grp (here do not modify this for the simple test!)
 ## AuthMySQLGroupField group (here do not modify this for the simple test!)
 AuthMySQLPwEncryption none # Hier kann man einschalten, das verschlüsselte
 #Passwörter erkannt werden. (z.B. md5 oder crypt)
</Location>

Infos unter http://modauthmysql.sourceforge.net/CONFIGURE

Nutzer anlegen

Image018.jpg

Zum Anlegen eines neuen Nutzers wählt man den Menüpunkt „Nutzer anlegen“ im Obermenü Nutzerverwaltung. Es erscheint der Benuterdaten Editor wie in Abbildung dargestellt. Man trägt mindestens die Werte mit * ein und sendet das Formular mit „Als neuen Nutzer eintragen“ ab. Der eingetragene Nutzer hat anschließend sofort zugriff auf die Stellen, die im Feld „Berechtigte Stellen“ zugewiesen wurden.

Nur beim erstmaligen anlegen muss man das Password festlegen. Die Rechte des Nutzers werden über die Zuordnung der Rechte zu den Stellen definiert.

Nutzer ändern

Um Nutzerdaten zu ändern wählen Sie erst „Nuter anzeigen“ und dann „ändern“ oder „löschen“.

Layer-Definition

Layer in kvwmap setzen üblicherweise auf einer PostGIS-Tabelle oder einem PostGIS-View auf (Type POLYGON, LINE, POINT) oder binden einen Dienst (WMS oder WFS) ein. Außerdem sind Rasterlayer (Type RASTER), reine Abfrage- (Type QUERY) oder -Beschriftungslayer (Type ANNOTATION) oder auch Diagrammlayer (Type CHART) möglich. Layer können auch auf Shapes basieren.

PostGIS-Tabelle anlegen und füllen

Prinzipiell gibt esw zwei verschiedene Möglichkeiten, PostGIS-Tabellen anzulegen und Daten in diese Tabellen zu spielen.

  • Wenn eine Shape-Datei vorliegt, kann diese mitsamt Geometrie, Index und Inhalt über das in PostGIS mitgelieferte Skript shp2pgsql als Datenbanktabelle angelegt werden (Beschreibung siehe z.B. die Beschreibung auf der offiziellen PostGIS-Seite). Prinzipiell:
shp2pgsql <options> <shapedateiname> <schema>.<tabellenname> | psql -d <datenbankname>
  • Soll die Tabelle zunächst ohne Inhalte definiert werden (z.B. weil noch gar keine Daten vorliegen), kann die Tabellendefinition über einen SQL-Datenbank Client (z.B. pgAdmin) und den entsprechenden CREATE TABLE Befehl erfolgen. Hier ein Beispiel für das Anlegen einer Tabelle zur Aufnahme von Jagdbezirken.Das SQL legt zu der Tabelle noch das Geometrie-Attribut an und indiziert dieses:
CREATE TABLE jagdkataster.jagdbezirke
(
 id serial NOT NULL,
 art character varying(15) NOT NULL,
 flaeche numeric,
 name character varying(50),
 zuordnung character varying(10),
 status boolean,
 verzicht boolean NOT NULL DEFAULT false
)
WITH (
 OIDS=TRUE
);
SELECT AddGeometryColumn('jagdkataster', 'jagdbezirke','the_geom',25833,'MULTIPOLYGON', 2);
CREATE INDEX gist_jagdbezirke
 ON jagdkataster.jagdbezirke
 USING gist
 (the_geom);

Die Tabelle muss die Systemspalte oid besitzen um von MapServer gelesen werden zu können.

Eine saubere Definition der Datenbanktabelle ist Voraussetzung einer sauberen Datenerfassung durch den Nutzer. kvwmap wertet die Tabellendefinition aus (Feldtypen, NOT NULL, Constraints etc.) und führt unter anderem damit eine Validierung der Nutzereingaben durch.

In der Postgres-Datenbank können auch Sichten (sog. "Views") angelegt werden. Das sind gespeicherte SQL-Abfragen, die im Prinzip wieder genau wie eine Tabelle abgefragt werden können. Mögliche Indizes in den Tabellen, die der View abfragt, gehen verloren, was die Sicht als Grundlage für einen Layer unter Umständen deutlich verlangsamen kann. Sind in kvwmap Editierrechte für den Layer gesetzt, müssen der Sicht Regeln (Rules) für den Insert-, Update- bzw. Deletefall hinzugefügt werden.

Neuen Layer anlegen

kvwmap bietet eine Admin-Oberfläche zum Erstellen von Layern: Den Layereditor (go=Layereditor). Layer sollten immer über den Layereditor angelegt werden, da kvwmap aus den Eintragungen der Layerdefintion (insbesondere dem query- und dem data-Feld) etliche Ableitungen erstellt, z.B. zur Definition der Attribute des Layers. Ein händisches Eintragen eines Layers in der MySQL-Datenbank ist möglich, ist aber sehr aufwändig und fehleranfällig, da in diversen Tabellen zwingend Eintragungen gemacht werden müssen, damit der Layer funktioniert.

Die meisten Einstellungen der Layerdefinition befassen sich mit der Beschreibung des Layers für den Mapserver. Eine ausführliche Beschreibung der Inhalte findet sich auf der Seite mapserver.org. Für die attributive Ausgestaltung des Layers in der Sachdatenabfrage bzw. -anzeige bietet kvwmap darüber hinaus noch zusätzliche Einstellmöglichkeiten. Eine umfassende Erläuterung findet sich in der Referenz zur MySQL-Datenbank von kvwmap.

Außerdem können in der Layerdefinition auch schon Defaults für die Zuordnung eines Layers zu einer Stelle festgelegt werden.

Vektorlayer

PostGIS-Vektorlayer

PostGIS-Vektorlayer werden mit Datentyp MS_LAYER_POLYGON, MS_LAYER_LINE, MS_LAYER_POINT definiert, wobei die Objekte der entsprechenden PostGIS-Tabelle durchaus auch Multipolygone, Miltilines oder Multipoints enthalten können.

Neben dem Namen (evtl. auch in verschiedenen Sprachen) und dem Datentyp sind die Zugehörigkeit zu einer Layergruppe, die Verbindung zur Datenbank (CONNECTION und CONNECTIONTYPE) und das datenbankseitig verwendete Koordinatenreferenzsystem (EPSG-Code) zwingend nötig.

Vektorlayer benötigen zur Darstellung in der Karte Klassen-Definitionen (mindestens eine). Zur Beschreibung des Aussehens der Objekte und deren Beschriftung bietet kvwmap den Style- und Labeleditor an (go=Style_Label_Editor). Werden mehr als eine Klasse definiert, müssen die Klassen durch die sog. Expression definiert werden.

Der Eintrag in der Query ist dann notwendig, wenn der Layer abfragbar sein soll - über die Karte oder über die Sachdatensuche. Beim Speichern der Layerdefinition wird die Query von kvwmap auf Fehler in der SQL-Syntax geprüft. Gleichzeitig entwickelt kvwmap aus der Query die Reihenfolge und die grundlegende Definition der Attribute, also der Sachinformationen zum Thema.

WFS-Layer



Raster-Layer

Unter Raster-Layer werden Layer verstanden, die in der Karte den Inhalt von georeferenzierten Bildern (üblicherweise TIFs) darstellen. Rasterlayer werden mit Datentyp MS_LAYER_RASTER definiert und können über das direkte Ansprechen von entweder einzelnen Rasterbildern oder einem Set von Rasterbildkacheln durch den Mapserver realisiert werden oder über das Einbinden von WMS-Diensten.

Layer mit Rasterkacheln

Statt einem DATA-Statement und einer CONNECTION enthält ein Rasterlayer einen TILEINDEX (Pfad zur Shape-Indexdatei der Rasterkacheln) und einem TILEITEM (Bezeichnung der Spalte in der Indexdatei, die die Dateinamen der einzelnen Kacheln enthält). Rasterlayer haben keine Klassen.

Hinweise zum Anlegen eines TILEINDEX für Rasterdaten

Liegen Bildkacheln vor, erfolgt das Anlegen eines TILEINDEX praktischerweise mit gdaltindex.

  • Voraussetzung:
    Es liegen georeferenzierte Rasterdaten z.B. Luftbildkacheln vor. Die Georeferenzierung erfolgt bei TIFF-Daten über tfw-Dateien und bei JPEG-Daten über jgw-Dateien.
    Der Inhalt der tfw- und jgw-Dateien ist identisch. Tiff-Daten lassen sich somit in JPEG umwandeln, was Speicherplatz spart und kürzere Ladezeiten ermöglicht. Die tfw- und tif-Dateien bzw. die jpg- und die jgw-Dateien sind sinnvollerweise in einem Verzeichnis unterhalb des Datenpfades z.B. /opt/lampp/var/data abzulegen.
  • Erzeugung des Index:
    Infos über die Befehlssyntax von „gdaltindex“ erhält man durch Eingabe des Kommandos „gdaltindex“ ohne Parameter auf der Linux-Konsole.
    Der Tileindex lässt sich einfach im Datenverzeichnis z.B. mit dem Kommando: „gdaltindex luftbilder luftbilder/*.jpg“ erzeugen. Hierbei ist der Verzeichnisname mit den Daten „luftbilder“ und das erzeugte shape-file mit dem Index heißt „luftbilder“. Es werden 3 Dateien erzeugt. In diesem Beispiel luftbilder.shp, luftbilder.shx und luftbilder.dbf.
  • Erzeugen des Index im Docker-Container:
    Läuft kvwmap im Docker-Container, steht gdal nicht auf dem Hostrechner und auch nicht im web Container zur Verfügung. Dazu benutzt man dann den gdal Container. Zunächst kann man sich mit dem Befehl
kvwmap status
darüber informieren ob der Container gdal läuft. Wenn nicht, muss dieser erst gestartet werden mit
kvwmap start gdal
Der Befehl zum Ausführen von gdaltindex im laufenden gdal Container sieht dann wie folgt aus:.
docker exec gdal gdaltindex /var/www/data/shapeverzeichnis/index_datei.shp /var/www/data/rasterverzeichnis/*.tif
Der gdal Container, der auf dem Image pkorduan/gdal-sshd basiert bindet das Volume wwwdata mit ein, welches das Verzeichnis /var/docker/www (früher /var/www) auf das interne Verzeichnis /var/www mapped. Das bedeutet, dass das Verzeichnis im gdal Container zur Verfügung steht. Die Pfadangaben des gdaltindex Befehls beziehen sich auf die Verzeichnisstruktur im gdal Container. Der Speicherort für die Shape-Dateien wird hier auch mit vollem und absolutem Pfad angegeben, da das Verzeichnis beim Einstieg in den Container defaultmäßig /data ist. Also im Hostsystem vorher in das Verzeichnis zu gehen wo sich die Rasterdaten befinden oder die Shape-Files hin sollen bringt nichts. Man könnte höchstens den gdal Container interaktiv starten mit:
docker run -it --name gdaltindex --volumnes-from wwwdata pkorduan/gdal-sshd /bin/bash
und den gdal Befehl darin manuell ausführen. Im Beispiel wurde dieser interaktive Container gdaltindex genannt, damit man ihn nach dem Aussteigen aus dem Container mit exit leichter wieder löschen kann.
docker rm gdaltindex
Möchte man nicht den vorhandenen gdal Container nutzen, sondern einen eigenen verwenden, der nach dem Ausführen sofort wieder gelöscht wird, übergibt man den Befehl mit dem Parameter -c
docker run --rm --volumes-from wwwdata pkorduan/gdal-sshd /bin/bash -c "gdaltindex /var/www/data/shapeverzeichnis/index_datei.shp /var/www/data/rasterverzeichnis/*.tif"
  • Einbindung als Raster-Layer:
    Es ist ein Rasterlayer in der Tabelle layer MySQL-Datenbank anzulegen. Der Tileindex muss jetzt lediglich in der Spalte „tileindex“ der Tabelle eingetragen werden. In diesem Beispiel ist der Eintrag „luftbilder.shp“ vorzunehmen.
  • Mögliche Probleme:
    Wenns nicht gleich funktioniert sind zunächst die Rechte der Daten zu überprüfen und ggfs. mit „chmod“ z.B. auf 755 zu setzen.
    Die Erzeugung eines Index über grössere Datenbestände kann schon mal etwas dauern. Das Kommando sollte dann aber ohne Fehlermeldungen durchlaufen.



WMS-Layer

Zum Anlegen eines WMS-Layers muss man mindestens den getCapabilities Request des WMS kennen. Beispiel für einen WMS, den das LUNG zur Verfügung stellt (Umbrüche nur für die bessere Lesbarkeit):

http://www.umweltkarten.mv-regierung.de/script/lung_wms_wms.php? //
VERSION=1.1.1&SERVICE=WMS&REQUEST=GetCapabilities&LAYERS=t7_versalzung&FORMAT=image/png&STYLE=default

(Merkwürdigerweise steht dort in der OnlineResource "request=GetLegendGraphic", was uns aber zeigt, dass der Dienst auch eine Legende liefern kann). Ein GetMap-Aufruf könnte also beispielsweise so aussehen:

http://www.umweltkarten.mv-regierung.de/script/lung_wms_wms.php? //
VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=t7_versalzung& //
WIDTH=600&HEIGHT=500&BBOX=348800,5999707,374749,6021620& //
FORMAT=image/png&STYLE=default&SRS=EPSG:25833


Beim Koordinatenreferenzsystem (SRS) ist darauf zu achten, dass eins ausgewählt wird, das der Dienst im getCapabilities auch unterstützt. Der hier beispielhaft aufgeführte WMS unterstützt z.B. nicht den EPSG:2398. Im kvwmap-WMS-Layer bleiben die Felder Query und Data leer. Im Feld Connection wird der statische Teil des GetMap-Requests eingetragen, also alle Parameter, die sich beim Dienst-Aufruf nicht ändern. Im Beispiel also:

http://www.umweltkarten.mv-regierung.de/script/lung_wms_wms.php? //
VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&SRS=EPSG:25833&LAYERS=t7_versalzung&FORMAT=image/png&STYLE=default

Der ConnectionType ist "MS_WMS" (7) und als Datentyp wird "MS_Layer_Raster" (3) gewählt. Alle anderen Einstellungen erfolgen wie bei einem normalen Rasterlayer. Queryable kann auf "ja" gestellt werden, wenn eine Sachdatenabfrage auf den Dienst sinnvoll erscheint und im getCapabilities zu sehen ist, dass der WMS auch überhaupt abfragbar ist ("<Layer queryable = '1' ... >"). In dem Fall muss im Feld Template "getfeatureinfo.php" als Anzeigetemplate eingetragen werden.


Wenn in der kvwmap-Legende der WMS-Layer mit Legende erscheinen soll, ist im Layer eine Klasse anzulegen. Die Klasse muss einen Namen bekommen - welcher spielt keine Rolle, weil er nicht angezeigt wird.


Wenn der WMS Transparenz unterstützt, zeichnet ihn kvwmap auch transparent. Es ist also in den stellenabhängigen Eigenschaften keine Transparenz anzugeben, lediglich die Drawingorder muss berücksichtigt werden. Ob der WMS-Layer transparent gezeichnet werden kann, kann man im GetCapabilities-Dokument erkennen ("<Layer opaque = '0' ... >").

Abfragelayer



Beschriftungslayer



Diagrammlayer



Shape-Layer

Üblicherweise werden Shapes im kvwmap-Umfeld nicht verwendet, da die Arbeit mit einer Datenbank enorme Vorteile bietet.

Shape-Layer werden je nachdem mit Datentyp MS_LAYER_POLYGON, MS_LAYER_LINE, MS_LAYER_POINT definiert. Der wesentliche Unterschied zum PostGIS-Vektorlayer ist, dass in der CONNECTION der Pfad zur *.shp-Datei angegeben wird und der CONNECTIONTYPE "MS_Shapefile" lautet.

Die Verwendung von Umlauten, Leerzeichen, Schrägstrichen oder sonstigen Sonderzeichen in Verzeichnissen und Dateinamen sollte vermieden werden.

Layer-Klassifizierung

automatische Klassifizierung

Es gibt die Möglichkeit, die Klassen an Hand der Daten des Layers automatisch generieren zu lassen. Durch Klick auf den Link "Klassen automatisch hinzufügen" öffnet sich ein Formular für die automatische Klassengenerierung. Es stehen mehrere Methoden zur Verfügung, wie die Klassen erstellt werden sollen:

  1. für jeden Wert eine Klasse: Hier wird für jeden vorkommenden Wert eine Klasse angelegt (zur Sicherheit maximal 50). Diese Methode eignet sich vor allem für Attribute mit wenigen unterschiedlichen Werten. Jede Klasse bekommt eine zufällige Farbe aus der Tabelle "colors".
  2. gleiche Klassengrösse: Diese Methode bildet den gesamten Wertebereich auf die definierte Anzahl an Klassen ab, wobei das von-bis-Intervall innerhalb jeder Klasse gleich groß ist. Es wird ein Farbverlauf erzeugt.
  3. gleiche Anzahl Klassenmitglieder: Diese Methode bildet den gesamten Wertebereich auf die definierte Anzahl an Klassen ab, wobei die Anzahl an Objekten innerhalb jeder Klasse gleich groß ist. Es wird ein Farbverlauf erzeugt.
  4. Jenks-Caspall-Algorithmus: Diese Methode bildet den gesamten Wertebereich auf die definierte Anzahl an Klassen ab, wobei versucht wird, die Unterschiede innerhalb einer Klasse zu minimieren und die Unterschiede zwischen den Klassen zu maximieren. Es wird ein Farbverlauf erzeugt.

Außerdem muss das Attribut angegeben werden, nach dem klassifiziert werden soll.

Bei den Klassifizierungsmethoden 2 - 4 muss außerdem die Anzahl an gewünschten Klassen und eine Farbe für den Farbverlauf angegeben werden. Der Farbverlauf geht von hell nach dunkel und die angegebene Farbe entspricht der Farbe der letzten Klasse. Sie sollte deshalb ausreichend dunkel gewählt werden.

Optional kann noch ein Klassifizierungsname angegeben werden, welcher in das Klassen-Feld "Klassifizierung" übernommen wird.

Expressions

Bei mehreren Klassen wird in der Spalte Expression der logische Ausdruck eingegeben, der die Klasse definiert. Soll ein Layer z.B. hinsichtlich einer "Objektart" klassifiziert dargestellt werden, werden mit "([Objektart] = 1000)" nur die Features angezeigt, deren Wert in deisem Attribut genau 1000 entspricht.

  • Beispiele Schreibweise für textliche Vergleiche:
('[textattribut]' = 'text')
('[textattribut]' eq 'text')
('[textattribut]' != 'text') 
  • Beispiele Schreibweise für numerische Vergleiche:
([numerisches attribut] = 1234)
([numerisches attribut] > 1234)
([numerisches attribut] > 1234 and [numerisches attribut] < 2345) 
  • Schreibweise für boolsche Vergleiche:
('[boolean attribut]' eq 't')
('[boolean attribut]' eq 'f')
Mehr Informationen zu den Möglichkeiten der EXPRESSION siehe mapserver.org.



Clusterbildung bei Punkt-Layern

Als Clusterbildung wird das Zusammenziehen von eigentlich separaten Punktobjekten zu einem Punktobjekt in der Karte verstanden, wenn sich - bedingt durch den Kartenmaßstab - die einzelnen Punktsymbole überlagern.

  • Die Angabe von Cluster:Maxdistance ist erforderlich,
  • Es muss eine weitere Klasse definiert werden, die für die Darstellung des Cluster-Objekts verwendet wird,
  • Die neue Klasse erhält die EXPRESSION "('[Cluster:FeatureCount]'!='1')", während die vorhandenen Klassen den Eintrag "('[Cluster:FeatureCount]'='1')" benötigen,
  • Soll das Cluster-Objekt eine Beschriftung in Form der Anzahl der zusammengezogenen Einzelobjekte erhalten, muss als LABELITEM "Cluster:FeatureCount" eingetragen werden,
  • Style und gegebenfalls Label der neuen Klasse müssen definiert werden.



Dokumente zum Layer



Layer zu einer Stelle hinzufügen

Der Layer kann direkt im Layereditor einer oder mehreren Stellen zugeordnet werden. Über den Stelleneditor (go=Stellen_Anzeigen) kann die Zuordnung von Layern zu einer Stelle ebenfalls erfolgen. Die Defaults aus der Layerdefinition (zur Zeichenreihenfolge, zum Maßstabsbereich usw.) werden in der Zuordnung verwendet und müssen gegebenenfalls stellenabhängig im Nachgang angepasst werden. Sind in der Layer-Rechteverwaltung (go=Layerattribut-Rechteverwaltung) bereits Default-Rechte für den Layer vergeben, so werden diese bei der Zuordnung eines Layers zu einer Stelle gesetzt.

Menüverwaltung

Die auf der linken Seite angezeigten Menüpunkte sind immer einer Stelle zugewiesen. Welche Menüpunkte zu welchen Stellen gehören, kann in der Stellenverwaltung eingestellt werden. Menüs sind in Ober- und Untermenüs aufteilbar. In der Stellenverwatlung können derzeit nur Obermenüpunkte der Stelle zugeordnet werden.

Neuen Menüpunkt anlegen

Wenn der Obermenüpunkt schon existiert, muss nur noch der Unterpunkt angelegt werden, ansonsten beide, jedoch erst der Obermenüpunkt. Für das Anlegen eines neuen Menüpunktes sind die nachfolgend beschriebenen Arbeiten auszuführen.

  • Eintragen des Menüpunktes in die Tabelle u_menues.
    • id ist eine fortlaufende Nummer
    • die Angabe in der Spalte name ist der Text, der als Menüpunkt in der GUI erscheint. Hier können auch deutsche Umlaute enkodiert werden, z.B. &auml für ä
    • links enthält die Angabe des Anwendungsfalles, der aufgerufen werden soll. Wenn es ein Obermenüpunkt sein soll, ist hier index.php?go=changemenue einzutragen.
    • onclick Der JavaScript-Code, der hier eingetragen ist, wird beim Klick auf den Menüpunkt ausgeführt. Soll der Link in links nicht ausgeführt werden, muss am Ende return false; stehen.
    • bei obermenue ist die ID des Obermenüpunktes anzugeben, in dem das Menü enthalten sein soll. Ist es selbst ein Obermenü, kommt hier eine 0 rein
    • In menueebene kommt eine 1, wenn es ein Obermenü ist sonst eine 2 für Untermenü
    • In target kann optional gewählt werden, ob die Seite hinter dem Menüpunkt in einem neuen Fenster aufgehen soll oder im aktuellen, in dem das Menü ist. _blank öffent den Menüpunkt in einem neuen Fenster. Das reservierte Wort confirm sorgt dafür, dass die Ausführung des Punkte noch einmal vorab bestätigt werden muss und ggf. abgebrochen werden kann.
  • Beispiel: Eintragen des Übermenüpunktes in u_menues
INSERT INTO `u_menues` ( `id` , `name` , `links` , `obermenue` , `menueebene` , `target` )
VALUES (NULL , 'Drucken', 'index.php?go=changemenue', '0', '1', NULL);

Fragen Sie anschließend die dabei erzeugte id in der Tabelle u_menues ab. z.B. 51

  • Beispiel: Eintragen des Untermenüpunktes zur Druckvorschau
INSERT INTO `u_menues` ( `id` , `name` , `links` , `obermenue` , `menueebene` , `target` )
VALUES (NULL , 'Druckvorschau', 'index.php?go=Druckausschnittswahl', '<id für Obermenü>', '2', NULL);

Zuordnen des Menüs zur Stelle

Die Zuordnung kann direkt in der Tabelle u_menue2stelle erfolgen. In diesem Fall müssen aber neben dem Obermenüpunkt auch alle Unterpunkte extra zugeordnet werden. Zusätzlich ist auch die Tabelle u_menue2rolle zu bestücken.

Besser ist es den Obermenüpunkt über die Stellenverwaltung der Stelle zuzuordnen.

Ändern der Zuordnung von Menüpunkten zu Obermenüs

Wenn ein Untermenü aus einem Obermenü entfernt werden soll, ist am besten zunächst in der Stellenverwaltung das ganze Menü zu entfernen.

Anschließend ändert man die Nummer in der Spalte obermenue in der Tabelle u_menues in die ID des neuen Obermenüpunktes. Wenn der noch nicht existiert, legt man diesen vorher an. Danach kann der Menüpunkt wieder hinzugefügt werden.

Stylen von Menüpunkten

Sollen die Menüpunkte anders als in der Standardeinstellung aussehen können die Klassen dieser überschrieben werden. Folgende Klassen sind in layouts/main.css.php definiert und können in eigenen Style-Dateien überschrieben werden:

  • hauptmenue: Hauptmenüpunkte, das sind solche, die keine Unterpunkte haben.
  • obermenue: Obermenüpunkte, das sind solche, die Unterpunkte haben.
  • untermenues: Div in dem die Untermenüpunkte enthalten sind.
  • untermenue: Untermenüpunkte.
  • ausgewaehltes-menue: Menüpunkt, bei dem die Parameter aus dem Attribut links mit denen in der URL oder Formularen übergebenen Parametern übereinstimmen. (sieht standardmäßig so aus als wäre nichts ausgewählt)

Druckrahmenverwaltung

Der Nutzer hat die Möglichkeit einen Kartenausschnitt in ein PDF zu exportieren. Das Layout des PDF-Dokuments kann mit Hilfe von verschiedenen, voher definierten Druckrahmen festgelegt werden. Im folgenden wird beschrieben, wie die Erstellung eines solchen Druckrahmens erfolgt.

Die Erstellung eines Druckrahmens erfolgt in der Druckrahmenverwaltung. Um diese aufrufen zu können, muss es einen entsprechenden Menüpunkt mit der go-Variable 'Druckrahmen' geben (Tabelle: u_menues). Außderdem muss dieser Menüpunkt der Stelle (Tabelle: u_menue2stelle) und dem Nutzer dieser Stelle (Tabelle: u_menue2rolle) zugeordnet werden. In der Druckrahmenverwaltung werden unter 'Druckrahmenauswahl' alle in der MySQL-Tabelle 'Druckrahmen' gespeicherten Rahmen in einer Auswahlliste angezeigt (1). Wählt man einen der Druckrahmen aus, werden die Parameter des Rahmens unter 'Druckrahmendaten' in einem Formular angezeigt. Ist noch kein Datensatz in der Tabelle 'Druckrahmen' vorhanden, sind sowohl die Auswahlliste als auch die Formularfelder leer.

--Markus Hentschel 12:55, 24. Apr 2007 (CEST) Damit sowohl in der Druckrahmenverwaltung als auch in der späteren Druckvorschau die textlichen Elemente angezeigt werden, müssen ImageMagick und Ghostscript auf dem Server installiert sein. Ist das der Fall, ist in der config.php der Parameter IMAGEMAGICK = 'true' zu setzen. Ghostscript ist zumindest bei SuSE schon installiert. Die Installation von ImageMagick mit JPEG-, PNG- und TIF-Unterstützung wird bei den HowTos erklärt.

Ein Druckrahmen besteht aus mehreren Elementen und hat mehrere Parameter. Als erstes sollte man festlegen, welches Format der Druckrahmen haben soll. Das Formularfeld 'Format' bietet hier 4 verschiedene Auswahlmöglichkeiten (2). Nachdem das Format festgelegt wurde, kann man einen Druckkopf für das Dokument definieren. Der Druckkopf dient in erster Linie als Kopf für das PDF-Dokument, kann aber auch als Hintergrund für das gesamte Dokument benutzt werden. Im Druckkopf sollten alle Informationen enthalten sein, die statisch, d.h. bei jedem PDF-Export konstant sind. Um einen Druckkopf in den Druckrahmen einzubinden, wählt man unter 'Druckkopf: wählen:' eine entsprechende Bilddatei aus (3). Wichtig ist, das diese Datei im Format 'jpg' vorliegt. --HolgerR 13:17, 22. Aug 2006 (CEST) Damit der Druckrahmen auf dem Server abgespeichert werden kann, muss der in der config.php festgelegte 'DRUCKRAHMEN_PATH' physisch auf dem Server vorhanden sein. Um die Datei hochzuladen und ihre Abmessungen einzulesen, sollte man den Druckrahmen an dieser Stelle schon einmal speichern. Zuvor sollte man jedoch noch einen Namen vergeben, damit der Druckrahmen identifiziert werden kann. Dies erfolgt über das Formularfeld 'Name' (4). Jetzt klickt man auf 'Als neuen Rahmen speichern' (5) und der Datensatz wird in die Tabelle 'Druckrahmen' geschrieben. Der Druckrahmen sollte sich nun auch in der Auswahlliste der Druckrahmen befinden.

Die Position und Größe des Druckkopfes kann nun über die entsprechenden Formularfelder x,y (6) und Breite, Höhe (7) festgelegt werden. Die Felder x und y bestimmen dabei den Abstand des Druckkopfes vom linken bzw. oberen Rand des PDF-Dokuments. Die Maßeinheit ist bei allen Positions- und Größenangaben 1 Pixel im PDF. Neben dem Formularfeld 'Format' ist die Auflösung des PDF-Dokuments in Pixeln angegeben (8). Nachdem die Position und Größe des Druckkopfes definiert wurde, klickt man auf 'Änderungen speichern' (9). In der Vorschau (10) sollte nun der Druckrahmen zu sehen sein. Sollte die Position bzw. Skalierung des Druckkopfes noch nicht zufriedenstellend sein, kann diese verändert werden und nach erfolgter Speicherung in der Vorschau überprüft werden.

Als nächsten Schritt sollte man die Position und Größe der Karte festlegen. Dies geschieht analog zum Druckkopf mit den Formularfeldern x und y (11) und Breite und Höhe (12). Nach Speicherung der Änderungen ist die Position der Karte in der Druckrahmenvorschau zu sehen und kann bei Bedarf korrigiert werden. Mit der Karte und dem Dokumentenkopf sind die beiden Hauptelemente des Druckrahmens, die zur korrekten Funktion benötigt werden, definiert worden.

Druckrahmena beschriftet.jpg Druckrahmenb beschriftet.jpg

Neben der Karte und dem Druckkopf lassen sich weitere Elemente zum Druckrahmen hinzufügen. Dazu gehören u.a. ein Freitext (13), der Maßstab (14), das aktuelle Datum (15), die Gemarkung (16), die Flur (17) sowie die Angabe eines ursprünglichen Maßstabes der analogen Flurkarte (18) (hier ist die Datenquelle jedoch noch nicht integriert). Außer dem Freitext sind alle diese Elemente dynamisch, d.h. sie werden vom System automatisch gesetzt. Im Druckrahmenformular lässt sich die Position und die Schriftgröße jedes Elementes definieren. Werden die Änderungen am Druckrahmen gespeichert, so erscheinen auch diese Elemente in der Vorschau und können bei Bedarf angepasst werden.

Zusätzlich zu der normalen Karte lässt sich bei Bedarf auch eine Referenzkarte zum Druckrahmen hinzufügen. Um dies tun zu können, sind mehrere Vorraussetzungen nötig. Zum einen muss ein Rahmen bzw. Hintergrund für die Referenzkarte festgelegt werden. Dieser Hintergrund liegt über der normalen Karte und unter der Referenzkarte. Dazu lässt sich analog zum Druckkopf über 'Ref.hintergrund: wählen:' (19) eine entsprechende jpg-Datei auswählen und durch Klick auf 'Änderungen speichern' hochladen. Die Position und Größe dieses Referenzkartenhintergrunds lässt sich dann über die entsprechenden Felder anpassen (20). Nach der Festlegung des Referenzkartenhintergrunds kann man die Position und Skalierung der Referenzkarte definieren (21). Für die Referenzkarte muss man außerdem noch den Zoomfaktor einstellen, der festlegt, umwieviel diese Karte den Ausschnitt der normalen Karte vergrößert. Ein Zoomfaktor von -2 bewirkt hier beispielsweise, dass die Referenzkarte einen 2mal so großen Kartenausschnitt zeigt. Um festlegen zu können, welche Layer die Referenzkarte zeigen soll, wird für die Darstellung dieser Karte eine separates Mapfile verwendet. Der Pfad zu diesem Mapfile wird in der config.php über die Konstante 'REFMAPFILE' festgelegt. So ist es z.B. möglich, mittels der Referenzkarte eine Flurübersicht zu erzeugen, wie sie in ALK-Auszügen verwendet wird.

Es ist auch möglich amtliche Kartenauszüge über die Call-Schnittstelle der DHK zu erzeugen. Wenn in der config.php die 3 Verbindungsparameter DHK_CALL_URL, DHK_CALL_USER und DHK_CALL_PASSWORD gesetzt sind, erscheint im Kartendrucklayouteditor ein Auswahlfeld "DHK-Call-Schnittstelle". Hier kann die Art des amtlichen Kartenauszugs festgelegt werden. Außerdem müssen die korrekte Kartenhöhe und -breite und das Format gesetzt sein.

Um einen Kartenausschnitt unter Benutzung eines zuvor definierten Druckrahmens in ein PDF zu exportieren, muss es einen entsprechenden Menüpunkt mit der go-Variablen 'Druckausschnittswahl' geben (Tabelle: u_menues). Außderdem muss dieser Menüpunkt der Stelle (Tabelle: u_menue2stelle) und dem Nutzer dieser Stelle (Tabelle: u_menue2rolle) zugeordnet werden.

Wie mit Hilfe der in der Stelle zugeordneten Druckrahmen gedruckt werden kann ist unter dem Punkt Benutzung von kvwmap beschrieben, siehe (Drucken in PDF).

Datenbankadministration

Datensicherung MySQL

Die Datenbank kann auf zwei verschiede Art und Weise gesichert werden.

  • Kopieren des gesamten Verzeichnisses einer Datenbank, Datenbank muss dazu gestoppt sein, oder es ist sicher, dass keiner mehr zugreift.
  • Erzeugen und Sichern eines Datenbankdumps, geht aus dem laufendem Betrieb heraus.

Zu einer Datenbank gehört immer das gleichnamige Verzeichnis unter dem Datenverzeichnis von mysql. Das ist meißtens unter /var/lib/mysql kann aber auch unter /usr/local/mysql/var o.ä. sein. Das Verzeichnis der Datenbank einfach einpacken und später dahin wieder auspacken zur Wiederherstellung.

Beispiel für die Sicherung eines Datenbankverzeichnisses.
$cd /usr/local/mysql/var
$tar cvfz kvwmapdb160-2006-09-09.tar.gz kvwmapdb160
$tar xvfz kvwmapdb160-2006-09-09.tar.gz -C /usr/local/mysql/var

Für die andere Variante führt man zunächst einen Dump von der laufenden Datenbank aus über die Dumpfunktion von phpMyAdmin oder das Programm mysqldump unter /usr/local/bin Es ist vorteilhaft den Pfad /usr/local/bin in die PATH Variable zu schreiben:

$export PATH=$PATH:/usr/local/bin

Optionen und Nutzung von mysqldump werden ausgegeben mit

$./mysqldump --help

Eine einzelne DB wird z.B. gesichert mit:

$./mysqldump -u root -p kvwmapdb160 > kvwmapdb160-dump_2006-09-09.sql

Zum wiederherstellen der Datenbank muss eine neue Datenbank angelegt werden.

$./mysql -u root -p 
mysql$ create database kvwmapdb160;
mysql$ exit

Einlesen des Dump mit:

$./mysql -u root -p kvwmapdb160 < kvwmapdb160-dump_2006-09-09.sql

Datensicherung PostgreSQL/PostGIS

Die Datenbank kann auf zwei verschiede Art und Weise gesichert werden.

  • Kopieren des gesamten Verzeichnisses einer Datenbank, Datenbank muss dazu gestoppt sein. Das wiedereinsetzen der Dateien funktioniert normalerweise nur, wenn die neue Datenbank von der selben Version ist wie die ursprüngliche.
  • Erzeugen und Sichern eines Datenbankdumps, geht aus dem laufendem Betrieb heraus.

Die Datenbank liegt bei Suse-Servern üblicherweise in /usr/local/pgsql/data, bei Nutzung des FGS-Pakets findet man sie in $FGS_HOME/apps/pgsql/data.


Die Sicherung der Datenbank im laufenden Betrieb funktioniert über pg_dump und pg_restore und kann cron-gesteuert erfolgen. pg_dump und pg_restore finden sich im bin-Verzeichnis von pgsql bzw. bei Nutzung des FGS-Pakets in $FGS_HOME/bin.

Bei einer Neuinstallation der Datenbank muss PostgreSQL mit initdb initialisiert werden. Alle Konfigurationsdateien, in denen manuelle Änderungen vorgenommen wurden, müssen wiederhergestellt sein.


Die Datensicherung erfolgt zweckmäßigerweise zweigleisig, indem zum einen das Schema, zum anderen die Daten jeweils extra gesichert werden:

# Schemasicherung
./pg_dump -U kvwmap -f /var/.si/dumps/pg_kvwmapsp_daily_schema.sql -s -F c kvwmapsp
# Datensicherung
./pg_dump -U kvwmap -f /var/.si/dumps/pg_kvwmapsp_daily_data.sql -a -F c kvwmapsp

Für das Wiederherstellen der Datenbank wird zunächst über den SQL-Befehl CREATE DATABASE oder dem Hilfsprogramm createdb eine neue, leere Datenbank angelegt. Dann wird das Datenbankschema angelegt:

./pg_restore -U kvwmap -d kvwmapsp_neu /var/.si/dumps/pg_kvwmapsp_daily_schema.sql

Möglicherweise kann das Schema nicht angelegt werden, weil Abhängigkeiten der Tabellen untereinander bestehen, die verlangen, dass diese Tabellen in einer bestimmten Reihenfolge angelegt werden. Dann wird aus der Schema-SQL-Datei zunächst eine Listendatei erstellt (siehe PostgreSQL-Handbuch):

pg_restore -l /var/.si/dumps/pg_kvwmapsp_daily_schema.sql > /home/fgs/sicherung/liste.txt

Anschließend können die Zeilen in der ausgegebenen Datei umsortiert oder mit Semikolon auskommentiert werden. Die Wiederherstellung berücksichtigt dann die Reihenfolge in dieser Liste:

$ pg_restore -U kvwmap -d kvwmapsp_neu  -L /home/fgs/sicherung/liste.txt /var/.si/dumps/pg_kvwmapsp_daily_schema.sql

Manchmal kommen so viele Fehlermeldungen, dass man die ersten auf der Konsole nicht lesen kann. Fehlermeldungen können mit 2> in eine Datei, z.B. pg_restore.err umgeleitet werden. Wenn Fehler und Ausgaben von pg_restore umgeleitet werden sollen, lautet der Befehl:

$ pg_restore -U kvwmap -d kvwmapsp_neu  -L /home/fgs/sicherung/liste.txt /var/.si/dumps/pg_kvwmapsp_daily_schema.sql > pg_restore.log 2> pg_restore.err

Die Verwendung der Liste ist nützlich zur Wiederherstellung einer Datenbank mit einer alten PostGIS Version in eine Datenbank mit einer neueren PostGIS Version, getestet für den Übergang von 1.3 auf 1.5. Beim Anlegen des Schemas meckert der restore rum, dass die Datei liblwgeom nicht gefunden wird. Das liegt daran, dass in Version 1.5 die Bibliothek postgis.so heißt. Einen symbolischen Link liblwgeom.so auf postgis.so bring auch nichts, weil in postgis.so zum Teil Funktionen nicht drin sind, die in liblwgeom.so von Version 1.3 noch verwendet wurden. Hier hilft z.B. Folgendes:

An Stelle der leeren Datenbank legt man eine Datenbank mit dem neuen postgis_template an, welches schon das neue PostGIS enthält. Dann löscht man alle PostGIS relevanten Einträge in liste.txt, die stehen meistens schon am Anfang hinter plpgsql und enden da, wo die selbst angelegten Tabellen beginnen. Die Sprachunterstützung plpgsql muss man übrigens auch rausnehmen, da diese auch schon im postgis_template enthalten ist. Um die Einträge in spatial_ref_sys wieder herstellen zu können, löscht man vorher den Inhalt der Tabelle spatial_ref_sys, sonst hat man da doppelte Einträge drin.

Wenn das Datenbankschema erfolgreich angelegt wurde, können die Daten eingespielt werden:

./pg_restore -U kvwmap -d kvwmapsp_neu /var/.si/dumps/pg_kvwmapsp_daily_data.sql

Oder auch unter Berücksichtigung der Listendatei, d.h. nur Wiederherstellung bestimmter Tabellen:

./pg_restore -U kvwmap -d kvwmapsp_neu -L /home/fgs/sicherung/liste.txt /var/.si/dumps/pg_kvwmapsp_daily_data.sql



Referenz zur MySQL-Datenbank von kvwmap

Dieser Abschnitt enthält eine Beschreibung der Feldinhalte zu Nutzerdaten und Layern, die in der MySQL-Datenbank von kvwmap gespeichert werden.

Die Referenz entspricht der kvwmap-Version 2.4

Ein Tabellen-Beziehungsmodell (ER-Diagramm) ist als PDF-Datei verfügbar.

Eine ausführliche deutschsprachige Beschreibung aller MapFile-Parameter, die in der Datenbank abgebildet werden, findet sich unter http://mapserver.org/de/mapfile/. Das englische Original ist zu finden unter http://mapserver.org/mapfile/index.html#mapfile.


Alle nummerierten Parameter entsprechen den MapScript-Definitionen. Diese Definitionen können in der map.h der mapServer-Source im Abschnitt "General enumerated types" nachgesehen werden.


Tabelle "classes"

Jede Class wird genau einem Layer zugeordnet. Mit der Class können Daten, die in einem Shape liegen, nach bestimmten Kriterien selektiert und in unterschiedlichen Ausgestaltungen präsentiert werden.

Name

Der Name der Class wird in der Legende angezeigt.

Layer_ID

Die entsprechende ID aus der Tabelle "layer".

Expression

Wenn der Layer mehrere Classes enthält, regelt "Expression" die Zugehörigkeit eines Features zur jeweiligen Class. Wenn kein Ausdruck vorhanden ist, werden alle Features einer Class zugeordnet.

Kvwmap lässt momentan nur logical Expressions zu. Dabei muss das Attribut (Spaltenüberschrift in der DBF-Tabelle des Shapes) explizit angegeben werden. Die Notation erfolgt so:

  • Die komplette Expression wird grundsätzlich mit einer runden Klammer ( ) versehen.
  • Das Attribut wird in eckige Klammern [ ] gesetzt. Handelt es sich um das Attribut eines Shapes, ist darauf zu achten, dass es in Großbuchstaben geschrieben wird. Handelt es sich um das Attribut einer PostGIS-Tabelle, ist darauf zu achten, dass es in Kleinbuchstaben geschrieben wird.
  • Wird eine Zeichenkette abgefragt, wird sowohl die eckige Klammer des Attributs als auch der Ausdruck in einfache Anführungszeichen ' ' gesetzt.
  • Folgende logische Operatoren werden unterstützt: =, >, <, <=, >=, =, lt (lower than), gt (greater than), ge (greater equal), le (lower equal), eq (equal), ne (not equal).
  • logische Ausdrücke können mit "AND" bzw. "OR" beliebig verschachtelt werden.

Beispiel:

([EINWOHNERZAHL] >= 20000 AND '[ART]' ne 'Stadt')

drawingorder

Darstellungsreihenfolge der Classes in der Legende. Wenn nichts angegegeben wird, werden die Classes alphanumerisch sortiert.

text

Möchte man einen feststehenden Text für alle Objekte der class erzeugen, gibt man diesen Text in Hochkommata an.

Tabelle "colors"

speichert Farben im RGB-Schema, die für die (normale und klassifizierte) Suchergebnisanzeige verwendet werden. Farbverläufe kann man z.B. hier erstellen: [1] oder [2]

Tabelle "datendrucklayouts"

speichert layerbezogen die Sachdaten-Drucklayouts.

Tabelle "ddl2freitexte"

speichert die Freitexte eines Sachdaten-Drucklayouts.

Tabelle "ddl2stelle"

weist das Sachdaten-Drucklayout einer Stelle zu.

Tabelle "ddl_elemente"

Speichert die Elemente des Sachdaten-Drucklayouts, d.h. die zu druckenden Attribute des Layers mit ihrer layoutspezifischen Gestaltung.

Tabelle "druckausschnitte"

speichert Kartenausschnitt, Druckmaßstab und verwendeten Druckrahmen, die ein User beim Drucken für spätere Wiederverwendung speichern kann. Wird von kvwmap automatisch gefüllt.

Tabelle "druckfreibilder"

speichert die Grafiken, die in der Druckrahmenverwaltung einem Druckrahmen zugeordnet werden. Wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "druckfreitexte"

speichert die Freitexte, die in der Druckrahmenverwaltung einem Druckrahmen zugeordnet werden. Wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "druckrahmen"

speichert die Parameter der einzelnen Druckrahmen. Diese Tabelle wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "druckrahmen2freibilder"

ordnet die Grafiken aus der Tabelle druckfreibilder den Druckrahmen zu und enthält die Position der Bilder im Druckrahmen sowie die Größe und den Drehwinkel die für die Darstellung der Bilder im Druckrahmen verwendet werden sollen. Muss zur Zeit noch per Hand eingetragen werden. Wenn die Bilder größer sind, als die Größenangaben in dieser Tabelle, wird das Bild gestaucht und erhält damit eine höhere Auflösung.

Tabelle "druckrahmen2freitexte"

ordnet die Texte ausder Tabelle druckfreitexte den Druckrahmen zu. Wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "druckrahmen2stelle"

ordnet die Druckrahmen den Stellen zu. Wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "labels"

MapFile-Doku MapScript-Doku

Sämtliche Parameter dieser Tabelle werden in der MapServer Referenz unter den o.a. Internetadressen ausführlich beschrieben. Hier sollen nur die "Schalter" benannt werden:

font

Gibt die Schriftart an. Der font muss im Ordner "fonts" enthalten und in der fonts.txt eingetragen sein!

type

  • "0" = Truetype
  • "1" = Bitmap

Standardmäßig wird "0" verwendet.

color

Farbe der Beschriftung. Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50").

outlinecolor

Angabe einer Farbe, um Beschriftungen zu umranden. Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50").

shadowcolor

Erzeugt eine Kopie der Beschriftung in der angegebenen Farbe. Diese wird jedoch nur sichtbar in Kombination mit shadowsizex und shadowsizey, da sie sonst von der Beschriftung verdeckt wird.
Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50").

shadowsizex, shadowsizey

Verschiebt die mit shadowcolor erzeugte Kopie der Beschriftung in x- bzw. y-Richtung und erzeugt dadurch eine Art Schlagschatten.

backgroundcolor

Erzeugt ein Rechteck mit der angegebenen Farbe um den Text herum. Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50").

backgroundshadowcolor

Erzeugt eine in alle Richtungen um 1 Pixel vergrößerte Kopie des Rechtecks, das unter backgroundcolor erzeugt wurde und legt es optisch hinter das Original. Ohne durch die Verschiebung mit Hilfe von backgroundshadowsizex und backgroundshadowsizey lässt sich somit ein 1 Pixel breiter Rahmen in der angegebenen Farbe erzeugen.
Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50").

backgroundshadowsizex, backgroundshadowsizey

Verschiebt die mit backgroundshadowcolor erzeugte Kopie des Rechtecks in x- bzw. y-Richtung und erzeugt dadurch eine Art Schlagschatten.

size

Angabe der Schriftgröße. Bei skalierbarer Beschriftung bestimmt size die Schriftgröße für den unter symbolscale angegebenen Massstab.

Hinweis: Damit die Darstellung skalierbar wird, müssen in der Tabelle used_layer ein Wert für symbolscale und in der Tabelle 
layer die Werte für labelminscale und labelmaxscale gesetzt sein.

minsize, maxsize

Angabe der minimalsten bzw. maximalsten Größe der Texte des Layers bei skalierbarer Darstellung.
minsize bestimmt dabei die Größe für den unter labelmaxscale angegebenen Massstab und maxsize die für den unter labelminscale angegebenen Massstab.

Hinweis: Damit die Darstellung skalierbar wird, müssen in der Tabelle used_layer ein Wert für symbolscale und in der Tabelle 
layer die Werte für labelminscale und labelmaxscale gesetzt sein.

position

  • "0" = Die Beschriftung befindet sich links über dem Bezugspunkt
  • "1" = Die Beschriftung befindet sich rechts unter dem Bezugspunkt
  • "2" = Die Beschriftung befindet sich rechts über dem Bezugspunkt
  • "3" = Die Beschriftung befindet sich links unter dem Bezugspunkt
  • "4" = Die Beschriftung befindet sich rechts vom Bezugspunkt
  • "5" = Die Beschriftung befindet sich links vom Bezugspunkt
  • "6" = Die Beschriftung befindet sich über dem Bezugspunkt
  • "7" = Die Beschriftung befindet sich unter dem Bezugspunkt
  • "8" = Die Beschriftung befindet sich genau auf dem Bezugspunkt
  • "9" = "Auto", kalkuliert eine Beschriftungsposition, die keine andere Beschriftung beeinträchtigen wird.

offsetx, offsety

Versetzt den Text aller Objekte des Layers in X- bzw. Y-Richtung um den angegebenen Betrag (negative Werte sind auch möglich).

angle, autoangle

"angle" speichert einen festen Winkel, unter dem alle Texte des Layers gedreht werden. "autoangle = 1" dreht jeden einzelnen Text nach dem Winkel, der zum entsprechenden Objekt in dem Attribut gespeichert ist, das in der Tabelle layer unter "labelangleitem" gespeichert ist. Default ist 0.

buffer

Erzwingt einen Leerraum um alle Texte dieses Layers in Pixeln. Default ist 0.

antialias

Kantenglättung. Funktioniert nur bei "Truetype".

  • "0" = ja
  • "1" = nein

minfeaturesize, maxfeaturesize

Wird in Pixeln eingegeben. Wenn die Größe eines Objektes (in Pixeln) unter der eingetragenen Grenze liegt, wird der Text des Objekts nicht mehr gezeichnet. Der Eintrag "auto" bewirkt die Beschriftung ausschließlich der Objekte, die größer sind als der zugehörige Text.

partials

Zeigt Texte, die vom Kartenrand abgeschnitten werden.

  • "0" = ja: auch Teile des Textes sollen noch angezeigt werden.
  • "1" = nein: wenn der Text angeschnitten wird, ist er nicht mehr zu sehen.

Wird nichts angegeben, wird standardmäßig "0" gesetzt.

Wenn the_force und partials jeweils den Wert 1 haben, hat the_force Vorrang und über den Kartenrand herausragende Texte werden angezeigt.

wrap

Ermöglicht es, Zeilenumbrüche in Texte einzufügen. Als "wrap" ist der Dezimalwert des entsprechenden ASCII-Zeichens (= "ANSI Character") einzugeben, der dann durch einen Zeilenumbruch ersetzt wird, z.B. "35" für das Zeichen "#".

the_force

Zwingt Beschriftungen zur Anzeige, ohne Rücksicht auf Kollisionen.

  • "0" = nein
  • "1" = ja

Wird nichts angegeben, wird standardmäßig "0" gesetzt.

Wenn the_force und partials jeweils den Wert 1 haben, hat the_force Vorrang und über den Kartenrand herausragende Texte werden angezeigt.

Tabelle "layer"

Jeder Layer beinhaltet einen thematisch logischen und abgegrenzten Teilaspekt der Gesamtdatenmenge. Dabei wird in Raster-, Punkt-, Linien- und Flächenlayer unterschieden. Layer (soweit nicht Rasterlayer) können in kvwmap als Shapes vorliegen, aus einer PostgreSQL/PostGIS-Datenbank stammen oder als WMS bezogen werden.

Name

Der Name des Layers wird in der Legende angezeigt. Wird kein Name vergeben, wird dieser Layer nicht in der Legende angezeigt. Layernamen sollten keine Sonderzeichen enthalten, Umlaute und Leerzeichen sind dagegen kein Problem.

Datentyp

  • "0" = Punktlayer ("Point")
  • "1" = Linienlayer ("Line")
  • "2" = Flächenlayer ("Polygon")
  • "3" = Rasterlayer ("Raster")
  • "4" = Beschriftungslayer ("Annotation", erzeugt nur Beschriftungen)
  • "5" = Abfragelayer ("Query", wird nicht gezeichnet, kann nur abgefragt werden)
  • "6" = Kreislayer ("Circle", erzeugt Ellipsen durch die Angabe eines Rechtecks)

Ausführlichere Angaben, z.B. zum Ort der Beschriftung, siehe die deutschsprachige Mapfile-Referenz.

Der Datentyp muss nicht derselbe Typ sein wie das Feature selbst. Eine Polygon Feauture kann beispielsweise auch als Punkt-, Linien- oder Abfragelayer generiert werden.

Gruppe

Layer werden einer Gruppe zugeordnet. In der Legende erscheinen sie dann unter dieser Gruppenbezeichnung.

Query

Dieses Feld enthält vordefinierte SQL-Statements für die Sachdatenabfrage von PostGIS-Layern. Der einfachste Fall ist die Abfrage auf eine Tabelle ohne Bedingungen:

SELECT * FROM ax_gebaeude WHERE 1=1

Wichtig: Die WHERE-Bedingung muss immer mit angegeben werden. Gibt es keine Bedingung, wird "WHERE 1=1" angehängt.

Die Auswahl und die Reihenfolge der Attribute in der Abfrage bestimmt die Anzeige und Reihenfolge der Attribute in der Sachdatenanzeige. Deswegen sollten die Attribute immer explizit genannt werden:

SELECT gml_id, gebaeudefunktion, name, wkb_geometry FROM ax_gebaeude WHERE endet IS NULL

Wichtig: Soll der Nutzer von der Sachdatenanzeige zum Objekt in der Karte zoomen können, muss das Geometrie-Attribut in der Query angegeben werden.

Die Abfragen können beliebigen Umfang annehmen, also z.B. auch mehrere Tabellen verknüpfen oder die Sachdatenanzeige sogar aus einer anderen Tabelle erzeugen als der Tabelle, die für die Kartendarstellung in Data verwendet wird.

SELECT g.gml_id, array_to_string(array(select gm.bezeichnung||', '||l.bezeichnung||' '||h.hausnummer from 
alkis.ax_lagebezeichnungmithausnummer h, alkis.ax_gemeinde gm, alkis.ax_lagebezeichnungkatalogeintrag l where 
h.gemeinde = gm.gemeinde and gm.endet is not null and h.gemeinde = l.gemeinde and h.lage = l.lage and l.endet 
is not null and h.gml_id=any(g.zeigtauf)),' ') as lagemithausnummer, f.bezeichner as gebaeudefunktion, 
g.name, g.wkb_geometry 
FROM ax_gebaeude g, ax_gebaeude_funktion f
WHERE endet IS NULL AND f.wert = g.gebaeudefunktion

Wichtig: Im Gegensatz zum Data-Eintrag wird in der Query der Schema-Name nicht angegeben (das passiert in schema). Nur in Subqueries oder wenn Tabellen aus anderen Schemata herangezogen werden, muss der Schema-Name dieser Tabellen mit angegeben werden.


Schwierigkeiten bereiten möglicherweise komplexe SQL-Befehle, z.B. wenn oids uneindeutig werden. In diesen Fällen bietet sich an, die eigentliche Abfrage in einen View zu schreiben und in Query (vielleicht auch in Data) auf diesen View zuzugreifen. Möglicherweise ist es beim View dann allerdings nötig, Rules zu schreiben, die die INSERT-, UPDATE- und DELETE-Anweisungen durchführen.

Die Sachdatenanzeige erfolgt über den Generischen Layereditor. Bei besonderen Darstellungen kann alternativ auch ein Template" angelegt werden, dessen Dateiname im Feld "template" der Tabelle used_layer eingetragen wird.

Data

  • Bei Anbindung eines Shapes der Name des Shapes ohne Endung.
  • Bei Daten aus einer PostGIS-Tabelle wird die Geometriespalte und der Tabellenname angegeben, Beispiel:
the_geom from bplan as foo using unique oid using srid=25833

Genau wie bei Query können auch bei Data komplexe Abfragen in Form eines SELECT definiert werden. Dieses SELECT wird in eine Klammer gesetzt und muss alle für den Mapserver notwendigen Elemente aufführen: Das unique-Attribut (üblicherweise oid), eventuelle Beschriftungs- und Klassifizierungsattribute und natürlich das Geometrie-Attribut. Befinden sich die abgefragten Tabelle in einem anderen Schema als public, muss der Schema-Name mit angegeben werden.

Das eingeschlossene SQL-Statement kann auch in einem View gespeichert werden.

schema

Speichert den Schemanamen in der Postgre-DB, in der die Tabelle liegt. Default ist "public".

documentpath

speichert die Angabe eines Pfades für einen Ordner, in dem layerbezogen die Dokumente abgelegt werden sollen. Wird hier nichts angegeben, ist CUSTOM_IMAGE_PATH aus der config.php der default.

tileindex

Wird nur bei Rasterlayern gesetzt. Wenn Rasterbilder gekachelt vorliegen und in einem Bildkatalog indiziert wurden, wird der Name des Index-Shapes hier angegeben. Die Eingabe im Feld "Data" entfällt. Hinweis: Die Indizierung kann z.B. mit dem Werkzeug gdaltindex aus der GDAL-Installation erfolgen.

tileitem

Wird nur bei indizierten Rasterlayern gesetzt. Attributname (= Spaltenüberschrift im Index­shape), in dem die Pfade zu den einzelnen Bildern stehen.

labelangleitem

Enthält den Attributnamen der Sachdaten des Layers, der die Winkel der Texte enthält. Braucht nur ausgefüllt werden, wenn beschriftet werden soll und der Text nach bestimmten Werten in den Sachdaten ausgerichtet werden soll.

labelitem

Wird nur gesetzt, wenn eine Beschriftung erzeugt werden soll. Attributname (= Spaltenüberschrift im entsprechenden Shape), aus dem die Beschriftung entnommen werden soll.

labelmaxscale

Größte Maßstabszahl, über die hinaus der Layer nicht mehr beschriftet wird (z.B. 400.000)

labelminscale

Kleinste Maßstabszahl, unterhalb der der Layer nicht mehr beschriftet wird (z.B. 500)

labelrequires

macht die Beschriftung abhängig von der Darstellung der Beschriftung eines anderen Layers, siehe Feld "requires" in der Tabelle used_layer.

connection

Die Angabe der connection entfällt bei Shapefiles. Die connection ist im Falle einer Datenbank die Zeichenkette der Datenbankverbindung, bestehend aus Benutzername, Passwort, Datenbankname, Hostnamen, Name des Vorgangs. Beispiel:

user=kvwmap password=****** dbname=kvwmapsp159 host=localhost port=5432

Achtung, bei der Verwendung von kvwmap in einem Docker Container, der auf dem Image kvwmap-server basiert, muss bei host nicht localhost, sondern pgsql angegeben werden. pgsql wird in diesem Fall in der Datei /etc/hosts aufgelößt in die IP des Containers in dem die Postgre-Datenbank läuft.

In der connection kann auch ein Dienst angegeben werden. Vom OGC-konformen Aufruf wird der "feste" Teil eingegeben, die änderbaren Parameter SRS, WIDTH, HEIGHT, BBOX und FORMAT werden von kvwmap bei jedem Aufruf an die in connection angegebene URL angehängt. Beispiel für eine WMS-Angabe:

http://geoportal.lk-nvp.de:8080/cgi-bin/mapserv?MAP=/home/fgs/fgs/www/wms/gemarkungen_fluren.map&REQUEST=getMap&VERSION=1.1.1&LAYERS=Gemarkungen,Fluren,Gemarkungsnamen,Flurnummern

Und so sieht der Aufruf beispielsweise vollständig aus:

 http://geoportal.lk-nvp.de:8080/cgi-bin/mapserv? \\
 MAP=/home/fgs/fgs/www/wms/gemarkungen_fluren.map& \\
 REQUEST=getMap& \\
 VERSION=1.1.1& \\
 LAYERS=Gemarkungen,Fluren,Gemarkungsnamen,Flurnummern& \\
 SRS=EPSG:2398& \\
 WIDTH=600&HEIGHT=500& \\
 BBOX=4550000,6010000,4560000,6018000& \\
 FORMAT=image/png
 
(Zur Übersichtlichkeit ist der Aufruf in mehrere Zeilen aufgetrennt.)

printconnection

Erlaubt die Angabe eines WMS, der im Druck für diesen Layer verwendet wird.

connectiontype

Der connectiontype ist die Einstellung des Verbindungstyps, z.B.:

  • "6" = postgis
  • "7" = WMS
  • "9" = WFS

Die Angabe des connectiontypes kann bei Shapefiles entfallen.

classitem

Attributname (= Spaltenüberschrift im entsprechenden Shape), aus dem die Class erzeugt werden soll.

filteritem

Angabe zum Einsatz der "Filter"-Ausdrücke aus der Tabelle "used_layer". Im Regelfall wird kein Filter definiert, dann sollte das Feld mit "id" gefüllt sein. Wird der Layer aus einer Sicht erzeugt, muss ein in der Sicht verwendeter Attributname (z.B. "objnr") eingetragen werden.

tolerance

Die Empfindlichkeit von punktbasierten Abfragen. Wie weit darf man den Punkt verfehlen, damit er dennoch gefangen wird? Gilt in kvwmap bei der Abfrage von PostGIS-Layern auch beim Aufziehen von Rechteckboxen.

toleranceunits

Einheit der Tolerance-Werte. Standardmäßig ist "pixels" gesetzt. Für die Abfrage von PostGIS-Layern wird die Angabe von "tolerance" mit der aktuellen Pixelgröße multipliziert. Ist "toleranceunits" leer wird auch die Pixelgröße verwendet, ist sie "meters" wird die "tolerance" mit 1 multipliziert.

epsg_code

Die Angabe des Koordinatensystems, in dem die Daten dieses Features vorliegen. Stimmt das originäre Koordinatensystem nicht mit dem Ausgabekoordinatensystem überein, dass im Feld "epsg_code" in der Tabelle Rolle definiert wird, werden die Koordinaten vom MapServer on-the-fly transformiert. Dieses Feld hat keine Bedeutung bei WMS-Layern. Dort wirkt das Feld ows_srs.

template

Defaulttemplate, der beim Einfügen des Layers in eine Stelle übernommen wird.

queryable

Defaultwert für die Abfragbarkeit des Layers, der beim Einfügen des Layers in eine Stelle übernommen wird.

transparency

Defaultwert für die Transparenz des Layers, der beim Einfügen des Layers in eine Stelle übernommen wird.

drawingorder

Defaultwert für die Zeichenreihenfolge des Layers, der beim Einfügen des Layers in eine Stelle übernommen wird.

minscale, maxscale

Defaultwerte für den Maßstabsbereich des Layers, die beim Einfügen des Layers in eine Stelle übernommen werden.

offsite

Defaultwert für den transparent zu zeichnenden RGB-Farbwert, der beim Einfügen des (Raster-)Layers in eine Stelle übernommen wird.

ows_srs

Angabe des Ausgabekoordinatensystems, wenn der Layer als WMS bzw. WFS von kvwmap zur Verfügung gestellt werden soll oder wenn der Layer einen externen WMS einbindet, in der Form:

"EPSG:<code>"

Es können alle Koordinatenreferenzsysteme angegeben werden, die der eigene kvwmap-Dienst anbieten soll bzw. alle Koordinatenreferenzsysteme, die die dienstanbietende Stelle im getCapabilities anbietet, in der Form:

"EPSG:<code1> EPSG:<code2> EPSG:<code3>"

Hat der Nutzer in seinen Optionen eine der angegebenen Kartenprojektionen ausgewählt, wird der Dienst in diesem EPSG angefordert (horizontale Texte und Linien erscheinen horizontal). Hat der Nutzer eine Kartenprojektion ausgewählt, die in diesem Feld nicht aufgelistet ist, transformiert der Mapserver das gelieferte Kartenbild (horizontale Texte und Linien erscheinen u.U. schräg).

wms_name

Angabe des Layernamens, wenn der Layer als WMS bzw. WFS zur Verfügung gestellt werden soll. Wird das Feld freigelassen, wird der im Feld "Name" verwendete Layername ausgegeben. Hinweis: Bei Layernamen, die deutsche Sonderzeichen enthalten, empfiehlt sich die Angabe eines WMS-Namens ohne deutsche Sonderzeichen.

wms_server_version

kvwmap unterstützt alle WMS-Versionen bis einschließlich 1.3.0

wms_format

Das Rasterformat des Ausgabebildes, wenn der Layer als WMS bzw. WFS zur Verfügung gestellt werden soll.

wms_connectiontimeout

Zeitspanne, nach der der WMS als "nicht verfügbar" klassifiziert wird und der Verbindungsaufbau auf diesen Layer abgebrochen wird.

wms_auth_username

Basiert der Layer auf einem passwortgeschützten WMS, wird hier der entsprechende Username gespeichert.

wms_auth_password

Basiert der Layer auf einem passwortgeschützten WMS, wird hier das entsprechende (verschlüsselte) Passwort gespeichert.

wfs_geom

Gibt bei WFS-Diensten mit mehreren Geometrie-Attributen dasjenige Attribut an, das Mapserver als Geometrie verwenden soll.

selectiontype

"radio" erzeugt in der Legende einen Radiobutton statt des üblichen Häkchenfeldes zum Ein- oder Ausschalten des Layers. Sind alle Layer einer Gruppe "radio", so kann also immer nur ein Layer in dieser Gruppe angeschaltet sein. Default ist NULL.

querymap

"1" = in der Sachdatenanzeige wird eine kleine Übersichtskarte mit dem Objekt gezeichnet. Default ist 0.

logconsume

Definiert, ob Zugriffe auf diesen Layer geloggt werden sollen:

  • "0" = Dieser Layer soll generell nicht geloggt werden
  • "1" = Dieser Layer kann geloggt werden.

Ob die Zugriffe auf die mit "1" gekennzeichneten Layer tatsächlich in der Tabelle u_consume2layer protokolliert werden, entscheidet die Einstellung des Feldes "logconsume" der jeweiligen Stelle, in der dieser Layer aufgerufen wird.

Tabelle "layer_attributes"

Allgemeine Definition der Attribute der Layer. Spezielle Eigenschaften in den Stellen werden in der Tabelle ayer_attributes2stelle gesetzt.

Jedes Attribut eines Layers kann im Generischen Layereditor angezeigt werden, wenn es im Query-Statement genannt wird.

name

Attributname, wie er im Query-Statement aus der Datenbank geholt wird (also nicht unbedingt identisch mit dem Tabellenattributnamen).

real_name

Tatsächlicher Tabellen-Attributname auf Datenbankebene.

tablename

Tatsächlicher Tabellen-Name auf Datenbankebene.

table_alias_name

Tabellen-Name, wie er im Query-Statement aus der Datenbank geholt wird (i.d.R. als Alias).

type

Datentyp des Attributes, wie er im Query-Statement aus der Datenbank geholt wird.

geometrytype

Geometrietyp des Attributs, wenn es vom Typ geometry ist.

constraints

Einschränkungen, die auf Datenbankebene in der Tabelle gesetzt sind.

nullable

'1', wenn das Attribut auf Datenbankebene NOT NULL ist. Default '0'.

length

Einschränkung der Zeichenkettenlänge auf Datenbankebene.

decimal_length

Begrenzung der Anzahl der Nachkommastellen von Zahlen.

default

Standardwerte auf Datenbankebene, die bei Nichtausfüllen automatisch gesetzt werden bzw. von kvwmap im Generische Layereditor als Vorgabewert bei einem neuen Datensatz automatisch vorgeschlagen werden. Betrifft auch Vorgaben aus Sequenzen.

form_element_type

Beschreibung des Formelements, in dem das Attribut angezeigt wird:

  • Text
  • Textfeld
  • Auswahlfeld
  • Autovervollständigungsfeld
  • Checkbox
  • Geometrie
  • SubFormPK
  • SubFormFK
  • SubFormEmbeddedPK
  • Time
  • Dokument
  • Link
  • dynamicLink
  • User
  • UserID
  • Stelle
  • StelleID
  • Fläche
  • Länge
  • Zahl
  • mailto

SubFormPK und SubFormFK dienen der Erzeugung verschachtelter Tabellen. Time, User, UserID, Stelle, StelleID, Fläche und Länge werden von kvwmap automatisch gefüllt. Weiter Informationen siehe die Dokumentation zum Generischen Layereditor.

options

Zuweisung bestimmter Vorgabewerte für den Attributtyp Auswahlfeld

alias

Zuweisung von (langschriftlichen) Attributnamen für die Anzeige im Generischen Layereditor zur besseren Lesbarkeit.

alias_<language>

Weitere Aliasnamen in anderen Sprachen.

tooltip

Der hier gespeicherte Text erscheint in der Sachdateneinzeige des GLE als Tooltipp, wenn man mit dem Cursor über den Attributnamen fährt.

group

Bezeichnung der Gruppe zu der das Attribut gehören soll. Die definition der Attribute im Layer sollte sein, dass Attribute, die den gleichen Gruppennamen haben direkt nebeneinander liegen.

arrangement

'0': Das Attribut wird unter dem vorhergehenden angezeigt '1': Das Attribut wird rechts neben dem vorherigen angezeigt

labeling

NULL oder '0': Die Beschriftung des Attributes wird links neben dem Wert angezeigt. '1': Die Beschriftung des Attributes wird über dem Wert angezeigt. '2': Die Beschriftung des Attributes wird garnicht angezeigt.

raster_visibility

NULL oder '0': Attribut wird im Rastermodus nicht dargestellt. '1' Das Attribut wird im Rastermodus dargestellt.

mandatory

'1': es handelt sich um ein Pflichtattribut in der Layersuche, das ausgefüllt werden muss. Default ist '0'.

quicksearch

Gibt an ob das Attribut bei der Schnellsuche verwendet werden soll.

order

Speichert die Reihenfolge der Attribute in der Query-Angabe, die maßgeblich für die Reihenfolge der Attribute in der Sachdatenanzeige ist.

privileg

Setzt die Default-Rechte für das Attribut. Mögliche Werte sind

  • '0':der User kann das Attribut lesen, aber nicht editieren
  • '1': der User kann das Attribut editieren
  • '-1': das Attribut kann nur zum Exportieren, nicht zur Anzeige verwendet werden
  • gibt es für ein Attribut keinen Eintrag oder ist der Wert NULL, ist das Attribut nicht sichtbar und kann auch nicht für Suche, Export oder Verknüpfungen zu anderen Attributen verwendet werden.

query_tooltip

Definiert ob das Attribut im Abfragemodus im Tooltip angezeigt werden soll.

Tabelle "layer_attributes2stelle"

Setzt für jedes Attribut des Layers in jeder Stelle die Rechte des Benutzers auf das Attribut.

layer_id und stelle_id

ebendiese

attributname

Attributname, wie er im Query-Statement aus der Datenbank geholt wird (also nicht unbedingt identisch mit dem Tabellenattributnamen).

privileg

Setzt die Rechte für das Attribut innerhalb der Stelle, die in stelle_id definiert ist. Mögliche Werte sind

  • '0':der User kann das Attribut lesen, aber nicht editieren
  • '1': der User kann das Attribut editieren
  • '-1': das Attribut kann nur zum Exportieren, nicht zur Anzeige verwendet werden
  • gibt es für ein Attribut keinen Eintrag oder ist der Wert NULL, ist das Attribut nicht sichtbar und kann auch nicht für Suche, Export oder Verknüpfungen zu anderen Attributen verwendet werden.

tooltip

Bestimmt, ob das Attribut beim Überfahren des Objekts mit der Maus als Tooltip angezeigt wird oder nicht:

  • "0" = wird nicht als Tooltip angezeigt
  • "1" = wird als Tooltip angezeigt

Tabelle "layer_parameter"

In dieser Tabelle werden Parameter beschrieben, mit denen dynamische Layer definiert werden können. Siehe auch selectable_layer_params in Tabelle stelle

Tabelle "m_grids"

Dient der Erzeugung eines Gitternetzes.

Tabelle "m_grids2used_layer"

Ordnet das Gitternetz aus der Tabelle "m_grids" einem Layer zu.

Tabelle "referenzkarten"

Diese Tabelle regelt den Aufbau der Übersichtskarte. Die Koordinatenwerte der linken unteren bzw. rechten oberen Ecke müssen der tatsächlichen ausdehnung des Koordinatenausschnitts im Koordinatensystem der Stelle entsprechen.

Name

Bezeichnung für die Übersichtskarte, kann frei gewählt werden.

Dateiname

Name der Rasterbild-Datei. Pfad zur Übersichtskarte ist in der config.php gesetzt!

xmin, ymin, xmax, ymax

Ausdehnung der Übersichtskarte.

width, height

Größe der Übersichtskarte (in Pixeln), z.B. 120, 90.

Tabelle "rolle"

Durch die Rolle werden dem jeweiligen Benutzer (User) beim Start von kvwmap verschiedene Stellen (mindestens eine) zunächst angeboten und nach erfolgter Auswahl zugeordnet. Für jeden User können beliebig viele Rollen angelegt werden. Zu jeder Rolle gehört genau eine Stelle. Erst durch die Rolle (d.h. eben durch die Zuweisung des Benutzers zu einer Stelle) werden dem Benutzer bestimmte Rechte verliehen, die sich aus der Zuordnung zur Stelle ergeben.

user_id

Die entsprechende ID aus der Tabelle "user". Es können beliebig viele Rollen angelegt werden, in denen die user_id identisch ist, nur muss jeweils das Feld "stelle_id" anders belegt werden.

stelle_id

Die entsprechende ID aus der Tabelle "stelle". Zum Begriff "Stelle" siehe dort.

nImageWidth, nImageHeight

Größe des Kartenfensters beim Start (in Pixeln), z.B. "500, 500". Diese Einstellung wird aus der jeweils letzten Sitzung übernommen.

minx, miny, maxx, maxy

Ausdehnung des Kartenausschnitts beim Start (in Koordinaten). Diese Einstellung wird aus der jeweils letzten Sitzung übernommen.

nzoomFaktor

Faktor, der das Maß des Herein- bzw. Herauszoomens bestimmt. "2" ist Verdoppelung bzw. Halbierung des Maßstabs. Diese Einstellung wird aus der jeweils letzten Sitzung übernommen.

selectedButton

Speichert, welcher Zoom-Button beim Beenden aktiviert war.

epsg_code

Definiert das Ausgabekoordinatensystem für den jeweiligen User in dieser Stelle. Hinweis: Jeder User einer Stelle kann also sein Kartenbild in einem anderen Koordinatensystem erhalten.

epsg_code2

Definiert ein zusätzliches Ausgabekoordinatensystem für den jeweiligen User in dieser Stelle, das nur für die Anzeige unter der Karte verwendet wird.

active_frame

Hier wird die aktuelle Druckrahmen-ID gespeichert.

last_time_id

Speichert den Zeitpunkt des letzten aufgerufenen Kartenausschnitts eines Users.

gui

speichert die graphische Oberfläche, die der User ausgewählt hat. Standard: "gui.php". Hinweis: Eigene GUIs können im Ordner layouts/custom von kvwmap gespeichert werden. Sie werden dann z.B. so angegeben: "custom/gui_1".

language

Speichert die Sprachversion, die der User in der Stelle auswählt.

charset

Speichert den entsprechenden zu verwendenden Zeichensatz, abhängig von language.

hidemenue

Speichert, ob der User in der Stelle das Menü zu- oder weggeschaltet hat.

hidelegend

Speichert, ob der User in der Stelle die Legende zu- oder weggeschaltet hat.

fontsize_gle

Speichert die Textgröße, die der User für die Sachdatenanzeige in der Stelle ausgewählt hat.

highlighting

Speichert, ob der User in der Stelle die Objekte gehighlightet haben will oder nicht.

buttons

Speichert, welche Buttons der Navigationsleiste der User in der Stelle benutzen will.

scrollposition

Speichert die Position des Scrollbalkens an der Legende.

result_color

Speichert die ID der Farbe aus der Tabelle colors, die für die Anzeige von Suchergebnissen verwendet werden soll.

Tabelle "rollenlayer"

Ersetzt die Einträge in den Tabellen layer, used_layer, u_rolle2used_layer und classes, wenn ein Layer nicht allen Usern der Stelle zur Verfügung stehen soll, z.B. die Suchergebnislayer. Zu den entsprechenden Feldern siehe die Beschreibungen in den genannten Tabellen.

Tabelle "rolle_nachweise"

Dient der Speicherung von Suchpolygonen für die Fachschale Nachweisverwaltung.

Tabelle "rolle_saved_layers"

Dient der Speicherung von Einstellungen des Themenbaumes.

id

Fortlaufende Zahl als Identifier der Tabelle

user_id, stelle_id

ID des Nutzers und der Stelle, für die die Einstellungen gespeichert werden sollen.

name

Bezeichnung der Einstellung. Wird verwendet für die Anzeige in der Auswahlliste der Einstellungen.

layers

Kommagetrennte Liste von ID's deren Layer in der Themeneinstellung für die Anzeige in der Karte eingeschaltet sein sollen.

query

Kommagetrennte Liste von ID's deren Layer in der Themeneinstellung für die Info-Abfrage eingeschaltet sein sollen.

CREATE TABLE `rolle_saved_layers` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `stelle_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `layers` text NOT NULL,
  `query` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Tabelle "stelle"

Der Begriff "Stelle" meint eine Arbeitsstelle oder besser Arbeitsaufgabe. An die Stelle ist eine festgelegte Benutzeroberfläche geknüpft mit allen daran hängenden Rechten an Funktionen, räumlicher Ausdehnung und Bedienelementen. Die Stelle definiert auch den Zugriff auf die Daten, die der Benutzer sehen und abfragen darf.

Bezeichnung

Wenn der Benutzer kvwmap startet, kann er aus den Stellen auswählen, die ihm über die Rolle zugewiesen wurden. In der Auswahl erscheint die Bezeichnung der Stellen. Zusätzlich zur Deutschen bezeichnung können die Bezeichnungen in Plattdeutsch, Englich, Polnisch und Vietnamesisch angegeben werden. Die Sprachen sind an den Spaltennamen Bezeichnung mit _ angehängt, siehe Tabellendefinition unten.

start, stop

Damit kann die zeitliche Zuordnung des Benutzers zur Stelle eingestellt werden, z.B. bei Auslegungsfristen für Bürgerbeteiligungen oder für zeitlich begrenzte Gast-Zugriffe.

minxmax, minymax, maxxmax, maxymax

Maximal erlaubte Ausdehnung (in Koordinaten) des Kartenausschnitts, z.B. der gesamte Landkreis, die Stadt oder eine Gemeinde.

epsg-code

Default-EPSG, wenn die Stelle als neue Stelle kopiert wird.

Referenzkarte_ID

Die entsprechende ID aus der Tabelle "referenzkarten" zur Anbindung der Übersichtskarte. Zum Begriff "Referenzkarte" siehe dort.

Authentifizierung

Regelt, ob für den Zugriff auf diese Stelle eine Benutzerauthentifizierung nötig ist ('1') oder nicht ('0').

ALB_status

Regelt die PDF-Ausgabe des ALB.

  • "30" = Eigentümerangaben nicht sichtbar
  • "35" = Eigentümerangaben sichtbar.

wappen

Dateiname des zugehörigen Wappens (Pfad wird in die config.php eingetragen).

wappen_link

Die URL, die hier eingegeben wurde, wird beim Klick auf das Wappen in einem neuen Tab im Browser aufgerufen.

alb_raumbezug

Mit "alb_raumbezug" und "alb_raumbezug_wert" kann man eine räumliche Einschränkung auf die ALB-Daten für eine Stelle vornehmen. Auswahlmöglichkeiten: "Kreis", "Amt", "Gemeinde".

alb_raumbezug_wert

Gibt den Schlüssel des Kreises/des Amtes/der Gemeinde an.

logconsume

  • "0" = es erfolgt keine Protokollierung der Layerzugriffe für die User dieser Stelle
  • "1" = wenn ein User dieser Stelle in der Karte navigiert oder eine Layerauswahl vornimmt, werden alle logbaren Layer in der Tabelle u_consume2layer mit Angabe eines Zeitstempels gespeichert.

Hinweis: Es werden nur die Layer der Stelle protokolliert, die im Feld "logconsume" der Tabelle layer als protokollierbar gekennzeichnet sind.

pgdbhost, pgdbname, pgdbpasswd

Wenn in der config.php POSTGRES_DBNAME nicht gesetzt ist, werden die Zugangsdaten für die PostgreSQL-Datenbank aus diesen Einstellungen für die Stelle entnommen.

wms_... und ows_ ...

Einträge, die relevant sind, wenn Daten der Stelle als Dienst angeboten werden. Die Einträge erscheinen im GetCapabilities-Dokument, bzw. werden für die Bereitstellung des Dienstes verwendet.

check_client_ip

  • "1" = es erfolgt eine Prüfung ob der User von einer der in der Tabelle user in Spalte ips eingetragenen IP Adressen aus auf kvwmap zugreift.
  • "0" = keine Prüfung

check_password_age

  • "1" = es erfolgt eine Prüfung ob das Password des Nutzers zum Zeitpunkt des Einloggens älter ist als in Spalte allowed_password_age für die Stelle angegeben. Tritt der Fall ein, muss der Nutzer erst sein Passoword ändern um sich einloggen zu können. (Funktion ist in Version 1.7.0 in Arbeit)
  • "0" = es erfolgt keine Prüfung

allowed_password_age

Erlaubtes Alter der Passwörter der Benutzer die sich an der Stelle anmelden wollen. Angegeben als ganze Zahl, eine Anzahl von Monaten definiert. Wirkt nur wenn check_password_age=1 für die Stelle gesetzt ist.

use_layer_aliases

  • "1" = In dieser Stelle werden Layer-Aliase verwendet.
  • "0" = Es werden keine verwendet.

selectable_layer_params

Die hier angegebenen Namen dürfen in der GUI für die Auswahl von Parametern verwendet werden. Es dürfen nur Parameter kommagetrennt eingegeben werden, die in der Tabelle layer_parameter vordefiniert sind.

hist_timestamp

  • "1" = In dieser Stelle darf ein Datum für den Stand der ALKIS-Daten ausgewählt werden.
  • "0" = History wird nicht verwendet und ist nicht Einstellbar

default_user_id

Nutzer Id der default Rolle. Die Einstellungen dieser Rolle werden für das Anlegen neuer Rollen für diese Stelle verwendet. Ist dieser Wert nicht angegeben oder die angegebene Rolle existiert nicht, werden die Defaultwerte der Rollenoptionen bei der Zuordnung eines Nutzers zu dieser Stelle verwendet. Die Angabe ist nützlich, wenn die Einstellungen in Gaststellen am Anfang immer gleich sein sollen. Außerdem werden die für den Default-Nutzer in der Stelle gespeicherten Themeneinstellungen aus der Tabelle rolle_saved_layers für jeden Gast mit angelegt, damit die Gäste ebenfalls darauf zugreifen können.

Tabellenstruktur:

CREATE TABLE `stelle` (
 `ID` int(11) NOT NULL,
 `Bezeichnung` varchar(255) CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL,
 `Bezeichnung_low-german` varchar(255) DEFAULT NULL,
 `Bezeichnung_english` varchar(255) CHARACTER SET cp1250 DEFAULT NULL,
 `Bezeichnung_polish` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `Bezeichnung_vietnamese` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
 `start` date NOT NULL DEFAULT '0000-00-00',
 `stop` date NOT NULL DEFAULT '0000-00-00',
 `minxmax` double DEFAULT NULL,
 `minymax` double DEFAULT NULL,
 `maxxmax` double DEFAULT NULL,
 `maxymax` double DEFAULT NULL,
 `epsg_code` varchar(6) DEFAULT '2398',
 `Referenzkarte_ID` int(11) DEFAULT NULL,
 `Authentifizierung` enum('0','1') NOT NULL DEFAULT '1',
 `ALB_status` enum('30','35') NOT NULL DEFAULT '30',
 `wappen` varchar(150) NOT NULL DEFAULT 'stz.gif',
 `wappen_link` varchar(255) DEFAULT NULL,
 `alb_raumbezug` set(,'Kreis','Amtsverwaltung','Gemeinde') NOT NULL DEFAULT ,
 `alb_raumbezug_wert` varchar(255) NOT NULL DEFAULT ,
 `logconsume` enum('0','1') CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL,
 `pgdbhost` varchar(25) NOT NULL DEFAULT 'localhost',
 `pgdbname` varchar(25) DEFAULT NULL,
 `pgdbuser` varchar(25) DEFAULT NULL,
 `pgdbpasswd` varchar(25) DEFAULT NULL,
 `ows_title` varchar(255) DEFAULT NULL,
 `wms_accessconstraints` varchar(255) DEFAULT NULL,
 `ows_abstract` varchar(255) DEFAULT NULL,
 `ows_contactperson` varchar(255) DEFAULT NULL,
 `ows_contactorganization` varchar(255) DEFAULT NULL,
 `ows_contactemailaddress` varchar(255) DEFAULT NULL,
 `ows_contactposition` varchar(255) DEFAULT NULL,
 `ows_fees` varchar(255) DEFAULT NULL,
 `ows_srs` varchar(255) DEFAULT NULL,
 `check_client_ip` enum('0','1') NOT NULL DEFAULT '0',
 `check_password_age` enum('0','1') NOT NULL DEFAULT '0',
 `allowed_password_age` tinyint(4) NOT NULL DEFAULT '6',
 `use_layer_aliases` enum('0','1') NOT NULL DEFAULT '0',
 `selectable_layer_params` text,
 `hist_timestamp` tinyint(1) NOT NULL DEFAULT '0',
 `default_user_id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Tabelle "stelle_gemeinden"

Sowohl Adress-, Eigentümer-, Grundbuchblatt- als auch Flurstückssuche können auf die Gemeinden, Gemarkungen und Fluren auf die die Stelle Zugriff haben soll, eingeschränkt werden.

Stelle_ID

Die ID der Stelle, die die Einschränkung erfahren soll.

Gemeinde_ID

Der (achtstellige) Gemeindeschlüssel der Gemeinde, die in dieser Stelle zur Auswahl stehen soll. Sollen mehrere Gemeinden in der Stelle zur Auswahl stehen, werden für die entsprechende Stelle mehrere Einträge erzeugt.

Gemarkung

Der (sechsstellige) Gemarkungsschlüssel der Gemarkung, die in dieser Stelle zur Auswahl stehen soll. Sollen mehrere Gemarkungen in der Stelle zur Auswahl stehen, werden für die entsprechende Stelle mehrere Einträge erzeugt. Das Feld Gemeinde_ID muss auch ausgefüllt sein.

Flur

Die Flurnummer der Flur, die in dieser Stelle zur Auswahl stehen soll. Sollen mehrere Fluren in der Stelle zur Auswahl stehen, werden für die entsprechende Stelle mehrere Einträge erzeugt. Die Felder Gemarkung und Gemeinde_ID müssen auch ausgefüllt sein.

Tabelle "styles"

Styles beinhalten Parameter zur Symbolisierung und Ausgestaltung der im Layer enthaltenen Geometrien.

symbol

Die laufende Nummer des Symbols in der Symboldatei (z.B. symbols.sym). Beginnend mit 1, ist also das fünfte Symbol die Nummer 5. In der Symboldatei müssen dafür keine Nummern explizit angegeben werden.

Hinweis: Große Schwierigkeiten gibt’s, wenn Symbole in die Symbol-Datei eingefügt werden. Besser nur den Symbolnamen verwenden und das Feld "Symbol" grundsätzlich freilassen.

symbolname

Wenn die Symbole der Symboldatei Namen haben, sollten diese benutzt werden. Diese Verfahrensweise ist derjenigen der Symbolnummern vorzuziehen.

size

Angabe der Höhe von Punkt-, Linien- bzw. Flächensymbolen in Pixeln. Werden sizeunits gesetzt, bezieht sich die Angabe auf die definierte Einheit (momentan von kvwmap noch nicht unterstützt).

Für Symbole vom Typ HATCH (nur bei Flächenlayern) ist der angegebene Wert der Abstand zwischen den Schraffurlinien.

Bei skalierbaren Symbolen bestimmt size deren Höhe für den unter symbolscale angegebenen Maßstab.

Hinweis: Damit die Darstellung skalierbar wird, muss zusätzlich ein Wert für minsize und maxsize vergeben werden, sowie in Tabelle
used_layer ein symbolscale gesetzt sein.

Die Umrandungen von Flächenlayern werden immer mit size=1 erzeugt. Sollen hier andere Größen bzw. auch Muster erscheinen, müssen Fläche und Umringslinie über zwei Classes und zwei Styles separat definiert werden.

Sollen Flächenlayer, die nur eine Farbe enthalten (siehe color), druckbar sein, darf für size niemals der Wert "0" gesetzt werden. Bei der Druckaufbereitung wird der Wert für size mit in die Umrechnung der Auflösung mit einbezogen. Wenn size=0 eingestellt ist hat das zur Folge, dass der entsprechende layer weder in der Druckvorschau noch im Druck ausgegeben wird.

color

Farbe des Symbols/der Linie/der Fläche. Wird angegeben in "R G B" (3 Zahlen mit Leerzeichen getrennt: "125 200 50") oder durch Angabe eines Attributs des Layers, in dem die jeweilige Farbe gespeichert ist.

backgroundcolor

Angabe einer Farbe für nicht-transparente Symbole.

outlinecolor

Angabe einer Farbe, um Polygone und bestimmte Markersymbole zu umranden. Linien haben keine outlinecolor, hier müssen gegebenenfalls mehrere Styles miteinander kombiniert werden.

colorrange

Erzeugt einen Farbverlauf innerhalb eines Wertebereichs (datarange). Die Angabe erfolgt in "R G B R G B" (6 Zahlen mit Leerzeichen getrennt: "0 127 255 223 255 0" für Azurblau bis Zitronengelb).

datarange

Legt den Wertebereich für colorrange fest. Die Angabe erfolgt mittels 2 durch ein Leerzeichen getrennter Werte. Das wertgebende Attribut und der Bereich müssen zuvor in der class unter Expression festgelegt werden, z.B. ([Attribut] > 0 AND [Attribut] < 70).

opacity

Bestimmt die Deckkraft des Styles von 0 (voll transparent) bis 100 (volle Deckkraft).

minsize, maxsize

Angabe der minimalen bzw. maximalen Größe von Punkt-, Linien- oder Flächensymbolen bei skalierbarer Darstellung.

Hinweis: Damit die Darstellung skalierbar wird, muss zusätzlich ein Wert für minsize und maxsize vergeben werden, sowie in Tabelle
used_layer ein symbolscale gesetzt sein.

angle

Winkelangabe von Symbolen und Schraffuren in Grad. In Kombination mit geomtransform kann auch "AUTO" als Wert gesetzt werden, um zum Beispiel Linien mit Pfeilspitzen oder Befiederung zu versehen.

angleitem

Angabe eines Attributs des Layers, in dem der jeweilige Winkel gespeichert ist.

antialias

'1': Schaltet die Kantenglättung bei TrueType- und Cartoline-Symbolen ein. Hat keine Auswirkungen auf andere Style-Typen.

width

Angabe der Breite der zu zeichnenden Linien in Pixeln.

Für Symbole vom Typ HATCH (nur bei Flächenlayern) gibt der angegebene Wert die Breite der Schraffurlinien an.

Bei skalierbarer Darstellung bestimmt width die Linienbreite für den unter symbolscale angegebenen Maßstab.

minwidth, maxwidth

Angabe der minimalen bzw. maximalen Breite von Linien bei skalierbarer Darstellung.

Hinweis: Damit die Darstellung skalierbar wird, muss zusätzlich ein Wert für minsize und maxsize vergeben werden, sowie in Tabelle
used_layer ein symbolscale gesetzt sein.

sizeitem

Wenn die Größe der Linien in einem Attribut gespeichert wird, kann man den Attributnamen angeben. Damit können die Objekte einer Klasse verschieden breite Linien bzw. verschieden große Symbole bekommen.

offsetx, offsety

Verschiebt das Symbol um den angegebenen Betrag in X- bzw. Y-Richtung. Die Eingabe von negativen Werten ist möglich. Einen Sonderfall bildet ein offsety-Wert von "-99". Dieser versetzt Linien parallel nach links oder rechts bzw. Flächenbegrenzungslinien nach innen oder außen um den angegebenen offsetx-Wert.

pattern

Dient der Darstellung von Linienmustern, durch Angabe von Strich- und Pausenlängen (in Pixeln), z.B. "1 4 15 4 15 4" für eine Kreisgrenze.

geomtransform

Erzeugt eine neue Geometrie aus der vorhandenen Geometrie. Mögliche Werte sind:

  • bbox: Erzeugt einen rechteckigen Begrenzungsrahmen um die Geometrie
  • centroid: Erzeugt einen Punkt im Flächenschwerpunkt der Geometrie
  • start: Erzeugt einen Punkt am ersten Punkt der Geometrie
  • end: Erzeugt einen Punkt am letzten Punkt der Geometrie
  • vertices: Erzeugt Punkte auf allen Scheitelpunkten der Geometrie zwischen dem Anfangs- und Endpunkt

Eine beispielhafte Darstellung findet sich unter Transformations for simple styling (CLASS STYLE only)

gap

Bestimmt den Abstand zwischen Symbolen (Mitte zu Mitte) bei Liniendekorationen und Flächenfüllungen. Bei Liniendekorationen sorgt ein negativer Wert zusätzlich dafür, dass die Symbole entlang der Linie ausgerichtet werden, während ein positiver Wert alle Symbole nach oben ausrichtet.

initialgap

In Kombination mit gap verschiebt sich der Beginn der Liniendekoration um den angegebenen Wert.
In Kombination mit pattern verschiebt sich das Linienmuster um den angegebenen Wert, jedoch nicht der Beginn.

linecap

Bestimmt die Darstellung der Linienenden. Mögliche Werte sind:

  • butt: Stoppt die Linie exakt am Ende mit einem geraden Schnitt
  • round: Erzeugt ein abgerundetes Ende, jedoch um width/2 über das eigentliche Linienende hinaus verlängert
  • square: Erzeugt einen geraden Schnitt, jedoch um width/2 über das eigentliche Linienende hinaus verlängert

Standardmäßig ist round gesetzt.

linejoin

Bestimmt die Darstellung der Scheitelpunkte. Mögliche Werte sind:

  • none: Stoppt jeden Schenkel einzelnd exakt am Ende mit einem geraden Schnitt
  • bevel: Stoppt beide Schenkel zusammen mit einem geraden Schnitt, jedoch über das eigentliche Linienende hinaus verlängert
  • round: Erzeugt ein abgerundetes Ende, jedoch über das eigentliche Linienende hinaus verlängert
  • miter: Lässt beide Außenkanten der Linie über das eigentliche Linienende spitz zusammenlaufen

Standardmäßig ist round gesetzt.
Eine beispielhafte Darstellung findet sich unter LINEJOIN

linejoinmaxsize

Funktioniert nur in Kombination mit dem Wert "miter" unter linejoin und legt fest, wie weit die Außenkanten der Linien maximal über das eigentliche Linienende hinaus zusammenlaufen dürfen. Das Maximum berechnet sich wie folgt:

m_max = width * linejoinmaxsize

Standartwert ist "3".
Eine beispielhafte Darstellung findet sich unter LINEJOINMAXSIZE (only relevant for LINEJOIN miter)


Die Anwendergruppe kvwmap veröffentlicht Symbole, Signaturen und karthographische HowTos hier in diesem WIKI. Weitere Informationen zur Erstellung von Symbolen und Liniensignaturen z.B. hier: http://mapserver.org/de/mapfile/symbology/construction.html

Tabelle "used_layer"

Jeder Stelle können beliebig viele Used Layer zugeordnet werden. Zu jedem Used Layer gehört genau ein Layer. Umgekehrt ausgedrückt: Durch die Tabelle "used_layer" kann ein Layer beliebig vielen Stellen zugeordnet werden.

stelle_id

Die entsprechende ID aus der Tabelle "stelle".

layer_id

Die entsprechende ID aus der Tabelle "layer". Zum Begriff "Layer" siehe dort.

queryable

Layer können als abfragbar ("1") oder nicht abfragbar ("0") gekennzeichnet werden. Entsprechend ist das Info-Häkchenfeld in der Legende vorhanden oder nicht.

drawingorder

Die Zeichenreihenfolge, in der die Layer dargestellt werden, ist entscheidend für das Aussehen der Karte. Der Layer mit der kleinsten drawingorder wird zuerst gezeichnet. Die drawingorder regelt weiterhin die Position des Layers innerhalb der Gruppe in der Themenauswahl/Legende. Die drawingorder kann bis zu elf Stellen besitzen, es empfiehlt sich also, großzügig bei der Vergabe zu sein, um später in kvwmap integrierte Layer noch sinnvoll einfügen zu können. Rasterlayer sollten zuerst gezeichnet werden, Beschriftungslayer zuletzt.

Durch die Angabe der Zeichenreihenfolge in den Used Layern kann jeder Stelle individuell eine eigene Zeichenreihenfolge gegeben werden.

minscale

Kleinste Maßstabszahl, unterhalb der der Layer nicht mehr angezeigt wird (z.B. 500).

maxscale

Größte Maßstabszahl, über die hinaus der Layer nicht mehr angezeigt wird (z.B. 10.000).

offsite

erzeugt einen Farbindex [R G B] bei Rasterlayern, um sie transparent zu machen.

transparency

Wert, der angibt, wie opak der Layer sein soll, zwischen

  • "0" = vollkommen durchsichtig und
  • "100" = gar nicht durchsichtig.

postlabelcache

Zeichnet den Layer nach allen anderen und auch nach der Beschriftung, wenn "1" angegeben wird.

Filter

Dieser Parameter erlaubt für Daten spezifische Attributfilter einzusetzen, die zur selben Zeit abgearbeitet werden wie die räumlichen Filter, aber bevor irgendwelche CLASS-Ausdrücke ausgewertet werden.

Beispiel zur Einschränkung über den Gemarkungsschlüssel:

  • für eine bestimmte Gemarkung - (gemkgschl = '132100')
  • oder bei mehreren Gemarkungen - (gemkgschl = '132100' or gemkgschl = '132105')
  • oder mit Platzhaltern - (gemkgschl = '1321%')

"gemkschl" ist der Spaltenname zu den Objekten, die in der PostgreSQL-Datenbank gehalten werden, und um dessen Wert die Anfrage gefiltert werden soll.

template

Angabe eines PHP-Snippets, wenn NICHT der Generische Layereditor für die Sachdatenanzeige verwendet werden soll. Wenn Layer in verschiedenen Stellen unterschiedliche Sachdatenanzeigen bekommen sollen, können verschiedene Snippets zur Anzeige definiert werden. (Beispiel: biotope_amt1.php, biotope_amt2.php, etc.)

symbolscale

Gibt den Massstab an, bei dem ein Punkt-/Linien-/Flächensymbol, eine Linie oder eine Beschriftung die Größe/Breite haben soll, die ihm in der Tabelle styles bzw. labels als size/width zugewiesen ist. Dies funktioniert nur, wenn gleichzeitig die Felder minsize und maxsize bzw. minwidth und maxwidth in der Tabelle styles bzw. labels mit Werten gefüllt sind.

Werden bei symbolscale keine Angaben gemacht, hat das Symbol, die Linie oder die Beschriftung immer genau die Größe/Breite, die durch size/width definiert ist.

requires

Angabe um den Zusammenhang zum Anzeigen des Layers festzulegen. Beispiel für einen Layer "Gebäudepunkte":

([Gebäude] = 1)

D.h. der Layer "Gebäudepunkte" ist nur dann sichtbar, wenn auch der Layer "Gebäude" sichtbar ist. Hinweis: In der Legende bzw. Themenauswahl erscheint der Layername dann nicht mehr (im Beispiel also der Layer "Gebäudepunkte"), es werden nur noch seine Classes angezeigt.

logconsume

entscheidet, ob der Zugriff auf den Layer in der Tabelle u_consume2layer geloggt werden soll.

privileg

Regelt den grundsätzlichen Zugriff auf sämtliche Objekte des Layers in der Stelle im Generischen Layereditor. Die Rechte auf die einzelnen Attribute des Layers werden in der Tabelle layer_attributes2stelle gesetzt.

  • "0" = Der User darf sämtliche Attribute lesen und bearbeiten
  • "1" = Der User darf lesen, bearbeiten und neue Datensätze erzeugen
  • "2" = Der User darf lesen, bearbeiten, neue Datensätze erzeugen und Datensätze löschen.

start_aktiv

'1': Schaltet den Layer automatisch ein, wenn es sich um eine Gast-Stelle handelt. Default ist '0'.

Tabelle "user"

In dieser Tabelle werden die einzelnen Benutzer von kvwmap eingetragen. Jeder Benutzer wird mit Name und Vorname einzeln eingetragen. Das Anlegen von Gruppenbezeichnungen ("Naturschutz", "Kataster" o.ä.) empfiehlt sich nicht. Hier erfolgt keine Zuweisung von Rechten oder Daten!

login_name

Der Login-Name erscheint im Browserfenster als "Nutzer" unten rechts.

ips

Hier können eine oder mehrere mit ; getrennte IP Adressen oder Hostnamen (z.B. bei Nutzung von dynDNS bei keiner festen IP) eingetragen werden, von denen der Nutzer aus auf kvwmap zugreifen darf. Tritt aber nur in Kraft, wenn in Tabelle stelle in die Spalte check_client_ip eine 1 eingetragen wurde. Wenn check_client_ip=1 ist und in dieser Spalte ips steht nichts, bekommt der User keinen Zugang.

password_setting_time

Hier wird das Datum eingetragen an dem der Nutzer das letzte mal das Passwort geändert hat. Wird berücksichtigt, wenn in der Stelle in der der Nutzer sich anmelden will (siehe Tabelle stelle), der Parameter check_password_age = 1 gesetzt ist. Die Zeitdifferenz zwischen der aktuellen Zeit und der hier eingetragenen darf dann nicht größer sein als in der Spalte allowed_password_age in der Tabelle stelle.

Funktion

Wenn es sich um einen Gast-Nutzer handelt, wird 'gast' eingetragen. Default ist 'user'.

stelle_id

Hier wird die Stelle angegeben, der dieser User beim ersten Start von kvwmap zugeordnet sein soll.

Tabelle "u_attributfilter2used_layer"

Speicherung der Attribut-Filter der Layer einer Stelle. Diese Tabelle wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "u_consume"

Speichert die räumliche Ausdehnung aller Kartenausschnitte, die von den Benutzern generiert werden. Diese Tabelle wird von kvwmap bei Benutzung des entsprechenden Menüs gefüllt.

user_id

Speichert die ID-Nummer des Benutzers.

stelle_id

Speichert die ID-Nummer der Stelle, die der User im Moment der Ausschnittgenerierung gewählt hat.

time_id

Speichert Datum und Uhrzeit des Zeitpunkts, an dem der Ausschnitt erzeugt wurde.

activity

Speichert die Art des Zugriffs.

nimagewidth, nimageheight

Speichert die Kartenfenstergröße.

minx, miny, maxx, maxy

Speichert die Eckpunktkoordinaten des erzeugten Kartenausschnitts.

prev, next

Speichert, ob dieser Kartenausschnitt über die History-Funktion entstanden ist und ob er einen Vorgänger- bzw. Nachfolgerkartenausschnitt hat.

Tabelle "u_consume2comments"

Wenn ein Nutzer einen räumlichen Ausschnitt über die Funktion Kartenausschnitt speichern speichert, dann wird von kvwmap diese Tabelle bei Benutzung des entsprechenden Menüs gefüllt.

Tabelle "u_consume2layer"

Diese Tabelle speichert die Auswahl der Layer, die ein Benutzer in einer Stelle auswählt. Damit diese Protokollierung erfolgt, muss das Feld "logconsume" der entsprechenden Stelle in der Tabelle stelle mit "1" belegt werden.

Tabelle "u_consumeALB"

Speichert die druckenden Zugriffe eines Users auf das ALB, das jeweils ausgedruckte ALB-Format und die Anzahl der ausgedruckten Seiten. Wird von kvwmap bei Benutzung des entsprechenden Menüs ausgefüllt.

Tabelle "u_consumeALK"

Speichert die druckenden Zugriffe eines Users auf die ALK und den jeweils verwendeten Druckrahmen. Wird von kvwmap bei Benutzung des entsprechenden Menüs ausgefüllt.

Tabelle "u_funktion2stelle"

Die Zuweisung der Funktionen zur jeweiligen Stelle. Dadurch wird erreicht, dass bestimmte Funktionen nur bestimmten Stellen zur Verfügung stehen.

Funktion_id

Die entsprechende ID aus der Tabelle "u_funktionen".

Stelle_id

Die entsprechende ID aus der Tabelle "stelle".

Erlaubt

Wenn eine Funktion zugeordnet werden soll, muss sie mit "1" auch explizit erlaubt werden.

Tabelle "u_funktionen"

Funktionen sind spezielle Anwendungen, deren Ablauf in der index.php definiert wird. Mit Funktionen sind nicht die Navigationswerkzeuge oder die Menüs gemeint, sondern bestimmte Anwendungen wie etwa die Anzeige von Eigentümerdaten, für die benutzerbezogen Rechte vergeben werden müssen.

Bezeichnung

Der Name wird in der Funktionenauswahl angezeigt.

Link

Der Link weist auf den Anwendungsfall, der in der index.php definiert ist. Zur Schreibweise siehe Tabelle u_menues.

Derzeit läuft es so, dass man die Funktion so definiert, wie der Anwendungsfall, den man schützen will. Also wenn man z.B. den Anwendungsfall: "ALB_Aenderung" schützen möchte, muss "ALB_Aenderung" in Bezeichnung eingegeben werden.

In der index.php werden diese Einschränkungen für den jeweiligen Anwendungsfall aber nur dann wirksam, wenn die Rechteeinschränkung abgefragt wird.

Ein Anwendungsfall ohne Rechteeinschränkungsmöglichkeit:

case "Anwendungsfall" :
{
 $GUI->functiondieausgefuehrtwerdensoll();
}

Anwendungsfall mit Einschränkungsmöglicheit:

case "Anwendungsfall" :
{
   if ($GUI->Stelle->isFunctionAllowed($GUI->formvars['go'])) {
     $GUI-> functiondieausgefuehrtwerdensoll();
   }
   else {
     # Benutzer ist nicht berechtigt zum Ausführen der Funktion
     $GUI->Fehlermeldung='Sie sind nicht berechtigt diesen Anwendungsfall auszuführen.';
     $GUI->rollenwahl($Stelle_ID);
     $GUI->output();
   }
}

Man sieht, dass im Falle der erteilten Berechtigung der Anwendungsfall ausgeführt wird und man sonst auf die Stellenauswahl geleitet wird. Man könnte meinen, dass diese Verzweigung generell für alle Anwendungsfälle vor der Abarbeitung der cases ausgeführt werden könnte, dann kann man aber nicht individuell entscheiden was geschehen soll, wenn keine Rechte vorliegen.

Bisher gilt also, wenn Sie Anwendungsfälle extra schützen wollen (zusätzlich zu der Möglichkeit den Link zur Anwendung in der Stelle gar nicht erst anzuzeigen) dann teilen sie es den Entwicklern mit und diese können das fest in die index.php aufnehmen. Es hindert sie natürlich keiner daran ihre eigene index.php zu erstellen. Achtung dann aber beim Update.

Tabelle "u_groups"

Speichert den Namen einer Gruppe. Alle Layer werden einer Gruppe zugeordnet.

Tabelle "u_groups2rolle"

Speichert benutzerbezogen, ob die Layer einer Gruppe gerade sichtbar sind oder nicht.

Die Felder "user_id", "stelle_id" und "id" müssen für jeden User in jeder Stelle erstellt werden. In das Feld "Status" speichert kvwmap den jeweiligen Zustand der Gruppe.

Tabelle "u_labels2classes"

Da mehrere Label zu einer Class gehören können, wird die Zuordnung des jeweiligen Labels in einer eigenen Tabelle vorgenommen.

class_id

Die entsprechende ID aus der Tabelle "classes".

label_id

Die entsprechende ID aus der Tabelle "labels".

Tabelle "u_menue2rolle"

Speichert für jeden User, ob ein Menü aufgeklappt ist oder nicht.

Tabelle "u_menue2stelle"

Die Zuweisung der Menüs zur jeweiligen Stelle. Dadurch wird erreicht, dass bestimmte Menüs nur bestimmten Stellen zur Verfügung stehen.

stelle_id

Die entsprechende ID aus der Tabelle "stelle".

menue_id

Die entsprechende ID aus der Tabelle "u_menues".

menue_order

Reihenfolge der Darstellung bei der Sortierung der Menüs in der Stelle. Das Menü mit der kleinsten Menue_order-Nummer wird zuerst gezeichnet. Die Nummer kann bis zu elf Stellen besitzen, es empfiehlt sich also, großzügig bei der Vergabe zu sein, um später für die Stelle hinzukommende Menüs noch einfügen zu können.

Tabelle "u_menues"

Menüs sind bestimmte Funktionen, z.B. die Suchfunktionen oder die Hilfe. Mit Menü ist nicht die Themenauswahl oder die Navigationsleiste gemeint. Jeder Stelle können unterschiedliche Menüs zugeordnet werden.

Menüs werden weiterhin für die Fachschalen benötigt.

name

Der Name wird im Menütext angezeigt.

links

Der Link weist auf den Anwendungsfall, der in der index.php definiert ist. Beispiel: Der Nutzer soll Flurstücke suchen können. Der Anwendungsfall in der index.php lautet "Flurstueck_Auswaehlen". Der entsprechende Eintrag im Feld "Links" lautet dann "index.php?go=Flurstueck_Auswaehlen"

obermenue

Die Menüs werden verschachtelt. Es gibt Obermenüs und darunter angeordnet Untermenüs. Soll ein Menü ein Untermenü sein, so wird hier die ID des entsprechenden Obermenüs angegeben. Beispiel: Die Flurstückssuche soll keinem Obermenü zugeordnet werden. Im Feld wird eine "0" eingetragen.

Beispiel: Die ALB-Fortführung soll ein Untermenü im Menü "Fortführung" sein. Das Menü "Fortführung" hat die ID "17". Diese ID wird im Feld eingetragen.

menueebene

Die Verschachtelungstiefe wird in Ebenennummern beginnend bei "1" angegeben. Beispiel: Die Flurstückssuche soll in der Verästelung am Anfang stehen. Im Feld wird eine "1" eingetragen. Beispiel: Die ALB-Fortführung soll in der Verästelung unter dem Menü "Fortführung" erscheinen. Im Feld wird eine "2" eingetragen, da das Menü "Fortführung" die Menüebene "1" hat.

target

"_blank" öffnet ein neues Fenster. Das kann z.B. bei der Hilfe nützlich sein. Standardmäßig wird nichts eingetragen, dann wird die Funktion im gleichen Fenster ausgeführt.

order

Mit der Spalte "order" lassen sich die Menüpunkte sortieren. Allerdings wirkt sich diese Sortierung nicht global und sofort aus, sondern durch die Werte in dieser Spalte wird die Reihenfolge der Menüpunkte für die Stellen-Zuweisung in kvwmap festgelegt. Diese Spalte ist also dafür da, damit beim Zuweisen eines Obermenüpunktes mit seinen Unterpunkten an eine bestehende Menüstruktur einer Stelle der neue Menüpunkt nicht immer ganz unten angehängt wird, sondern eben entsprechend seinem Wert "order" innerhalb der vorhandenen Menüstruktur. Für Untermenüpunkte gilt der Wert der Spalte "order" nur innerhalb des jeweiligen Obermenüpunktes. Dort können dann Werte wie z.B. 1,2,3,4,5 drin stehen, während der zugehörige Obermenüpunkt den order-Wert 3 hat.

button_class

Hier kann eine css-Klasse angegeben werden, die in der custom.css definiert wird. Wenn eine Klasse angegeben ist, kann der Menüpunkt als Button oberhalb des Menüs dargestellt werden (wenn der Nutzer die entsprechende Option "Menüs als Schaltflächen" in den Optionen auswählt).

Die Buttons haben normalerweise nur ein Bild als Inhalt, so dass die Klassendefinition relativ einfach ist:

.menue_xy{
  background-image: url(../graphics/custom/bild_xy.png);
}

Tabelle "u_rolle2used_layer"

Die Tabelle speichert beim Verlassen von kvwmap den Status der Häkchenfelder in der Legende. Damit werden die Einstellungen eines Benutzers gespeichert, unabhängig davon, ob ein anderer Benutzer in der selben Stelle andere Einstellungen vornimmt.

aktivStatus

Speichert benutzerbezogen den letzten Zustand dieses Layers in Bezug auf die Sichtbarkeit.

  • "0" = Layer ist ausgeschaltet
  • "1" = Layer ist eingeschaltet
  • "2" = Layer ist eingeschaltet, aber in der Legende nicht sichtbar, weil die Gruppe zugeklappt ist.

queryStatus

Speichert benutzerbezogen den letzten Zustand dieses Layers in Bezug auf seine Abfragbarkeit.

  • "0" = Layer ist nicht abfragbar geschaltet
  • "1" = Layer ist abfragbar geschaltet
  • "2" = Layer ist abfragbar geschaltet, aber in der Legende nicht sichtbar, weil die Gruppe zugeklappt ist.

showclasses

Speichert benutzerbezogen, ob die Classes des Layers ein- oder ausgeblendet sind.

logconsume

  • "0" = Layer wird nicht geloggt.
  • "1" = Layer wird innerhalb der Stelle für den bestimmten Nutzer geloggt. Z.B. für User Müller innerhalb der Gemeinde xy für den Layer Flurstücke.

Damit die Protokollierung erfolgt, muss entweder in der Tabelle stelle oder in der Tabelle layer oder in der Tabelle used_layer das Feld "logconsume" = "1" gesetzt sein.

Tabelle "u_styles2classes"

Da mehrere Styles zu einer Class gehören können, wird die Zuordnung des jeweiligen Styles in einer eigenen Tabelle vorgenommen.

class_id

Die entsprechende ID aus der Tabelle "classes".

style_id

Die entsprechende ID aus der Tabelle "styles".

drawingorder

Legt die Zeichnungsreihenfolge der Styles fest, wenn (z.B. bei komplexeren Linienausgestaltungen) mehrere Styles in einer Class enthalten sind.

Referenz zur PostGIS-Datenbank von kvwmap

Tabelle "spatial_ref_sys_alias"

In dieser Tabelle können den verwendeten Koordinatenreferenzsystemen Aliasnamen, räumliche Geltungsbereiche und das System beschreibende Datums- und Projektionsparameter zugeordnet werden. Die Datums- und Projektionsparameter werden verwendet, um bei Shape-Dateien das verwendete Koordinatenreferenzsystem aus der prj-Datei zu ermitteln.

srid

Der EPSG-Code des Koordinatenreferenzsystems. Primärschlüssel.

alias

Der Aliasname, der für die Bezeichnung des Systems verwendet werden soll.

minx

Rechtswert der linken unteren Ecke des räumlichen Geltungsbereichs.

miny

Hochwert der linken unteren Ecke des räumlichen Geltungsbereichs.

maxx

Rechtswert der rechten oberen Ecke des räumlichen Geltungsbereichs.

maxy

Hochwert der rechten oberen Ecke des räumlichen Geltungsbereichs.

datum

Mehrere Varianten der Bezeichnung des Datums als Array.

projection

Mehrere Varianten der Bezeichnung der Projektion als Array.

false_easting

Additionskonstante zum Rechtswert bezogen auf den Mittelmeridian.

central_meridian

Die geographische Länge des Mittelmeridians.

scale_factor

Maßstabsfaktor für die Projektion.

unit

Mehrere Varianten der Bezeichnung der Einheit als Array.

API Doc

Automatisierte Dokumentation der Klassen und dessen Funktionen aus Kommentaren im Quelltext

Ich habe mal einen ersten Versuch unternommen mit PHPDoc eine Referenzdokumentation zu allen in kvwmap vorhandenen Klassen zu erstellen. Das Resultat liefert zwar schon alle Klassen und dazugehörigen Funktionen und Parameter, aber ist noch weitestgehend ohne zusätzliche Beschreibung. Die Dokumentation im Quellcode kann aber nach und nach so angepasst und erweitert werden, dass daraus eine passable API Doc wird. Für die Funktion loadMap habe ich das mal beispielhaft gemacht. Es bedarf wirklich nur ein paar formatierter Zeilen Kommentar, die so aussehen:

/**
* Laden der Daten für das Map-Objekt aus Variablen, der Datenbank und/oder einer Map-Datei.
* 
* Diese Funktion ließt die Werte, die notwendig sind um die Karte zu konfigurieren. Die Quellen werden in Abhängigkeit vom Parameter $loadMapSource aus Variablen, aus einer Datenbank oder aus einem MapFile
* 
* Reihenfolge: Übersichtssatz - Kommentar - Tags.
* 
* @param  string	$loadMapSource Art der Quelle, aus der die Werte für das Map-Objekt gelesen werden sollen
*                 Mögliche Werte zur Zeit:
*                 Post: Werte werden aus Variablen gelesen, die über Post mitgeschickt wurden
*                        Dabei werden einige defaultmäßig zu setzende Parameter aus dem angegebenen MapFile gelesen.
*                 File: Die Werte für das Map-Objekt werden aus einer Map-Datei gelesen
*                 DataBase: Dies ist der Standardfall. Die Werte für das Map-Objekt werden aus der Datenbank gelesen.
* @return boolean	liefert derzeit immer true zurück.
* @see    db_mapObj(), $map
*/

Die Kommentare finden sich dann dirket in der Dokulmentation wieder, siehe [3]. Um nach einer Änderung eine aktuelle API Doc zu erstellen muss man nur den Link [4] aufrufen. Alle Dokumentationsdateien werden daraufhin in ca. 8 Sekunden neu erstellt.

API Daten

Liste der Parameter zur Abfrage und Bearbeitung von Daten. Begriffe in spitzen Klammern sind als variabel zu betrachten.

Geodaten (PostGIS Datenbank)

Sachdatensuche

Case:

  • go = Layer-Suche

Parameter:

  • selected_layer_id = <Id des Layers in dem gesucht werden soll>

Controller:

  • GUI->GenerischeSuche()

View:

  • layouts/snippets/generic_search.php
  • layouts/snippets/generic_search_mask.php

Beispiel: index.php?go=Layer-Suche&selected_layer_id=49

Sachdatenanzeige

Case:

  • go = Layer-Suche_Suchen

Parameter:

  • selected_layer_id = <Id des Layers in dem gesucht wird>
  • value_<Attributname> = <Wert des Attributes mit dem Namen Attributname, nach dem gesucht wird z.B. id>
  • operator_<Attributname> = <Operator, der den Wert mit dem Attribut verbindet

Controller:

  • GUI->GenerischeSuche_Suchen()

View:

  • layouts/snippets/sachdatenanzeige.php
  • layouts/snippets/sachdatenanzeige_embedded
  • layouts/snippets/embedded_subformPK.php

Beispiel: index.php?go=Layer-Suche_Suchen&selected_layer_id=49&value_name=Naturschutzgebiete&operator_name==

Neuen Datensatz Anlegen (Eingabeformular)

Case:

  • go = neuer_Layer_Datensatz

Controller:

  • $GUI->neuer_Layer_Datensatz()

View: generic_layer_editor_2.php oder eine in used_layer gesetzte Template-Datei.

Neuen Datensatz Speichern

Case:

  • go = neuer_Layer_Datensatz_speichern

Controller:

  • $GUI->neuer_Layer_Datensatz_speichern()

Nach einem Validierungsfehler weiter mit

  • $GUI->neuer_Layer_Datensatz()

Nach dem Speichern je nach Parameter weiter_erfassen weiter mit

  • $GUI->neuer_Layer_Datensatz(), zum Eingabeformular oder
  • $GUI->GenerischeSuche_Suchen(), zur Sachdatenanzeige

Sachdaten Speichern (Update)

Case:

  • go = Sachdaten_speichern

Parameter:

  • form_field_names = <layer_id>;<attribut_name>;<table_name>;<oid>;<formtyp>;1;<datentyp>;|...

Controller:

  • $GUI->sachdaten_speichern()

Beispiel:

index.php?go=Sachdaten_speichern&form_field_names = 10;id;shapefiles;920233;Text;1;int4|10;filename;shapefiles;920233;Text;1;varchar| 10;epsg_code;shapefiles;920233;Text;1;int4| 10;datatype;shapefiles;920233;Text;1;int2| 10;layer_id;shapefiles;920233;Text;1;int4| 10;stelle_id;shapefiles;920233;StelleID;1;int4| 10;konvertierung_id;shapefiles;920233;Text;1;int4| 10;bezeichnung;konvertierungen;;Text;1;varchar| 10;zurueck;;;dynamicLink;;|

Dokument Löschen (in Sachdatenanzeige)

Case:

  • go = Dokument_Loeschen

Parameter:

  • document_attributename = <layer_id>;<attribut_name>;<table_name>;<oid>;Dokument;1;varchar

Controller:

  • $GUI->sachdaten_speichern()

Kartenkonfiguration (MySQL Datenbank)

Layer Löschen

  • go=Layer_Löschen
  • selected_layer_id = <Id des Layers der gelöscht werden soll>

Beispiel: index.php?go=Layer_Löschen&selected_layer_id=49

Attributeditor

Öffnet den Attributeditor und wenn selected_layer_id angegeben ist für den ausgewählten Layer.

  • Case: go=Attributeditor
  • Parameter: selected_layer_id = <Id des Layers dessen Attribute angezeigt werden sollen>
  • Controller: GUI->Attributeditor()
  • View: layouts/snippets/attribut_editor.php

Beispiel: index.php?go=Attributeditor&selected_layer_id=782 Identische mit go=Layereditor_erweiterte Einstellungen

Benutzung von kvwmap

Stelle Wählen

siehe Nutzer-Dokumentation

Drucken in PDF

Um in einer Stelle in PDF drucken zu können, muss der Administrator vorher einen Menüpunkt sowie einen oder mehrere zur Auswahl stehende Kartendruck-Layouts eingerichtet haben. Das Erstellen der Kartendruck-Layouts erfolgt im Kartendruck-Layouteditor (go=Druckrahmen). Jedes Kartendruck-Layout kann in beliebig vielen Stellen verwendet werden.

Der Druck erfolgt über die Druckausschnittswahl (go=Druckausschnittswahl). Hier ist zunächst der aktuelle Kartenausschnitt mit den üblichen Navigationswerkzeugen zu sehen. Über die Themenauswahl können auch hier Themen ein- oder ausgeschaltet werden. Zusätzlich stehen ein Eingabefeld zur Angabe des gewünschten Druckmaßstabes und ein Auswahlfeld zur Auswahl des gewünschten Kartendruck-Layouts zur Verfügung. Es kann auch der aktuelle Kartenmaßstab am Bildschirm als Druckmaßstab gewählt werden, dafür gibt es eine Schaltfläche Kartenmaßstab übernehmen. In der Karte kann der gewünschte Druckausschnitt gewählt werden, der in das PDF exportiert werden soll. Dafür gibt es die Schaltfläche Druckausschnitt setzen. Der Druckausschnitt wird per Klick in die Karte gesetzt. Der Klick bestimmt den Mittelpunkt des Druckausschnitts. Wiederholte Klicks verschieben den Druckausschnitt. Ist der Kartenausschnitt zu klein bzw. zu groß, muss der Druckmaßstab entsprechend angepasst werden.

Unterhalb der Karte kann ein Drehwinkel für den Druckausschnitt eingegeben werden. Außerdem können Lage und Größe des aktuell gesetzten Druckausschnitts (nicht aber die gerade angeschalteten Themen oder das gerade gewählte Kartendruck-Layout) gespeichert werden.

Hat der Druckausschnitt das richtige Kartendruck-Layout, die gewünschte Position und die gewünschte Größe, kann das PDF durch Klick auf Drucken direkt erzeugt und anschließend gespeichert oder ausgedruckt werden.

Beim Klick auf Vorschau gelangt man zu einer Druck-Voransicht, die das spätere PDF-Dokument, d.h. den Kartenausschnitt plus das gewählte Kartendruck-Layout, am Bildschirm anzeigt. Hier kann man beispielsweise überprüfen, ob alle benötigten Kartenelemente zu erkennen sind. Sind im Kartendruck-Layouteditor für dieses Kartendruck-Layout variable Freitexte erlaubt werden, kann der Bearbeiter einen oder mehrere sog. Freitexte beliebig positionieren, beliebig mit Text füllen und beliebig in Größe und Form ändern.

Ist die Druckvorschau nicht zufriedenstellend, gelangt man durch Klick auf 'zurück' wieder zur Druckausschnittswahl und kann die Einstellungen anpassen. Ist die Vorschau in Ordnung, kann man durch Klick auf Drucken das PDF erzeugen.

Es ist möglich, den Druck zu kacheln, das heißt, Druckausschnitte exakt neben- bzw. untereinander zu positionieren. Hat man einen PDF-Ausdruck via Drucken erstellt, kehrt man über zurück zum Druckausschnitt zur Auswahl der Druckausschnitts zurück. Der Druckausschnitt ist in der Karte noch positioniert. Wenn man mit dem Cursor über eine der 4 Kanten des Druckausschnitts fährt, erscheint ein kleines Dreieck. Ein Klick auf dieses Dreieck verschiebt den Druckausschnitt so, dass der neue Ausschnitt an dieser Kante exakt neben bzw. unter oder über dem vorherigen Ausschnitt positioniert wird.

Metadaten

Eingabe

Zur Erfassung von Metadaten wird zunächst der entsprechende Menüpunkt ausgewählt. Zur Einbindung des Menüpunktes siehe Menüverwaltung. Der Linke auf diesen Anwendungsfall lautet index.php?go=Metadateneingabe.

Das Eingabeformular für die Metadaten enthält gemäß ISO 19119 für Servicemetadaten einige Pflichtangaben und einige optionale. Die Pflichtangaben sind durch * gekennzeichnet, siehe Bild:Metadateneingabe.png. Je nachdem was man beschreiben möchte wählt man die Art der Metadaten aus. Die Id des Metadatensatzes wird vorgegeben. Vorgegeben werden auch die Auswahlmöglichkeiten für die Kategorie und Schlagwörter. Wenn die Listen angepasst werden sollen, muss dies im Snippets "metadateneingabeformular.php" bzw. in der Tabelle md_keywords durch einen Administrator erfolgen.

Um das Umschließende Rechteck zu ermitteln kann man in der Karte ein Rechteckaufziehen und den Button "Box aus Karte" wählen. Die Koordinaten werden in die Textfelder übernommen.

Einige Metadaten gelten nur für Services, Datensätze oder Applikationen und müssen nur bei Bedarf ausgefüllt werden.

Nach dem Senden des Metadatendokumentes wird geprüft ob alle Pflichtfelder ausgefüllt wurden. Wenn die Speicherung erfolgte, werden die Angaben für eine nächste Eingabe übernommen. Das entsprechende Auswahlfeld neben dem Zurücksenden Button sorgt dafür, dass nach dem Senden mehr Infos zu Metadaten angezeigt werden, z.B. die Bezeichnungen der Metadatenelemente im Standard oder sonsotige Hinweise.

Alle eingegebenen Daten werden in die Tabelle md_metadata gespeichert. Die Zuordnung zwischen den Schlagwörtern und dem Metadatendokument erfolgt über die Tabelle md_keywords2metadata.

Suche

Nach Metadaten kann entweder über ein spezielles Suchfenster gesucht werden oder über die normale Sachdatenabfrage im Kartenfenster. Bei letzerer Variante muss jedoch ein Layer für die Metadatenboxanzeige angelegt und der Stelle zugewiesen worden sein, siehe Abschnitt Layer.

Für das Suchen über das Suchfenster nutzt man den Menüpunkt "Suchen" Unterpunkt "Metadaten". Wenn dieser noch nicht eingerichtet ist, muss das vorher durch einen Administrator erfolgen. Der Link auf den Anwendungsfall lautet:index.php?go=Metadaten_Auswaehlen, siehe Abschnitt: Menü. Das Suchformular ist einfach gehalten. Es kann nach dem Was, Wo, Wer und Wann gesucht werden. Die Suche wird in den entsprechenden Metadatenelementen räumlich, thematisch und/oder zeitlich vorgenommen. Zur räumlichen Auswahl kann auch hier wieder ein Rechteck in der Karte gezeichnet werden und mit "Box aus Karte" in die Formularfelder übernommen werden, siehe Bild:Metadatensuche.png.

Das Suchergebnis besteht aus einer Trefferliste mit verkürzten Informationen zu dem Metadatensatz, siehe Bild:Metadatenergebnis.png. Ein Link führt auf die Detailanzeige, siehe Bild:Metadatendetailansicht.png und ein Link zur Bearbeitung des Datensatzes, wie im Eingabeformular.

Anzeige

Die Anzeige der Metadaten erfolgt nach der Suche über das spezielle Suchformular oder nach der Sachdatenabfrage über die Karte. Da wie bei allen Layern das Template für die Sachdatenanzeige frei gewählt werden kann, ist es möglich, dass ein Administrator auch ein anderes Layout für die Anzeige der Metadaten wählt, als standardmäßig vom GLE erzeugt wird. Bei Metadaten ist es z.B. genau das selbe Template zu verwenden, wie es auch für die Trefferlistenanzeige verwendet wird. Dazu ist das Template "Metadaten.php" in den stellenbezogenen Layereigenschaften einzutragen.

Layer aus Mapdatei laden

Über die Funktion "Layer aus Mapdatei laden" (go-Variable: layerfrommapfile) hat man die Möglichkeit Mapdateien einzulesen und die darin enthaltenen Layer-, Klassen-, Styles- und Labels in die MySQL-DB zu speichern.

Layerfrommapfile.jpg

Man kann entweder eine einzelne Mapdatei hochladen oder eine gezippte Verzeichnisstruktur, in der die Fonts, Symbole usw. enthalten sind. Läd man eine Zip-Datei hoch, stehen alle in diesem Archiv vorhandenen Mapdateien für den Einlesevorgang zur Auswahl. Beim Einlesen der Mapdateien ist darauf zu achten, dass die Pfadangaben für das Fontset und das Symbolset in der Mapdatei stimmen. Ansonsten funktioniert der Einlesevorgang nämlich nicht.

Nachdem die ausgewählte Mapdatei eingelesen wurde, werden alle in ihr enthaltenen Layer nach Gruppen geordnet untereinander aufgelistet. Die Layer, die in der Mapdatei keiner Gruppe zugeordnet wurden, werden der Gruppe "Gruppe1" zugeordnet. Hinter jedem Layer gibt es eine Checkbox, über die man festlegen kann, ob der jeweilige Layer in die Datenbank gespeichert werden soll. Zusätzlich kann hier noch ausgewählt werden, ob das Font- und Symbolset um die zusätzlichen Fonts bzw. Symbole erweitert werden soll. Bei Auswahl der Fontseterweiterung werden außerdem noch die neuen Fonts in den Fontordner kopiert. Hierbei ist jedoch darauf zu achten, dass keine vorhandenen Symbole oder Fonts überschrieben werden. Daher empfiehlt es sich, diese beiden Anpassungen von Hand zu machen.

Nach Auswahl der gewünschten Layer klickt man auf "Layer hinzufügen" und die entsprechenden Layer werden in die Datenbank geschrieben. Nach erfolgter Speicherung der Layer wird ausgegeben, wieviele Gruppen, Layer, Klassen, Styles und Labels in die Datenbank eingefügt wurden.

ALB-Änderung

  • Zum Einlesen von ALB Daten aus WLDGE-Dateien gibt es verschiedene Möglichkeiten. Zum einen können eine oder mehrere Grunddatenbestände und zum anderen Fortführungsdateien eingelesen werden.(siehe Abbildung)
  • Der Anwendungsfall für die ALB-Änderungen nennt sich: ALB_Aenderung
  • Wer also die ALB-Änderung in einen Menüpunkt einbinden möchte (Wenn noch nicht geschehen) sollte in der Tabelle u_menues in der Spalte links "index.php?go=ALB_Aenderung" eintragen.
  • Nach Auswahl des Menüpunktes erscheint ein Formular zum Auswählen der WLDGE-Datei. Wenn die Datei schon auf dem Server liegt, geben Sie den Pfad und den Dateinamen im ersten Formularfeld an, ansonsten wählen Sie eine Datei von Ihrem lokalen Rechner zum hochladen aus.
  • Dann wählen Sie über den Radiobutton aus ob es sich um eine Fortführung oder einen Grundbestand handelt aus.
  • Wählen Sie in welche Datenbank die Daten sollen. Empfohlen wird PostgreSQL, weil da auch die ALK-Daten sind und die ALB-Daten sonst nicht mit ALK genutzt werden können. Nur wer seine ALK-Datein in MySQL hat und die ALB-Daten auch darein haben möchte sollte MySQL wählen. Die Unterstützung für das Speichern unter MySQL läuft aber aus. Mittelfristig sollen alle GIS-Daten, wozu auch die ALB-Daten zählen in die PostgreSQL Datenbank. Der Knopf MySQL wird also bald verschwinden.

Wldgeauswaehlen.png

  • Wenn nicht direkt in die Datenbank geschrieben werden soll, sondern nur die Logdatei angelegt werden soll mit den SQL-Statements zum Einlesen der ALB Daten, kann als nächstes die Checkbox ausgewählt werden.
  • Die Checkbox "Datenbank vorher leeren" darf nur ausgewählt werden, wenn die allererste Grundbestandsdatei eingelesen wird. Wenn mehrere Grundbestandsdateien eingelesen werden nur bei der ersten diesen Haken setzen.
  • "Ohne Transaktion" sollte nur gewählt werden, wenn es sich um sehr große Dateien handelt, man das Einlesen testen möchte oder das Schreiben in die Datenbank sowieso unterdrückt hat. Die SQL-Befehle für den Begin der Transaktion wird dann auch nicht in die Logfiles geschrieben. Die Ausführung der SQL in einer Transaktion beim späteren Einlesen obliegt dann also dem Nutzer.
  • Die Prüfung der WLDGE Kopfzeilen kann unterdrückt werden, wenn Fortführungen ohne Kopfzeilen oder mit falschen Datumsangaben eingelesen werden sollen. Geprüft wird:
- Ob die Datei mit der richtigen Dateikennung beginnt (1).
- Ob bei einer Fortführung die Fortführungsart S enthalten ist.
- Ob die Druckauftragsart 11 (Ausgabe mit Entschlüsselung) ist.
- Ob die Dateikennungen 1.E.20 und 1.E.30 bei Fortführungen existieren.
- Ob die Kennung der Erstabgabe L ist.
- Ob das Datum der Grundausstattung ein gültiges ist.
- Ob das Datum der Grundausstattung in der WLDGE Datei in der Datenbank vorkommt
- Ob die Datumsangaben für den Zeitraum einer Fortführung gültig sind.
- Ob das Anfangsdatum der Fortführung mit dem Enddatum der letzten Fortführung bereinstimmt.
  • Letztlich kann noch gewählt werden ob die SQL-Statements in eine Logdatei geschrieben werden sollen oder nicht. Die Logdateien werden in den Pfad geschrieben, der in der Konstante:LOGPATH aus der Datei config.php angegeben ist.
  • Die Namen der Logdateien der Grundbestandsdateien setzen sich wie folgt zusammen:
WLDGE_Dump_<Datenbank>_<Datumsstempel>.sql
  • Die Namen der Fortführungen:
WLDGE_update_Dump_<Datenbank>_<Datumsstempel>.sql
  • Nach dem Anklicken des Buttons Abschicken wird die Datei geprüft, eingelesen und die entsprechenden Tabellen in der Datenbank aktualisiert.

ALK-Aktualisieren

Mit Shapefiles

  • Menüpunkt Fortführung Unterpunkt ALK_Änderung ausführen.
  • Die Shape-Dateien ALK_Flurstuecke, ALK_Gebaeude, ALK_Nutzungen und ALK_Ausgest im Verzeichnis data/ werden eingelesen und die dazugehörigen Tabellen in der Datenbank aktualisiert.
  • Die Fortführung erfolgt im Moment nur komplett über den gesamten Datenbestand im Shape-Format.

Mit EDBS-Dateien (BZSN)

  • Die Postgres-Datenbank mit PostGIS-Unterstützung muss vorhanden sein. Der Konverter EDBS2WKT muss auf einem Windows-Rechner installiert sein und eine ODBC-Verbindung zum Datenbankserver existieren. Die ALK-Tabellen müssen mit EDBS2WKT angelegt werden.
  • Dann kann das Einlesen der EDBS-Dateien über EDBS2WKT erfolgen.
  • Es kann sein, dass die Dateien noch vom UNIX Textformat in PC-Format geändert werden müssen. Dazu kann das Tool UnixToWin verwendet werden. Zu finden unter: http://62.153.231.87/alb/daten/UnixToWin.exe

WMS-Konformität

Kvwmap kann auf zwei Arten als WMS konformer MapServer eingesetzt werden.

1. über CGI Dazu produziert kvwmap „Mapfiles“ mit entsprechenden Metadaten (siehe MapServer WMS Server HOWTO).

Den Speicherort für Mapdateien stellen Sie über die Konstante WMS_MAPFILE_Path ein.

Wenn Sie eine WMS konforme Map-Datei erstellen wollen, klicken auf den Menüpunkt WMS-Export und geben dort den Namen der Datei (z.B. wms_test.map) an. In dieser Datei wird dann der zuletzt angezeigte Zustand der kvwmap Kartenansicht abgelegt und ist für die Nutzung in einem Web Map Service nutzbar. Die Map-Datei enthält alle Metadaten, die für den getCapabilities Request erforderlich sind.

Die Map-Datei sollte in einem WWW-Verzeichnis stehen, z.B. /meinwwwroot/WMS. Dieses Verzeichnis muss wwwrun gehören.

Auf diese Map-Datei kann dann wie folgt zugegriffen werden.

getCapabilities-Request

http...://www.myserver.de/cgi-bin/mapserv?map=/mywwwroot/WMS/wms_test.map
&request=getcapabilities&service=wms&version=1.1.0

In dem vom MapServer geliefertem XML-Dokument sind die verfügbaren Layer aufgelistet. Diese können dann im getMap-Request zur Ansicht gebracht werden.

getMap-Request

http...://www.myserver.de/cgi-bin/mapserv?map=/mywwwroot/WMS/wms_test.map&service=wms
&request=getmap&version=1.1.0&layers=Landkreis,Gemeinde,Gemarkung,LSG& Height=500&width=500

2. über kvwmap selbst

Dazu wird direkt kvwmap aufgerufen mit dem Anwendungsfall go=OWS. Genau wie beim normalen Aufruf der Anwendung muß sich der Nutzer auch hier beim ersten Mal authentifizieren. Dann stehen alle Layer des Nutzers in der aktuellen (letzten) Stelle als WMS zur Verfügung.

Hinter dem Parameter go können dann alle WMS konformen Anfrageparameter angehängt werden, für alle Requestarten. Um auch auf die Layer einer anderen Stelle des Nutzers zugreifen zu können, läßt sich der Parameter Stelle_ID angeben.

Im Beispiel ist ein getCapabilities Aufruf dargestellt.

http...://www.server.de/kvwmap/index.php?go=OWS&request=getCapabilities&service=wms&version=1.1.0&Stelle_ID=1

Existiert eine Stelle nicht oder jemand versucht auf eine falsche Stelle zuzugreifen, für die keine Berechtigung vorliegt wird folgende Exception zurückgeliefert:

OWSServiceException.png

ESRI-Shape Import

Der Import von Shape Dateien in die PostGIS Datenbank wird mit dem Anwendungsfall: go=SHP_Import gestartet.

Oberfläche zum Hochladen der Shape Dateien

Die zur Shape-Datei gehörenden Dateien (shp, shx und dbf und optional prj) müssen als ZIP-Datei gepackt auf den Server hochgeladen werden. Anschließend können die Einstellungen für den Import vorgenommen werden.

Einstellungen zum Import von Shape Dateien

Zunächst muss angegeben werden, in welches Schema und in welche Tabelle die Daten importiert werden sollen. Wenn eine prj-Datei vorhanden ist, wird versucht, das Koordinatenreferenzsystem aus ihr zu ermitteln. Ansonsten muss er von Hand eingetragen werden.

Außerdem kann ausgewählt werden, ob die Daten in eine neue Tabelle eingefügt werden, eine vorhandene Tabelle überschrieben werden soll oder die Daten an eine vorhandene Tabelle angehängt werden sollen.

Die Zuordnung zwischen den Attributen in der dbf-Tabelle und der Tabelle in der Datenbank kann folgendermaßen erfolgen. Das Entfernen des Häkchens aus der Checkbox bedeutet, dass das Attribut nicht übernommen wird. Wenn ein Attribut einen anderen Namen in der DB-Tabelle bekommen soll oder schon hat, kann der dieser hier angegeben werden.

Weitere Hilfe

Unter der Rubrik Foren in der Menüleiste links finden Sie weitere Hilfe. Unter anderem befindet sich dort ein Bug-Report, eine Liste mit HowTo und eine allgemeine Fragen-Liste zu kvwmap.

Viele Einträge sind von Nutzern selber gemacht worden. Scheuen Sie sich also nicht hier im Wiki auch zur Dokumentation von kvwmap beizutragen.