"Klassifikationen"

Im "alten" Iwan existierte das Gespann aus Ilf und Iplax, die Ilf diente dabei der Klassifikation der Daten (Unique-Value, Range), die Symbolik wurde in der Iplax (Palette) definiert.

Vor allem Umsteiger müssen sich mit dem neuen Konzept vertraut machen.

Eine Klassifikation in diesem strikte Sinne ist nicht mehr direkt möglich. Vielmehr können für alle Symbole Blöcke definiert werden die über eine Expression verfügen können, welche die Sichtbarkeit steuert.

Optimierungen für Bedingungen

Die Flexibilität hat nat. ihren Preis bzgl. der Auswertungsgeschwindigkeit, kann aber bei Einsatz der entsprechenden Features optimiert werden. Um die Möglichkeiten zu verstehen, hier ein kurzer Abriß über den internen Ablauf.

  • alle Expressions der Blöcke im aktuellen Zeichenkontext betrachten, sind hierbei Ausdrücke enthalten die zu konstant "False" führen, werden diese Blöcke (und ggf. die Kindelemente) entfernt.

    • Konstant sind alle Ausdrücke, die keine Spalte aus der Datenquelle verwenden.
  • Prüfen, ob für alle zu zeichnenden Blöcke allow-query-optimize true ergibt, wenn dies der Fall ist, werden alle Bedingungen, soweit möglich, in SQL überführt und der Datenquelle (inkl. des obligatorischem BBox-Filters) übergeben

    • ob der Ausdruck in der Quelle ausgeführt werden kann, hängt u.a. von den dort verwendeten Funktionen und Kombinationen ab.

    • kommt kein Filter für die Quelle in Frage, werden alle durch die BBox betroffenen Daten abgerufen.

    Merke: Ein Filter auf die Datenquelle kann die Abfragen auch deutlich verlangsamen, sie sollte nur dann angewendet werden, wenn die Spalte über einen Index verfügt

  • Für jeden mit dem Schlüsselwort single-choice oder multi-choice definierten-Block wird versucht, aus den Bedingungen eine interne Lookup-Tabelle aufzubauen, mit dieser erfolgt dann eine direkte Auswahl des Blocks pro zu zeichnendem Datensatz

    • der Aufbau solcher Lookup-Tabelle ist möglich für:

      • einfache Bedingungen in der Form "Spalte = 'literal'" oder Spielarten davon ( IN oder OR ), wenn sofern für jeden dieser Ausdrücke die gleiche Spalte verwendet wird

      • einfache Bedingungen mit Vergleichs-Bereichen (Größer(gleich), Kleiner(gleich) - Vergleichen ("spalte > 5 and spalte < 10")

      Beides kann auch gemischt in einem choice Block vorkommen.

    Merke: Eine Lookup-Tabelle ist i.d.R. deutlich performanter als das zeilenweise Abarbeiten der Ausdrücke, ggf. ist das Anpassen der Ausdrücke sinnvoll.

  • Dann erfolgt der Datenabfruf, ggf. mit einem der oben definierten weiteren Filterangaben. Evtl. auch auf eine alternative Abfrage der Datenquelle für den aktuellen Maßstab, sofern definiert.

    Merke: Prüfe auch, ob ggf. diese Optimierung sinnvoll wäre.

  • Für jeden sich ergebenden Datensatz werden alle Zeichenvorgaben der definierten Blöcke angewandt, ausgenommen der mit single-choice bzw. multi-choice definierte Blöcke. Bei single-choice wird der erste übereinstimmende Block (anhand der definierten Bedingung) verwendet, dann wird direkt mit nächsten Datensatz fortgefahren. Bei multi-choice werden potentiell alle Blöcke deren Bedingung zutrifft durchgegangen. Der Abbruch erfolgt erst wenn etwas gezeichnet wurde.

    Merke: Verwende single-choice bzw. multi-choice wenn aus einer Liste von Blöcken maximal einer pro Datensatz gezeichnet werden soll.

Dieses Beispiel erfüllt alle o.g. Bedingungen, um sämtliche Optimierungen durchzuführen:

unordered {
	line {
		[mapscale > 10000] {
			single-choice  {     
				settings {
					allow-query-optimization: true;
				}       

				Hauptstraße1 [Geotyp == "HS"]{
					line-width: 2;
				}

				Landstraße1 [Geotyp == "LS"] {
					line-width: 5;
				}
			}
		}
	
		[mapscale <= 10000 ] {
			single-choice  {     
				settings {
					allow-query-optimization: false;
				}       

				Hauptstraße2 [Geotyp == "HS"]{
					line-width: 2;
				}

				Landstraße2 [Geotyp == "LS"] {
					line-width: 5;
				}
			
				Nebenstraße [Geotyp == "NS "] {
					line-width: 5;
				}

				Wege [Geotyp == "WG"] {
					line-width: 1;
				}
			}
		}
	}
}

Zuletzt geändert: 25.08.2018 12:17:51 (erstmals erstellt 09.08.2017)