2. Modul GEOINDEX - Geometrie Index

2.1. Allgemeines

Mit dem Modul GEOINDEX werden Objekte mit Geometrien in einen Geometrie Index geschrieben. Über geometrische Abfagen können diese Objekte schnell aufgefunden werden.

GEOINDEX wird mit:

|INCL \script\geoindex.mod

verfügbar gemacht.

2.2. Parametermap GEOINDEX_PARAM

Folgende Parameter können in der Map GEOINDEX_PARAM für den Modul gesetzt werden:

Parameterreq/optBeschreibung
PAGESIZEo<real>. Geometrien werden in einem Raster (Pages) indexiert. Mit diesem Parameter wird die Rastergrösse definiert. Je nach der Art der Geometrien und der geplanten Verarbeitung ist eine entsprechende Rastergrösse optimal.
DISKMEMORYoON oder OFF, Default = OFF. Per Default speichert das Modul die indexierten Objekte und Geometrie im Arbeistspeicher. Bei grossen Datenmengen kann eventuell der Arbeistspeicher nicht ausreichen. Mit diesem Parameter kann gesetzt werden, dass die indexierten Objekte und Geometrie auf der Disk gespeichert werden. Dies Verarbeitung entlastet den Arbeitsspeicher ist aber etwas langsamer.

2.3. Objektmodell

Mit dem Modul werden Objekte mit Geometrien in einen Index geschrieben. Die Objekte können beliebig sein und werden analog wieder gelesen.

2.4. Exportierte Prozeduren und Methoden

Bevor Abfragen auf dem Geometrie Index ausgeführt werden können, muss der Geometrie Index mit Objekten gefüllt werden. Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.OPEN ! [][]
Beschreibung

Öffnet den Geometrie Index. Objekte mit Geometrien können in den Geometrie Index geschrieben werden.

Beispiel
GEOINDEX.OPEN
ProzedurGEOINDEX.WRITE_OBJECT ! [* object, g geometry][i id]
Beschreibung

Schreibt ein Objekt unter einer Geometrie in den Geometrie Index. Eine eindeutige Identifikation des Objektes im Geometrie Index wird zurück gegeben.Nachdem die gewünschten Objekte in den Geometrie Index geschrieben sind, können diese mit den geometrischen Abfragen wieder gelesen werden.

Beispiel
&IN IN.Geometrie GEOINDEX.WRITE_OBJECT [1]
ProzedurGEOINDEX.WRITE_OBJECT_CLASS ! [s class, * object, g geometry][i id]
Beschreibung

Wie GEOINDEX.WRITE_OBJECT aber zusätzlich kann noch eine Klasse für das Objekt mitgegeben werden.

Beispiel
'MyClass' &IN IN.Geometrie GEOINDEX.WRITE_OBJECT_CLASS [1]
ProzedurGEOINDEX.CLOSE ! [][]
BeschreibungSchliesst den Geometrie Index. Der Geometrie Index wird geleert. Danach sind keine geometrsichen Abfragen auf den Geometrie Index möglich.
Beispiel
GEOINDEX.CLOSE
ProzedurGEOINDEX.SET_CLASS_FILTER ! [s class] []
BeschreibungFür alle nachfolgenden Methoden GEOINDEX.*_READ_OPEN kann ein Filter gesetzt werden, welche Klassen zurückgelesen werden sollen. Die Klassen müssen vorgängig mit GEOINDEX.WRITE_OBJECT_CLASS in den Geoindex geschrieben werden. Mehrere Klassen können kommasepariert gesetzt werden 'MyClass1,MyClass2' . Ist Class = NULL wird der Filter zurückgesetzt, d.h. es ist kein Filter aktiv. Ein gesetzter Filter bleibt aktiv bis er wieder mit der Methode neu gesetzt oder zurückgesetzt wird.
Beispiel
['MyClass'] GEOINDEX.SET_CLASS_FILTER []

Alle in den Geometrie Index geschriebenen Objekte können sequentiell oder über Ihre Identifikation zurückgelesen werden.Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.READ_OPEN ! [] []
BeschreibungÖffnet den Geometrie Index für das sequentielle Lesen der Objekte im Geometrie Index.
Beispiel
[] GEOINDEX.READ_OPEN []
ProzedurGEOINDEX.READ_OBJECT ! [] [g geom, * object, i id, b status]
BeschreibungList das nächste Objekt aus dem Geometrie Index.
Beispiel
[] GEOINDEX.READ_OBJECT [geom map 1 TRUE]
ProzedurGEOINDEX.READ_CLOSE ! [][]
BeschreibungSchliesst den Geometrie Index für das sequentielle Lesen der Objekte im Geometrie Index.
Beispiel
GEOINDEX.READ_CLOSE
ProzedurGEOINDEX.READ_OBJECT_BY_ID ! [i id] [g geom, * object, b status]
BeschreibungList ein Objekt aus dem Geometrie Index über dessen Identifikation.
Beispiel
[1] GEOINDEX.READ_OBJECT_BY_ID [geom map TRUE]

Alle Objekte, deren maximale Ausdehnung ein Rechteck überlappen, können aus dem Geometrie Index gelesen werden.Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.RECTANGLE_READ_OPEN ! [p point1, p point2] []
BeschreibungÖffnet die Abfrage des Geometrie Indexes über ein Rechteck.
Beispiel
[point1 point2] GEOINDEX.RECTANGLE_READ_OPEN []
ProzedurGEOINDEX.RECTANGLE_READ_OBJECT ! [g geom, * object, i id, b status]
BeschreibungLiest das nächste Objekt aus dem Geometrie Index, dessen maximale Ausdehung das Rechteck überlappt.
Beispiel
[] GEOINDEX.RECTANGLE_READ_OBJECT [geom map 1 TRUE]
ProzedurGEOINDEX.RECTANGLE_READ_CLOSE ! [] []
BeschreibungSchliesst die Abfrage.
Beispiel
[] GEOINDEX.RECTANGLE_READ_CLOSE []

Alle Objekte, deren maximale Ausdehnung eine Fläche überlappen, können aus dem Geometrie Index gelesen werden.Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.AREA_READ_OPEN ! [a area, b overlap] []
BeschreibungÖffnet die Abfrage des Geometrie Indexes über eine Fläche. overlap = TRUE bedeutet: Objekte dürfen die Fläche überlappen. overlap = FALSE bedeutet: Objekte müssen innerhalb der Fläche sein.
Beispiel
[area TRUE] GEOINDEX.AREA_READ_OPEN []
ProzedurGEOINDEX.AREA_READ_OBJECT ! [g geom, * object, i id, b status]
BeschreibungLiest das nächste Objekt aus dem Geometrie Index, dessen Geometrie die Fläche überlappt oder dessen Geometrie innerhalb der Fläche liegt (siehe overlap) .
Beispiel
[] GEOINDEX.AREA_READ_OBJECT [geom map 1 TRUE]
ProzedurGEOINDEX.AREA_READ_CLOSE ! [] []
BeschreibungSchliesst die Abfrage.
Beispiel
[] GEOINDEX.AREA_READ_CLOSE []

Alle Objekte werden im Geometrie Index indexiert in Seiten (Pages) abgelegt. Je nach Pagsize und der maximalen Ausdehung der Geometrie eines Objektes, wird das Objekt in einer bis mehreren Seiten indexiert. Zu der Geometrie eines Objektes können alle weiteren Objekte zurückgelesen werden, die sich in denselben Seiten des Indexes befinden. Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.PAGES_READ_OPEN ! [g geometry] []
BeschreibungÖffnet die Abfrage des Geometrie Indexes über die Ausdehnung einer Geometrie.
Beispiel
[line] GEOINDEX.PAGES_READ_OPEN []
ProzedurGEOINDEX.PAGES_READ_OBJECT ! [g geom, * object, i id, b status]
BeschreibungLiest das nächste Objekt aus dem Geometrie Index, das sich in denselben Seiten des Geometrie Indexes befindet.
Beispiel
[] GEOINDEX.PAGES_READ_OBJECT [geom map 1 TRUE]
ProzedurGEOINDEX.PAGES_READ_CLOSE ! [] []
BeschreibungSchliesst die Abfrage.
Beispiel
[] GEOINDEX.PAGES_CLOSE []

Zu einem Punkt können alle Objekte mit Flächen aus dem Geometrie Index gelesen werden, bei denen ein bestimmter Punkt innerhalb der Fläche liegt. Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.AREASBYPOINT_READ_OPEN ! [p point] []
BeschreibungÖffnet die Abfrage des Geometrie Indexes über die den Punkt
Beispiel
[line] GEOINDEX.AREASBYPOINT_READ_OPEN []
ProzedurGEOINDEX.AREASBYPOINT_READ_OBJECT ! [g geom, * object, i id, b status]
BeschreibungLiest das nächste Objekt mit einer Fläche aus dem Geometrie Index, in der der Punkt liegt.
Beispiel
[] GEOINDEX.AREASBYPOINT_READ_OBJECT [geom map 1 TRUE]
ProzedurGEOINDEX.AREASBYPOINT_READ_CLOSE ! [] []
BeschreibungSchliesst die Abfrage.
Beispiel
[] GEOINDEX.AREASBYPOINT_CLOSE []

Zu einer Geometrie können die nächstgelegenden Geometrien aus dem Geometrie Index gelesen werden Die nachfolgenden Methoden stehen dazu zur Verfügung.

ProzedurGEOINDEX.NEAREST_READ_OPEN ! [g geometry] []
BeschreibungÖffnet die Abfrage des Geometrie Indexes über die Geometrie.
Beispiel
[line] GEOINDEX.NEAREST_READ_OPEN []
ProzedurGEOINDEX.NEAREST_READ_OBJECT ! [r distance, g geom, * object, i id, b status]
BeschreibungLiest das nächste Objekt aus dem Geometrie Index, dessen Geometrie am nächsten zur Geometrie liegt, mit der die Abfrage geöffnet wurde.
Beispiel
[] GEOINDEX.AREASBYPOINT_READ_OBJECT [1.123 geom map 1 TRUE]
ProzedurGEOINDEX.NEAREST_READ_CLOSE ! [] []
BeschreibungSchliesst die Abfrage.
Beispiel
[] GEOINDEX.AREASBYPOINT_CLOSE []

2.5. Skriptbeispiel

! Diese ICS Konfiguration schreibt in einem 1. Schritt
! Punkte in den Geometrie Index.
! In einem 2. Schritt werden zu einem Punkt die nächstgelegenen
! Punkte im Geometrie Index zurückgelesen.

|INCL \script\geoindex.mod

MAP GEOINDEX_PARAM
   PAGESIZE    => 50.0
   DISKMEMORY  => OFF
END_MAP

! schreiben von Punkten in den Geometrie Index
! Punkteabstand dx=10,dy=10 
! von x/y-min=0/0 bis x/y-min=100/100
!----------------------------------------------
0.0   => VAR.ORIGIN
10.0  => VAR.DISTANCE
100.0 => VAR.LIMIT

GEOINDEX.OPEN

0   => VAR.I

VAR.ORIGIN => VAR.X
WHILE VAR.X <= VAR.LIMIT DO

   VAR.ORIGIN => VAR.Y
   WHILE VAR.Y <= VAR.LIMIT DO

      VAR.I INC => VAR.I
      IF VAR.I 100 MOD = 0 THEN
         DISPLAY VAR.I,' objects written'
      END_IF

      VAR.I                             => IN.ID
      VAR.X VAR.Y 0.0 SET_NULL TO_POINT => IN.GEOM

      &IN IN.GEOM  GEOINDEX.WRITE_OBJECT POP

      VAR.Y VAR.DISTANCE + => VAR.Y
   END_WHILE

   VAR.X VAR.DISTANCE + => VAR.X
END_WHILE

DISPLAY 'objects written=',VAR.I

! lesen der nächsten Punkte aus dem Geometrie Index
! zum Punkt 50/50
!--------------------------------------------------

0   => VAR.I

50.0 50.0 0.0 SET_NULL TO_POINT => VAR.POINT

VAR.POINT
GEOINDEX.NEAREST_READ_OPEN
WHILE GEOINDEX.NEAREST_READ_OBJECT DO
   => VAR.ID
   => VAR.OBJECT
   => VAR.GEOM
   => VAR.DISTANCE

   VAR.I INC => VAR.I

   DISPLAY 'Distance=',VAR.DISTANCE,' from ',VAR.GEOM,' to ',VAR.POINT

END_WHILE

DISPLAY 'objects read=',VAR.I