Einfluß der Layerstruktur auf die Performance von MapGuide Open Source
Es gibt eine ganze Reihe von Möglichkeiten zur Beeinflussung der Performance von MapGuide Open Source (kurz MGOS genannt). Hier möchten wir darstellen, dass die Layerstruktur unter Umständen einen signifikanten Einfluss auf die Performance von MGOS bei der Kartendarstellung hat. Die nachfolgenden Aussagen gelten für Vektorlayer, die mittels FDO Interface aus Spatial Datenbanktabellen von PostGIS bzw. MySQL gespeist werden. Es ist allerdings anzunehmen, dass sich andere RDBMS (z.B. Oracle oder SQL Server) analog verhalten. Untersucht haben wir das Verhalten mit MGOS 2.5.1 und PostGIS 2 sowie MySQL 5.1.
Datenbank – Layer – Karte
In einer MapGuide Karte werden die einzelnen Layer zu einem Bild zusammengefasst. Die einzelnen Layer wiederum bilden Regeln, wie die Datenbank-Informationen dargestellt werden sollen. Beginnen wir am Beispiel einer Tabellendefinition in PostGIS.
CREATE TABLE katastertabelle
(
ltg_id serial NOT NULL,
ag_id integer,
ag_key character(20) DEFAULT NULL::bpchar,
ebene character varying(128) NOT NULL,
linetype character varying(45) NOT NULL DEFAULT ‚—‚::character varying,
constantwidth real NOT NULL DEFAULT (0)::real,
graphik geometry,
CONSTRAINT katastertabelle_pkey PRIMARY KEY (ltg_id)
);
CREATE INDEX grid_katleitung
ON katastertabelle
USING gist
(graphik);
Allein diese PostGIS Tabelle beinhaltet ca. 700.000 Datensätze eines Musterprojektes. In erster Linie handelt es sich dabei um LINESTRING-Elemente unterschiedlicher Länge, abgespeichert im Datenfeld graphik. Dass darauf ein Spatial Index sitzen sollte, bedarf sicher keiner weiteren Hervorhebung. Für unsere weiteren Betrachtungen ist außerdem das Datenfeld ebene von Interesse. Darin steht z.B. dass es sich um eine Autobahn, Eisenbahn, Grundstücksgrenze, Böschungsgrenze usw. handelt. Um das Beispiel überschaubar zu halten, beschränken wir uns auch nur auf die Auto- und Eisenbahnen.
Nun zur Layerdefinition in MGOS, die sich auf diese Tabelle bezieht. Die Autobahn soll aus naheliegenden Gründen in der Karte anders dargestellt werden, als die Eisenbahn. Dafür gibt es in MapGuide die Möglichkeit, verschiedene Layer auf der Grundlage von Filterbedingungen zu definieren. Hier kann man MapGuide Maestro, das Authoring Tool von MGOS verwenden und zwei Beispiellayer aufbauen. Im einfachsten Fall
<Filter>ebene = ‚Y-AUTOBAHN'</Filter>
um alle Datensätze für die Autobahn bzw.
<Filter>ebene = ‚Y-EISENBAHN'</Filter>
für die Eisenbahn zu selektieren. Darüber hinaus stellt Maestro uns Werkzeuge zur graphischen Gesteltung der Layer bereit (siehe Bild 1). Analog dazu könnte man weitere Layer definieren, für unser Beispiel genügen diese beiden aber schon. Diese werden in die Kartendefinitionübernommen. Damit weiß MGOS was(!!!) es sich zum Rendern alles aus der Datenbank holen soll (und wie es in der Karte darzustellen ist). Genau hier liegt die Optimierungsmöglichkeit. In unserem Beispiel stellt MGOS nämlich 2 Anfragen an die Datenbank. Einmal werden alle Objekte gesucht, deren Eigenschaft ebene = ‚Y-AUTOBAHN‘ ist. Ein Auszug aus der PostGIS Log-Datei zeigt, was gemeint ist:
SELECT H.“ltg_id“,H.“ag_id“,H.“ag_key“,H.“ebene“,H.“linetype“,H.“constantwidth“,H.“graphik“ FROM „public“.“katastertabelle“ H WHERE ( ( H.“ebene“ = ‚Y-AUTOBAHN‘ ) ) AND ( ( „graphik“ && ST_GeomFromWKB(decode(‚01030000000100000005000000225A4F7AEE3C43414F786BBBBCAF55410080BDFEC85E43414F786BBBBCAF55410080BDFEC85E4341AAC4C75776C05541225A4F7AEE3C4341AAC4C75776C05541225A4F7AEE3C43414F786BBBBCAF5541′,’hex‘), -1) ) )
und weiterhin erfolgt die Suche nach ebene = ‚Y-EISENBAHN‘
SELECT J.“ltg_id“,J.“ag_id“,J.“ag_key“,J.“ebene“,J.“linetype“,J.“constantwidth“,J.“graphik“ FROM „public“.“katastertabelle“ J WHERE ( ( J.“ebene“ = ‚Y-EISENBAHN‘ ) ) AND ( ( „graphik“ && ST_GeomFromWKB(decode(‚01030000000100000005000000225A4F7AEE3C43414F786BBBBCAF55410080BDFEC85E43414F786BBBBCAF55410080BDFEC85E4341AAC4C75776C05541225A4F7AEE3C4341AAC4C75776C05541225A4F7AEE3C43414F786BBBBCAF5541′,’hex‘), -1) ) )
Mehr Performance durch Kombination in einem Layer
Um (im Beispiel) eine solche Abfrage zu sparen bietet MapGuide Open Source die Möglichkeit, Filterbedingungen in einem Layer zu kombinieren. Also wieder für unser Beispiel:
<Filter>layer = ‚Y-EISENBAHN‘ OR layer = ‚Y-AUTOBAHN'</Filter>
Auf diese Weise beinhaltet der Layer alle Objekte mit der Eigenschaft ebene = ‚Y-EISENBAHN‘ und ebene = ‚Y-AUTOBAHN‘. Im Gegensatz dazu bestand der erste Ansatz in der Definition von zwei Layern. Um das Ergebnis in der Karte graphisch differenziert abzubilden, bietet MapGuide Maestro die Möglichkeit, Stilregeln zu kombinieren (siehe Bild 2). MGOS benötigt nun eine Datenbankanfrage weniger, um die Karte zu erzeugen, weil in einem Select nach beiden Filterkriterién gleichzeitig gesucht wird.
SELECT B.“ltg_id“,B.“ag_id“,B.“ag_key“,B.“ebene“,B.“linetype“,B.“constantwidth“,B.“graphik“ FROM „public“.“katastertabelle“ B WHERE ( ( B.“ebene“ = ‚Y-EISENBAHN‘ ) OR ( B.“ebene“ = ‚Y-AUTOBAHN‘ ) ) AND ( ( „graphik“ && ST_GeomFromWKB(decode(‚01030000000100000005000000225A4F7AEE3C43414F786BBBBCAF55410080BDFEC85E43414F786BBBBCAF55410080BDFEC85E4341AAC4C75776C05541225A4F7AEE3C4341AAC4C75776C05541225A4F7AEE3C43414F786BBBBCAF5541′,’hex‘), -1) ) )
In unserem Beispiel ist das natürlich unerheblich. In der Praxis allerdings lassen sich hier Performance Gewinne von 25% und mehr erreichen, da es sich schnell um mehrere hundert Layer handeln kann. Insbesondere bei kleinmaßstäbliche Darstellungen. Auf den Maßstabsbezug wird darum ausdrücklich hingewiesen, weil neben der Filterung nach der Ebene außerdem auch nach dem geometrischen Bereich gefiltert wird.
Fazit
Wo immer es möglich ist sollte versucht werden, lieber mit komplexen Layerdefinitionen zu arbeiten, statt viele einzelne Layer erst in der Kartendefinition zu kombinieren. Dem wird spätestens dadurch eine Grenze gesetzt, dass am Front End auch nur eine entsprechende Layerauswahl zu Verfügung steht. Auf unser Beispiel bezogen heißt das, Autobahnen und Eisenbahnen können nur zusammen ein- oder ausgeschaltet werden.
Für Rückfragen oder weitergehende Informationen stehen wir Ihnen gerne zur Verfügung!