Datenschutzhinweis

 

Beim Laden dieses Inhalts werden Nutzungsinformationen an Vimeo übertragen und dort ggf. verarbeitet.

 

             

Formular-Widget: Kartenanbindung

Geändert am Mi, 24 Apr um 2:30 NACHMITTAGS

Bei der Nutzung von Kartenmaterial ist unbedingt auf die Nutzungsbedingungen des Kartenanbieters zu achten! Zu Demonstrationszwecken wird Kartenmaterial von https://tile.openstreetmap.org verwendet, siehe http://www.openstreetmap.org/copyright. 


Als Default zeigt das Widget Kartenmaterial von Open-Street-Maps an. Es muss geprüft werden, ob dies in der Webseite mit Datenschutzverordnungen konform ist. Alternativ erlaubt das Widget auch die Verwendung eines eigenen Kartendiensts.


Das Karten-Widget fügt ein neues Formularelement zum Formular-Designer hinzu. Es zeigt dem Formularausfüller eine interaktive Karte an, wo dieser eine bestimmte Geometrie auswählen kann: entweder mehrere Punkte, eine Linie oder eine Fläche. Die ausgewählte Geometrie wird beim Absenden des Formulars übertragen und wieder angezeigt, wenn das Formular wieder geöffnet wurde.


Ob Punkte, eine Linie oder eine Fläche ausgewählt werden darf, lässt sich im Formular-Designer festlegen. Es ist auch möglich, dass Karten-Widget so zu konfigurieren, dass nichts ausgewählt werden kann, wenn man etwa nur eine Karte in das Formular einfügen möchte. Zudem kann im Formular-Designer eingstellt werden, welche Position initial angezeigt wird und in welcher Zoom-Stufe die Karte dargestellt wird.


Verschiedenes Kartenmaterial lässt sich durch Anbindung von Online-Kartendiensten einbinden. Das Widget unterstützt hierfür die häufig verwendeten Schnittstellen WMTS, WMS und TMS.


Inhalt



Das Karten-Widget erlaubt es Nutzern, auf einer Landkarte Punkte, Linien, oder Flächen auszuwählen.


Eigenschaften

Am Karten-Widget können einige Einstellungen vorgenommen werden, um das die Kartendarstellung und das Layout anzupassen sowie um das angezeigte Kartenmaterial zu konfigurieren.



Konfiguration der Karte. Hier kann eingestellt werden, welcher Kartenabschnitt angezeigt wird und welche Geometrie ausgewählt werden darf. 
  • Breitengrad und Längengrad - Gibt die initiale Position an, die angezeigt wird, wenn noch keine Geometrie ausgewählt ist.
  • Zoom min, Zoom max. - Die minimale und maximale Zoomstufe, in der ein Nutzer die Karte betrachten kann.
  • Zoom initial - Initiale Zoomstufe, welche verwendet wird, wenn noch keine Geometrie ausgewählt wurde.
  • Punkte / Linie / Fläche auswählen - Gibt an, ob in der Karte Punkte, eine Linie oder eine Fläche ausgewählt werden darf. Mehrfachauswahl ist möglich, der Nutzer kann dann über Buttons links oben wählen, welche Art von Geometrie eingetragen werden soll. Ist keine der Geometrien erlaubt, kann nichts in der Karte eingetragen werden. Das kann etwa nützlich sein, wenn nur eine Karte zur Orientierung angezeigt werden soll.
  • Standort-Button: Wenn aktiviert, wird in der Karte ein Button angezeigt, mit dem der Nutzer seinen Standort ermitteln kann. Der Standort wird dann in der Karte eingetragen und die Karte so positioniert, dass man den Standort sehen kann.
  • Sofort ermitteln - Wenn aktiviert, wird der Standort des Nutzers sofort beim Aufruf des Formulars ermittelt. Dies wird nur getan, falls noch keine Geometrie ausgewählt ist und das Formular nicht im Postfach geöffnet wurde. Wir raten davon ab, diese Option zu verwenden, da der Nutzer dann sofort beim Öffnen des Formulars vom Browser um die Erlaubnis gebeten wird, seinen Standort preiszugeben. 
  • Eigene Karte - Erlaubt die Verwendung von eigenem Kartenmaterial, siehe den Abschnitt unten dazu. 



Es ist auch möglich, die Farben der Markierungen in der Karte anzupassen.
  • Punkte - Steuert die Farbe der tröpfchenförmigen Punktmarkierungen in der Karte.
  • Position - Steuert die Farbe des Markierungsymbols für die aktuelle Position des Nutzers.
  • Linie - Steuert die Farbe der Linie, wenn als Geometrie eine Linie ausgewählt wird.
  • Fläche: Rand - Steuert die Farbe des Randes einer Fläche, wenn als Geometrie eine Fläche ausgewählt wird.
  • Fläche: innen - Steuert die Farbe des Innenraums einer Fläche, wenn als Geometrie eine Fläche ausgewählt wird.


Eigenes Kartenmaterial

Es ist möglich, Kartenmaterial von externen Kartendiensten anzubinden. Aktuell werden hierfür die Standards WMTS, WMS und TMS unterstützt. Bei der Nutzung von Kartenmaterial ist unbedingt auf die Nutzungsbedingungen des Kartenanbieters zu achten! Im Formular-Designer ist das Eingabfeld Quellenlink dafür vorgesehen, eine entsprechende Angabe zum Anbieter des Kartenmaterials zu machen.


WMTS und TMS

TMS unterscheidet sich von WMTS nur dadurch, dass die y-Koordinate invertiert ist.



Anbindung eines WMTS-Kartendiensts über die entsprechende URL.


Kartendienste, welche WMTS oder TMS unterstützen, sind am einfachsten anzubinden. Hierzu muss nur die entsprechende URL hinterlegt werden. Die Platzhalter {x} (Breitengrad), {y} (Längengrad) und {z} (Zoom-Stufe) werden in der URL beim Abrufen der Kartendaten entsprechend ersetzt.


WMS

Die Anbindung von WMS ist etwas aufwendiger. Siehe hierzu auch WMS in Leaflet.


Viele der benötigten Informationen können über die Methode GetCapabilities direkt bei der WMS-Schnittstelle abgefragt werden.  Wenn die Basis-URL des Kartendiensts etwa https://webmap4.lroc.asu.edu/ lautet, dann kann dies über den Aufruf von https://webmap4.lroc.asu.edu/?request=GetCapabilities erfolgen. Hiermit erhält man eine XML-Datei mit der Beschreibung der Fähigkeiten des Kartendiensts.



Hier wird eine Karte vom Mond über WMS angebunden. Es werden 2 Layers geladen, ein Layer mit Bilddaten und 1 Layer mit der Beschriftung einiger markanter Punkte auf dem Mond.


  • Link - Hier muss die Basis-URL auf den WMS-Kartendienst hinterlegt werden.
  • Version - Die Version des  WMS-Diensts. Standard ist 1.1.1, was von den meisten Diensten unterstützt wird.
  • Koordinaten - Koordinatenreferenzsystem, welches bei der Abfrage an den Kartendienst verwendet wird. Die Auswahl hier ist egal, solange der Kartendienst das entsprechende System unterstützt. Das Koordinatenreferenzsystem (SRS - spatial reference system) findet sich in dem XML mit den Fähigkeiten des Kartendiensts im XML-Element <srs>.
  • Layers - Layers, welche in der Karte dargestellt werden, getrennt mit Komma. Ein häufiger Anwendungsfall ist etwa wie in der Abbildung zu sehen, einen Layer mit den Bilddaten und einen Layer mit der Beschriftung zu laden. Die unterstützten Layer finden sich in dem XML mit den Fähigkeiten des Kartendiensts im XML-Element <Layer>.
  • Separate Layer - Wenn deaktiviert: Der Kartendienst ist dafür verantwortlich, die einzelnen Layer zu einem Gesamtbild zusammenzufügen. Dies ist die empfohlene Einstellung, da der Kartendienst meist über Informationen verfügt, um die Darstellung zu verbessern. Wenn aktiviert: Die Layer werden separat beim Kartendienst abgefragt und dann übereinander geschichtet dargestellt.
  • Styles - Optional Angabe von Styles für die Bilddaten, falls der Kartendienst dies unterstützt.
  • Format - Bildformat der angefragten Kartendaten. Hier muss ein Wert eingetragen werden, welcher vom Kartendienst unterstützt wird. Die unterstützten Bildformate finden sich in dem XML mit den Fähigkeiten des Kartendiensts im XML-Element <Format>.
  • Parameter großschreiben - Wenn aktiviert, werden alle Parameter (wie etwa format=image/png oder version=1.1.1) beim Aufruf des Kartendiensts großgeschrieben. Muss aktiviert werden, wenn der Kartendienst dies erfordert.


Internationalisierung

Die Texte im Formular können über die I18N-Variablen im Backend geändert werden. So ist es auch möglich, weitere Sprachen zu unterstützen, für die im Plugin keine Übersetzungen hinterlegt sind. Die Schlüssel der I18N-Variablen mit den Standardwerten lauten wie folgt:

  • mapActionLocate - Aktuelle Position in der Karte anzeigen
  • mapActionSelectArea - Eine Fläche in der Karte auswählen
  • mapActionSelectLine - Eine Linie in der Karte auswählen
  • mapActionSelectPoints - Punkte in der Karte auswählen
  • mapActionReset - Ausgewählte Punkte zurücksetzen
  • mapActionUserPosition - Ihr Standort ist hier
  • mapActionZoomIn - Vergrößern
  • mapActionZoomOut - Verkleinern


JavaScript-API

Für fortgeschrittene Anwendungsfälle lässt sich das Karten-Widget auch per JavaScript ansteuern und beeinflussen. Den Einstiegspunkt hierzu stellt das globale Objekt $.xutil.xMapApi dar.


Einige Beispiele dazu:

// Die ausgewählte Geometrie ermitteln
$.xutil.xMapApi.instance("[data-name=map1]").selectedGeometry()

// Die ausgewählte Geometrie auf einen anderen Wert setzen
$.xutil.xMapApi.instance("[data-name=map1]").selectGeometry({
  type: "area",
  points: [
    {lat: 51.0916,lng: 13.7622},
    {lat: 51.0148, lng: 13.7375},
    {lat: 51.0593, lng: 13.8621}
  ],
})

// Den Quellen-Link rechts unten für eine bestimmte Karte entfernen
$.xutil.xMapApi.whenRendered("[data-org-name=map2]").then(api => api.leafletMap().attributionControl.remove())

// Den Quellen-Link rechts unten für alle Karten entfernen
$.xutil.xMapApi.addRenderedListener(api => api.leafletMap().attributionControl.remove())


Die gesamten verfügbaren Methoden sind derzeit wie folgt. $.xutil.xMapApi stellt den zentralen Einstiegspunkt dar und wird beschrieben durch das Interface IXMapApi. Dieses hat die folgende Definition:

/**
 * API entry point for the XMap widget. Provides methods to access particular
 * map widget instances.
 *
 * For example:
 *
 * If you want to get or set the value of a map widget:
 *
 * ```js
 * // Get the value
 * $.xutil.xMapApi.instance("[data-name=map1]").selectedGeometry()
 *
 * // Set the value
 * $.xutil.xMapApi.instance("[data-name=map1]").selectGeometry({
 * type: "area",
 * points: [{lat: 51.0916,lng: 13.7622}, {lat: 51.0148, lng: 13.7375}, {lat: 51.0593, lng: 13.8621}],
 * })
 * ```
 *
 * If you want to remove the attribution links at the bottom right corner:
 *
 * ```js
 * // For a specific map
 * $.xutil.xMapApi.whenRendered("[data-org-name=map2]")
 * .then(api => api.leafletMap().attributionControl.remove())
 *
 * // For all maps
 * $.xutil.xMapApi.addRenderedListener(api => api.leafletMap().attributionControl.remove())
 * ```
 */
interface IXMapApi {
  /**
   * Adds a listener that is called when a map widget was rendered. Once
   * the widget was rendered, the Leaflet instance can be accessed. This
   * method can be used for logic that should be applied to every map widget.
   *
   * A map widget is rendered only once it has become visible, to avoid UI bugs.
   *
   * If the map widget is already visible, the listener is called
   * immediately (but asynchronously).
   *
   * Each listener is called at most once, but may never be called when the widget
   * is not on the first page and the user navigates to the page with the widget.
   * @param listener Listener to call when the widget is rendered.
   */
  addRenderedListener: (listener: (widget: IXMapWidget) => void) => void;

  /**
   * Removes a listener that was added via {@link addRenderedListener}. The listener
   * will not be invoked anymore for any further widgets when they are rendered.
   * @param listener Listener to remove.
   */
  removeRenderedListener: (listener: (widget: IXMapWidget) => void) => void;

  /**
   * Gets the API for the given map widget from either the container element of a child
   * of the map.
   * @param mapElement A map widget element with the class `XMapContainer`; or
   * any child thereof. Can be a native HTMLElement, a list of HTMLElements, a
   * CSS selector, or a JQuery wrapper.
   * @throws When the given element is not an HTMLElement or not a map element.
   */
  instance: (mapElement: TElementSpecifier<HTMLElement>) => IXMapWidget;

  /**
   * Finds all map widget instances within the base element. If the base element is
   * a map widget instance or a child there of, that map widget is returned.
   * @param base Base element where to search to for map widgets. Can be a native
   * HTMLElement or list of HTMLElements, a CSS selector, or a JQuery wrapper.
   * @returns A list with all map widgets.
   */
  instances: (base?: TElementSpecifier<HTMLElement>) => IXMapWidget[];

  /**
   * Returns a promise that resolves when the given map widget was rendered
   * and the user can interact with it.
   *
   * A map widget is initialized when it is visible, to prevent UI bugs.
   *
   * Note: If the user never navigates to the page containing the map widget, the
   * returned promise may never be settled!
   *
   * Consider using {@link instance} if you just want to e.g. retrieve data from the map.
   * @param mapElement A map widget element with the class `XMapContainer`; or
   * any child thereof. Can be a native HTMLElement, a list of HTMLElements, a
   * CSS selector, or a JQuery wrapper.
   * @throws When the given element is not an HTMLElement or not a map element.
   */
  whenRendered: (
    mapElement: TElementSpecifier<HTMLElement>
  ) => Promise<IXMapWidget>;
}

/**
 * Wraps a particular map widget instance and provides methods for that map widget.
 *
 * Most methods work regardless of whether the map widget was already rendered. The
 * {@link leafletMap} will return undefined when the map widget was not rendered yet.
 */
interface IXMapWidget {
  /**
   * Gets the container element of this map widget.
   * @returns The container element of the map widget, with the class `XMapDiv`.
   */
  container: () => HTMLElement;

  /**
   * Clears the selected geometry, if any geometry was selected.
   * @param silent When `true`, do not fire any change or blur events
   * on the text area element. Defaults to `false`.
   */
  clear: (silent?: boolean) => void;

  /**
   * Whether the widget was already rendered. The widget is rendered only once it has become
   * visible. When the widget was not yet rendered, {@link getLeaflet} returns `undefined`.
   */
  rendered: () => boolean;

  /**
   * (Re-)renders the widget, if possible. A map widget can be rendered only
   * when it is visible, to prevent UI bugs.
   */
  renderIfPossible: () => void;

  /**
   * Gets the currently selected geometry.
   * @returns geometry The geometry currently shown on the map.
   */
  selectedGeometry: () => IXMapGeometry;

  /**
   * Sets the selected geometry to the given value.
   * @param geometry Geometry to show on the map.
   * @param silent When `true`, do not fire any change or blur events
   * on the text area element. Defaults to `false`.
   */
  selectGeometry: (geometry: IXMapGeometry, silent?: boolean) => void;

  /**
   * Queries the browser for the user's current location and adds a marker to
   * the map with the user's location.
   * @returns The position of the user.
   * @throws When the user's location could not be determined. May happen e.g.
   * when the browser does not support the geolocation feature or when the user
   * denied access to their location.
   */
  showGeoLocation: () => Promise<GeolocationPosition>;

  /**
   * Hides the location of the user, if previously shown by {@link showGeoLocation}.
   * When no geo location is currently visible, does nothing.
   */
  hideGeoLocation: () => void;

  /**
   * Gets the instance of the backing Leaflet widget. Can be used for advanced scripting.
   * Note that the leaflet is created only once the map has become visible. This method
   * returns `undefined` when no leaflet exists yet.
   * @returns The instance of the backing Leaflet widget. `undefined` if the map was
   * not rendered yet.
   */
  leafletMap: () => import("leaflet").Map | undefined;

  /**
   * Gets the instance of the backing Leaflet widget. Can be used for advanced scripting.
   * This returns a promise that resolves once the Leaflet widget was created. It is
   * created once the map element becomes visible. If the user never navigates to the
   * page with the widget, it may never become visible and consequently, the returned
   * promise may never be settled.
   * @returns The instance of the backing Leaflet widget.
   */
  waitForLeafletMap: () => Promise<import("leaflet").Map>;
}

/**
 * Describes the value (geometry) that can be selected by the map widget. Consists
 * of the type of the selected geometry (point, line, or area), and a list of points
 * for the geometry.
 */
interface IXMapGeometry {
  /**
   * The type of the geometry, either a point, line, or area.
   */
  readonly type: TGeometryType;

  /**
   * The points of the selected geometry. When the type is `line`,
   * the points are connected in order. When the type is `area`, the
   * points are the corner points of a polygon.
   */
  readonly points: LatLngLiteral[];
}

/**
 * The type of the geometry that can be selected.
 * - point Selects a set of disconnected points
 * - line Select a single line going through all points
 * - area Selects a polygon with the points as its corner points
 */
type TGeometryType = "point" | "line" | "area";

/**
 * A coordinate for a position on the surface of a spheroid object,
 * consisting of a latitude and longitude.
 */
interface LatLngLiteral {
  /** The latitude of the coordinate */
  lat: number;
  /** The longitude of the coordinate */
  lng: number;
}

/**
 * Union of types that can be interpreted as referencing to one or multiple
 * (DOM) elements.
 * - `undefined` and `null` are represent a missing element.
 * - `TElement` is the element itself.
 * - `TElement[]` is an array of elements.
 * - `NodeListOf<TElement>` is a list of elements, returned by
 * `querySelectorAll`.
 * - `HTMLCollectionOf<TElement>` is a collection of elements, returned by
 * `getElementsByClassName`.
 * - `string` is a CSS selector for the element(s).
 * - `JQuery` is a JQuery wrapper with the element(s).
 * @typeParam TElement - Type of the DOM element.
 * @returns A union type with various different types corresponding to an
 * element.
 */
type TElementSpecifier<TElement extends Element> =
  | undefined
  | null
  | TElement
  | TElement[]
  | (NodeList & NodeListOf<TElement>)
  | (HTMLCollection & HTMLCollectionOf<TElement>)
  | string
  | JQuery<TElement>;


War dieser Artikel hilfreich?

Das ist großartig!

Vielen Dank für das Feedback

Leider konnten wir nicht helfen

Vielen Dank für das Feedback

Wie können wir diesen Artikel verbessern?

Wählen Sie wenigstens einen der Gründe aus
CAPTCHA-Verifikation ist erforderlich.

Feedback gesendet

Wir wissen Ihre Bemühungen zu schätzen und werden versuchen, den Artikel zu korrigieren