[NAS] Unnötig viele Zwischenpunkte im Geometriefeld

Jäger, Frank (KRZ) F.Jaeger at KRZ.DE
Mon Okt 11 08:37:08 EDT 2010


Hallo,
in der Liste des ALK-Konverters "edbs2wkt" fand heute eine Diskussion statt, wie man "unnötige" Zwischenpunkte aus der Geometrie eines Objektes entfernen kann.

Link zum Archiv: http://sourceforge.net/mailarchive/forum.php?forum_name=edbs2wkt-user
Betreff: "Flurstücksgrenzen" (2010, Oktober)

Die "Redundanzfreiheit" der ALK teilt eine Linie auch dann auf, wenn auf einer anderen Folie ein Objekt endet oder abzweigt.
Dieser "Zwischenpunkt" liegt dann /in der Geraden/ und macht für das aktuelle Objekt oder die aktuelle Folie keinen Sinn. Trotzdem schreibt der Konverter das zur Zeit in das Geometriefeld, weil die "Geradheit" beim Konvertieren nicht untersucht wird.

Ziel des Fragestellers war es dort (ALK), nur die unnötigen Zwischenpunkte zu entfernen, die von Objekten anderer Folien stammen, aber die Zwischenpunkte zu behalten, die von Objekten der gleichen Folie stammen. Dazu wurde noch keine Lösung gefunden.
Die Geometrie eines einzelnen Objektes - ohne die genannte Randbedingung - kann die PostGIS-Function "simplify" jedoch auf die notwendigen Punkte reduzieren.

Die Reduktion der ALK-Flächen mit einer Toleranz von "1 mm" reduziert die Punkte im Umring einer Fläche im Schnitt um 10 bis 20%. Den meisten Erfolg hat man bei den großen Flur-Objekten der Folie 002, wo bis zu 40% eingespart wird.

Da ich im ALKIS ähnliche Strukturen wie in der ALK vermute, habe ich auch dort die Potentiale untersucht.
Der folgende SQL-Select analysiert exemplarisch an 3 ALKIS-Tabellen (PostNAS 0.5) welche Vereinfachung bei verschiedenen Toleranz-Parametern erfolgen würde.

Zu meinem Erstaunen reduziert bereits der Tolerenz-Parameter "1 Millimeter" die Anzahl der Punkte in einem Umring auf unter 50%!
Das ist wesendlich mehr als in der ALK. Ich hatte eigentlich weniger vermutet, weil z.B. Flurstücke und Nutzungsarten in ALKIS entkoppelt sind.

<SQL>
SELECT 
  count(gml_id) AS anzahl,
  round(avg(ST_npoints(wkb_geometry)),2)
     AS punktanzahl_orig,
  round(avg(ST_npoints(st_simplify(wkb_geometry, 0.001))),2)
     AS punktanzahl_simply_mm,
  round(avg(ST_npoints(st_simplify(wkb_geometry, 0.01))),2)
     AS punktanzahl_simply_cm,
  round(avg(ST_npoints(st_simplify(wkb_geometry, 0.05))),2)
     AS punktanzahl_simply_5cm
  FROM [tabelle]
;
</SQL>

Das liefert folgende Ergebnisse:

                             -- Anzahl Punkte im Umring --
  Tabelle               Anz. PostNAS  --Simplify-Toleranz--
                        Obj. Orig.     1 mm    1 cm    5 cm 
  -----------------   ------ ------  ------  ------  ------
Musterkarte RLP:
  ax_flurstueck         2369  20.45   10.24    9.06    8.80
  ax_wald                 89  20.70   11.53   11.15   11.08
  ax_wohnbauflaeche       76  28.37   12.59   11.53   10.91
Lokale Produktionsdaten:
  ax_flurstueck        23589  30.55   12.60   11.57   11.08
  ax_wald               1207  61.44   27.88   27.24   26.28
  ax_wohnbauflaeche     2357  44.41   18.60   16.55   15.54


Dies Ausmaß hat mich erstaunt. Bei der Umsetzung von ALK nach ALKIS muss wohl etwas sub-optimal gelaufen sein.

Je nach Verwendungzweck kann also die Komplexität der Geometrie und somit Speichervolumen, Datentransfervolumen (DB -> Renderer) und die Zeit für das Rendern erheblich optimiert werden.
Da ALKIS aufgrund der zerfledderten Tabellen (Nutzung) unser langsamster WMS ist, würde ein wenig Tuning durchaus als wohltuend empfunden.

Selbst wenn es sich z.B. um einen vermarkten Grenzpunkt in einer Flurstücksgrenze handelt, kann dieser m.E. für einen WMS ohne Qualitätsverlust aus dem Flurstücks-Umring entfernt werden.
Der Grenzstein darauf wird aus einer anderen (Punkt-) Tabelle generiert und Kringel samt Loch darin werden über die Flurstücksgrenze drüber gerendert. Somit wäre dieser Zwischenpunkt in der Flächengeometrie des Flurstücks entbehrlich, wenn es nur um das Rendern einer Karte geht.

Die Optimierung der Geometrie nach der Konvertierung kann z.B. über folgende SQL-Befehle erfolgen:

<SQL>
UPDATE ax_wald
SET    wkb_geometry = st_simplify(wkb_geometry, 0.002);

UPDATE ax_wohnbauflaeche
SET    wkb_geometry = st_simplify(wkb_geometry, 0.002);

UPDATE ax_flurstueck
SET    wkb_geometry = st_simplify(wkb_geometry, 0.002);
</SQL>

Usw.
(Tolerenz hier: 2 mm)

Spricht sonst etwas dagegen, die Geometrie zu vereinfachen?

Für welche anderen Anwendungen wäre es möglicherweise sinnvoll, solche Punkte zu behalten?

Sollte man das "simplify" (optional) gleich beim Konvertieren anwenden?
(Das wäre insbesondere beim NBA-Verfahren effektiver als nach jeder Konvertierung immer alle Geometriefelder zu bearbeiten.)
Dann wäre der Konverter zu erweitern.

Wer kann sich die Vermehrung von unnötigen Zwischenpunkten von ALK nach ALKIS erklären? 



Mit freundlichen Grüßen
Frank Jäger

Kommunales Rechenzentrum
Minden-Ravensberg/Lippe