Wege jenseits von Google Maps mit GeoTools und uDig - JAXenter

Wege jenseits von Google Maps mit GeoTools und uDig

Koordinatenreferenzsystem und Projektion

Features sind darstellungsfrei – hier erfolgt eine „Seperation of Concerns“ -, und für den Rendervorgang werden noch folgende Angaben benötigt:

  • Koordinatenreferenzsystem (CoordinateReferenceSystem)
  • Projektion (implizit durch das Koordinatenreferenzsystem bestimmt)
  • Ausschnitt (Envelope)
  • Darstellungsanleitung für die Features (Style)

Um sich vorläufig nicht mit geozentrischen und topozentrischen Koordinatensystemen, mit Geoiden und Projektionen aufzuhalten, sei an dieser Stelle das standardisierte Koordinatenreferenzsystem WGS84 empfohlen:

DefaultMapContext map = new DefaultMapContext(DefaultGeographicCRS.WGS84);

Mit WGS84 erhält man eine Projektion in einer quadratischen Plattkarte und Koordinatenangaben in Längengrad und Breitengrad. Als Vorteil von WGS84 ist die brauchbare Projektion sowie Referenzierung der gesamten Erde hervorzuheben, als Nachteil sei hingegen vor allem die starke Verzerrung in Richtung der Pole erwähnt – bereits Deutschland sieht etwas dicklich und gestaucht aus. Um mit einer möglichst unverzerrten Abbildung von Mitteleuropa zu arbeiten, sei auf WGS84 Zone 32N verwiesen, was jedoch die Koordinaten nicht in Längen- und Breitengrad, sondern in Metern zur Folge hat.

Styled Layer Descriptor (SLD)

Die visuelle Repräsentation eines Featuretypes wird mit einem Style-Objekt definiert. Hierbei kommt die Styled-Layer-Descriptor-(SLD-)Spezifikation zum Einsatz, gleichfalls entwickelt vom OGC. Mit SLD können neben einfachen Visualisierungsvorschriften, bei denen alle Features eines Typs identisch dargestellt werden, auch wesentlich komplexere Darstellungsregeln definiert werden. So ist es z.B. möglich, abhängig von einem Featureattribut, unterschiedliche Icons zu verwenden um den Status eines Objekts zu veranschaulichen.

GeoTools ermöglicht die Verwendung von vorliegenden SLD-XML-Dateien ebenso wie das programmatische Anlegen. Hierzu wurde das SLD-Objektmodell (Abb. 2) vollständig implementiert.

Abb. 2: SLD-Implementierung von GeoTools

Listing 2 beinhaltet das programmatische Anlegen eines Styles, konzipiert für Features mit einer Punktgeometrie. Neben dem PointSymbolizer, der in diesem Fall eine externe Bilddatei verwendet, wird ein TextSymbolizer verwendet, der den Inhalt des Featureattributs Name (Listing 1) unterhalb des Icons darstellt. Um in Abhängigkeit von einem zweiten Featureattribut (Status) unterschiedliche Icons darzustellen, werden entsprechend viele Styleregeln aufgestellt. Hierbei gilt: Jede Regel für sich greift nur dann, wenn die mit GeoTools-Filtern aufgebaute Bedingung stimmt. Die Mächtigkeit der zugrunde liegenden Konzepte und der Implementierung führen dabei zu einer gewissen Komplexität des Quellcodes.

Listing 2
StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(null);
// Die Liste aller Regeln welche für den Featuretype gelten soll
List rules = new ArrayList();
/* Angenommen es gibt n potentielle Zustände (states) und für jeden Zustand liegt ein entsprechendes Icon vor, das verwendet werden soll */
for (int i = 1; i  symbolizer = new ArrayList();
  // PointSymbolizer mit externer Graphik
  PointSymbolizer pointSymbolizer = styleFactory.createPointSymbolizer();
  ExternalGraphic[] icon = new ExternalGraphic[] {
    styleFactory.createExternalGraphic(new File("icon_" +i+ ".png").toURI().toURL(),"image/png")};
  int iconSize = 17;
  Graphic graphic = styleFactory.createGraphic(icon, null, null, filterFactory.literal(1), filterFactory.literal(iconSize), filterFactory.literal(0));
  pointSymbolizer.setGraphic(graphic);
  // Textsymbolizer für ein Attribut unterhalb des Icons
  double fontSize = 14;
  String fontName = "Arial";
  Font gtFont = styleFactory.createFont(filterFactory.literal(fontName), filterFactory.literal(Font.Style.NORMAL), filterFactory.literal(Font.Weight.BOLD), filterFactory.literal(fontSize));
  // Füllfarbe des Textsymbolizers
  Fill fill = styleFactory.createFill(filterFactory.literal("#000000"), filterFactory.literal(1));
  /* Labelplacement gibt Position des Textes im Verhältnis zum Icon an*/
  AnchorPoint ap = styleFactory.createAnchorPoint(filterFactory.literal(0.5), filterFactory.literal(0.0));
  Displacement dp = styleFactory.createDisplacement(filterFactory.literal(0.0), filterFactory.literal(-25));
  LabelPlacement placement = styleFactory.createPointPlacement(ap, dp, filterFactory.literal(0.0));
  /* Feature-Attributs welches als Text neben demi Icon angezeigt werden soll, hier 'Name' aus Listing 1 */
  PropertyName pn = filterFactory.property("Name");
  TextSymbolizer textSymbolizer = styleFactory.createTextSymbolizer(fill, new Font[]{gtFont},null, pn, placement, null);
  // beide Symbolizer zur Liste
  symbolizer.add(pointSymbolizer);
  // Regel für jeden Status erstellen
  Rule rule = styleFactory.createRule();
  rule.setSymbolizers(symbolizer.toArray(new Symbolizer[symbolizer.size()]));
  /* Feature-Attribut nach welchem die Regel filtern soll. */
  PropertyName statusProperty = filterFactory.property("Status");
  Literal status = filterFactory.literal(i);
  PropertyIsEqualTo piet = filterFactory.equals(statusProperty, status);
  rule.setFilter(piet);
  rules.add(rule);
}
FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle();
fts.setRules(rules.toArray(new Rule[rules.size()]));
Style style = styleFactory.createStyle();
style.addFeatureTypeStyle(fts);
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.