Mit dem Modul können Objekte in eine ESRI-Geodatabase geschrieben werden. Unterstützt werden:
ESRI SDE Geodatabase (Oracle)
ESRI Personal Geodatabase (ACCESS)
ESRI File Geodatabase
Der Modul beinhaltet folgende Besonderheiten:
Schreibt Daten mit Geometrien in eine Geodatabase.
Legt Tabellen für die Daten und die Spatial Indexe entprechende der ESRI Geodatabase an.
Füllt das Geodatabase Repository mit den notwendigen Definitionen.
Die Geodatabase kann nach dem Schreiben der Daten direkt mit den ESRI-Anwendungen weiterbearbeitet werden.
Der Modul wird mit:
|INCL \script\arcgisout.mod
in einer ICS RUN1-Konfiguration verfügbar gemacht.
Der Modul verwendet das ESRI ArcObjects API. Für die Anwendung des Modules ist deshalb eine ESRI Lizenz notwendig. Folgende minimalen ESRI Lizenzen sind notwendig.
ESRI Geodatabase | ESRI minimal Lizenz: Model kreieren | ESRI minimal Lizenz: Daten schreiben |
SDE | ArcEditor | ArcGIS Engine Runtime |
Personal | ArcGIS Engine Runtime | ArcGIS Engine Runtime |
File | ArcGIS Engine Runtime | ArcGIS Engine Runtime |
Wenn Sie zum Beispiel eine SDE Geodatabase bearbeiten möchten, benötigen Sie zum Kreieren des Modelles in SDE die ArcEditor Lizenz.. Ist das Modell in der SDE Geodatabase einmal angelegt, benötigen Sie zum Schreiben der Daten nach SDE nur noch die ArcGIS Engine Runtime Lizenz.
Folgende Parameter können in der Map ARCGISOUT_PARAM für den Modul gesetzt werden:
Parameter | req/opt | Beschreibung |
SRID | r | <STRING> . Der Name des
ArcGIS Spatial Reference System. Es muss der Name eines
ArcGIS bekannten Projected Coordinate Systems sein.
Beispiele: 'CH1903 LV03', 'CH1903+ LV95' |
DATASET | o | ON oder OFF ,
Default = OFF . Definiert, ob die in die
Datenbank geschriebenen Daten als Datasets verwaltetet
werden. Sie dazu mehr unter dem Kapitel Datasets im Module
DBOUT. |
STATISTICS | o | ON oder OFF ,
Default = OFF . Statistik
anzeigen. |
SPATIAL_GEOM_CLEAN | o | ON oder OFF ,
Default = OFF . Bereinigt die Geometry mit
ArcObject-Methode ITopologicalOperator.Simplify. |
COMPRESS | o | ON oder OFF ,
Default = OFF .Soll die SDE Datenbank nach
dem import komprimiert werden. Nur bei SDE-Datenbanken
anwendbar. |
Der Connect zu einer ArcGIS SDE Datebank wird unterschieden zwischen einem
Direct Connect (ab 10.1 Standard)
und einem
SDE Service Connect (bis 10.0 Standard)
Bis und mit SDE Version 10.0 war der Connect über einen SDE Service der Standard. Ab SDE Version 10.1 ist Direct Connect der Standard. Direct Connect benötigt keinen SDE Service, sondern verwendet die Möglichkeiten der Datenbank für einen Connect.
Bis SDE Version 10.0 konnte der SDE Service über das Postinstallations-Programm von SDE interaktiv eingerichtet werden. Ab SDE Version 10.1 muss der SDE Service manuell eingerichtet werden.
Entsprechend der Verbindung über Direct Connect oder SDE Service sind die Connect-Parameter etwas anders. Nachfolgend werden Beispiele für die Verbindung zweier geläufigen Datenbanken aufgeführt.
Datenbank | Connect | Connect Parameter Interaktiv | Connect Parameter Batch OPT.input/OPT.output |
Oracle | Direct Connect |
|
|
SDE Service |
|
| |
SQL Server | Direct Connect |
|
|
SDE Service |
|
|
Der Modul verlangt pro OUT-Objekt folgende Systemkomponenten:
Komponente | req/opt | Beschreibung |
OUT.TABLE(s) | r | Tablename des OUT Objekts. |
OUT.GDB_DATASET(s) | o | Geodatabase Dataset, in welches das Objekt geschrieben werden soll. |
OUT.<Attribut>(s) | o | Attributname der Tabelle. Der Wert der Komponente beinhaltet den Wert für die Datenbank. Der Typ des Werts muss mit dem Typ des Attributs in der Datenbank übereinstimmen. Es können beliebig viele Attribute definiert werden. |
Dieses Objektmodell gilt für die Anwendung mit der
Prozedur GDBOUT_WRITE_OBJECT0
. Die Tabellen mit den
Attributen müssen in der Datenbank bereits bestehen oder in einer
Konfiguration mit Prozeduren und Methoden vorgängig erzeugt werden.
Falls die Datenbankstrukturen automatisiert mit dem Modul erstellt
werden sollen, so beachten Sie das Kapitel mit den Record-Definitionen
und das Kapitel mit der Datenbank Modellgenerierung.
Den Objekten wird automatisiert im Attribute
OBJECTID
ein eindeutiger Schlüssel vergeben. Das
Attribut OBJECTID
ist nicht zu definieren.
Mit Record Definitionen können nicht nur Objekte in die Datenbank geschrieben werden, sondern auch Datenbank-Tabellen automatisiert in der Datenbank inklusive dem Geodatabase Repository angelegt werden. Eine Record Definition sieht wie folgt aus.
MAP RECORD_<n>
TABLE => <Table-Name>
GDB_DATASET => <Dataset-Name>
:
<Attribute-Name> => <Attribute-Type>,<Attribute-Value>
:
END_MAP
Die einzelnen Bestandteile einer Record-Definition sind:
RECORD_<n>
Eine Record Definition ist eine Map. Der Map-Name muss mit dem Prefix RECORD_ beginnen und eine eindeutige Nummer <n> für die Record Definition beinhalten.
TABLE
Diese Komponente ist required und definiert die Datenbank-Tabelle.
<Table-Name>
Definiert als Wert der Komponente TABLE die Datenbank-Tabelle.
GDB_DATASET
Diese Komponente ist optional und definiert das Geodatabase Dataset.
Im GDB-Repository können nur Objekte mit einer Geometrie einem Dataset zugeordnet werden. Wird diese Komponente bei einem Objekt definiert, das keine Geometrie aufweist, wird eine Dummy-Geometrie in der Form eines Punktes dem Objekt angefügt. Damit kann das Objekt dem Dataset zugeordnet werden. Um ein Objekt, das keine Geometrie aufweist, als reine Tabelle zu transferieren, darf diese Komponente nicht definiert werden. |
<Dataset-Name>
Definiert als Wert der Komponente GDB_DATASET das Geodatabase Dataset..
<Attribute-Name>
Definiert als Komponente einen Attribut-Namen der Tabelle. Es können beliebig viele Attribute als Komponenten definiert werden.
<Attribute-Type>
Definiert den Attribut-Type in der Datenbank. Im Normalfall können der Datenbank bekannt Typen verwendet werden. Spezialtypen einer Datenbank werden eventuell nocht nicht unterstützt. Solche Spezialtypen werden bei Bedarf und auf Anfrage implementiert. Bei den Typen ist auf folgendes zu achten.
CHAR(<length>)
Stringtypen sind immer als
CHAR
mit der Länge
<length>
zu
definieren..
NUMBER(p,s)
Number-Type.
INTEGER
Integer-Type.
DATE
Date-Type.
Ein Datum kann übergeben werden als:
- INTEGER im Format YYYYMMDD z.B.20141204
- STRING im Format 'YYYY-MM-DD' z.B '2014-12-04'
Ein Datum mit Zeit kann übergeben werden als
- STRING im Format 'YYYY-MM-DD HH24-MI-SS' z.B '2014-12-04 14:09:59'
GEOMETRY(<type>;<dimension>;<HASM>)
Geometrien müssen als Type
GEOMETRY
definiert werden. Dabei
sind folgende weiteren Definitionen notwendig.
<type>
Type der Geometrie, einer der Werte:
point|line|area.
<dimension>
Dimension der Geometrie, einer der Werte:
2D|3D.
<HASM>
Geometrie besitzt die Measure-Dimension, einer
der Werte:
TRUE|FALSE
.
Geodatabase erlaubt nur eine Geometrie-Definition pro Tabelle. Deshalb kann pro Record-Definition nur ein Geometrie-Attribut definiert werden. |
Um mögliche Einschränkungen von SDE zu umgehen, ist es
empfehlenswert, den Geometrie-Attributen den Name
|
<Attribut-Value>
Definiert den Wert für das Attribut. Als Wert können absolute Werte oder ICS-Variablen, die einen Wert beinhalten - z.B. IN.OBJID - verwendet werden.
Beispiel einer Record Definition.
MAP RECORD_15 TABLE => Bodenbedeckung_BoFlaeche_Area GDB_DATASET => Bodenbedeckung OBJID => CHAR(32),IN.OBJID Entstehung => CHAR(32),IN.Entstehung.OBJID Qualitaet => INTEGER,IN.Qualitaet Qualitaet_TXT => CHAR(7),IN.Qualitaet Art => INTEGER,IN.Art Art_TXT => CHAR(47),IN.Art_TXT SHAPE => GEOMETRY(area;2D;FALSE),IN.GEOM END_MAP
Zur Verwaltung von Datasets in der Datenbank ist das analoge Kapitel des Modules DBOUT zu beachten.
Um ein Dataset aus einer Geodatabase Datenbank zu löschen, steht folgende Konfiguration zur Verfügung:
ILTOOLS_DIR\system\script\il2arcgis\arcgisdatasetdelete.cfg
Falls basierend auf den Record-Definitionen vor einem
Datentransfer das gesamte Datenbankmodell erstellt werden soll, so ist
der Parameter CONFIG_PARAM.GENERATE_MODEL
auf
ON
zu setzten:
MAP CONFIG_PARAM GENERATE_MODEL => ON END_MAP
Entsprechend den Record-Definitionen wird vor einem Datentransfer das Datenbankmodell inklusive den Definitionen für das Geodatabase Repository generiert, falls es nicht schon generiert wurde.
Um das Datenmodell inklusive den Daten und den Definitionen im Geodatabase Repository aus einer Geodatabase Datenbank zu löschen, steht folgende Konfiguration zur Verfügung:
ILTOOLS_DIR\system\script\il2arcgis\arcgisgdbdelete.cfg
ESRI-Datenbanken - insbesondere SDE -sind sehr heikel bezüglich der Topologie von Flächennetzen. Wenn von INTERLIS Flächennetze wie die Bodenbedeckung der amtlichen Vermessungen mit erlaubten Overlaps übertragen werden, entstehen in der Regel in ESRI-Datenbanken Flächennetze mit Fehlern in der Topologie.
Um solche Fehler in der ESRI-Topologie zu eliminieren, empfehlen wir folgendes Vorgehen.
Definieren Sie die Map
ARCGISOUT_SPECIAL
MAP ARCGISOUT_SPECIAL Bo_BoFlaeche_Area => AREA_TOPOLOGY Li_Liegenschaft_Area => AREA_TOPOLOGY DEFAULT => OFF END_MAP
Erstellen Sie für jede ArcGIS-Featureclass, die ein
Flächennetz beinhaltet, einen Eintrag mit dem Wert
AREA_TOPOLOGY
.
Für diese Featureclasses wird nach der INTERLIS-Topologieberechnung die Topologie ein zweites Mal berechnet, indem Overlap-Flächen als eigenständige Flächen behandelt werden.
Erstellen Sie ein ArcGIS Python Script, das auf Featureclasses mit einem Flächennetz ein Repair Geometry und ein Validate Topology ausführt.
Führen Sie das Python-Script nach dem Datentransfer auf den gewünschten Featureclasses aus oder integrieren Sie das Script in den Datentransfer - siehe nächster Schritt Konfiguration *.out.
Siehe Beispiel Python-Script:
ILTOOLS_DIR\system\script\il2arcgis\il2arcgis_valTopo.py
# infoGrips # 2016.05.31/tg created # #===================================================================================== import glob import os import getopt import arcpy import sys #===================================================================================== def validateTopology(featureClass): topologyName = featureClass + '_Topology_Validate' try: arcpy.RepairGeometry_management(in_features=featureClass) print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) raise try: ''' If the Cluster Tolerance parameter is blank or set to 0 the xy tolerance of the feature dataset which contains the topology will be used. ''' arcpy.CreateTopology_management(arcpy.env.workspace, topologyName, 0) print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) raise try: arcpy.AddFeatureClassToTopology_management(arcpy.env.workspace + os.sep + topologyName, featureClass, "1", "1") print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) raise try: arcpy.AddRuleToTopology_management(arcpy.env.workspace + os.sep + topologyName, "Must Not Have Gaps (Area)", featureClass, "", "", "") print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) raise try: arcpy.AddRuleToTopology_management(arcpy.env.workspace + os.sep + topologyName, "Must Not Overlap (Area)", featureClass, "", "", "") print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) raise try: arcpy.ValidateTopology_management(arcpy.env.workspace + os.sep + topologyName, "FULL_EXTENT") print(arcpy.GetMessages()) except: print(arcpy.GetMessages()) return #===================================================================================== def main(argv): gdb = '' dataset = '' feature = '' use = 'topo.py -g <gdb> -d <dataset> -f <feature>' try: opts, args = getopt.getopt(argv,"hg:d:f:") except getopt.GetoptError: print use sys.exit(2) for opt, arg in opts: if opt == '-h': print use sys.exit() elif opt in ("-g"): gdb = arg elif opt in ("-d"): dataset = arg elif opt in ("-f"): feature = arg print '-g = ', gdb print '-d = ', dataset print '-f = ', feature arcpy.env.overwriteOutput=True for gdbFile in glob.glob(gdb): arcpy.env.workspace = gdbFile + os.sep + dataset print(gdbFile) print(arcpy.env.workspace) validateTopology(featureClass= feature) pass #===================================================================================== if __name__ == '__main__': main(sys.argv[1:]) #=====================================================================================
Das oben aufgeführte Python-Script kann in den Datentransfer intergriert werden.
Siehe Beispiel:
ILTOOLS_DIR\system\script\il2arcgis\il2arcgis.out
PROCEDURE ARCGIS_PYTHON_VALTOPO_RUN ! [s dataset, s feature] ! arguments !---------- => LOCAL.FEATURE => LOCAL.DATASET ! edit !----- 'C:\Python27\ArcGIS10.2\python.exe' => LOCAL.PY_EXE '\script\il2arcgis\il2arcgis_valTopo.py' EXPAND_PATH => LOCAL.PY_FILE ! message !-------- DISPLAY '' DISPLAY '==========================================' DISPLAY 'Topology postprocess' DISPLAY LOCAL.DATASET,'.',LOCAL.FEATURE DISPLAY '' ! py and log get !--------------- LOCAL.PY_FILE FILENAME_PARSE => LOCAL.FDIR => LOCAL.FNAME => LOCAL.FEXT LOCAL.FDIR . '\' . LOCAL.FNAME . '.log' => LOCAL.LOG ! command build and run !---------------------- LOCAL.PY_FILE . ' -g ' . OPT.output . ' -d ' . LOCAL.DATASET . ' -f ' . LOCAL.FEATURE => LOCAL.PY_COMMAND LOCAL.PY_EXE . ' ' . LOCAL.PY_COMMAND . ' > ' . LOCAL.LOG => LOCAL.COMMAND DISPLAY LOCAL.COMMAND DISPLAY '' LOCAL.COMMAND OSCALL TO_INT => LOCAL.STATUS ! log add !--------- IF LOCAL.LOG TEXTFILE.OPEN THEN => LOCAL.FID WHILE LOCAL.FID TEXTFILE.READLN DO DISP END_WHILE END_IF ! message end !------------- DISPLAY '' IF LOCAL.STATUS = 0 THEN DISPLAY 'finished with success status=',LOCAL.STATUS ELSE DISPLAY 'finished with failure status=',LOCAL.STATUS END_IF DISPLAY '' END_PROCEDURE !----------------------------------------------------------------------------- PROCEDURE POST_RUN1 'Bodenbedeckung' 'Bo_BoFlaeche_Area' ARCGIS_PYTHON_VALTOPO_RUN 'Liegenschaften' 'Li_Liegenschaft_Area' ARCGIS_PYTHON_VALTOPO_RUN END_PROCEDURE
Prozedur | ARCGISOUT_OPEN [s input][] |
Beschreibung | Öffnet eine bestehende Datenbank oder kreiert neue Datenbank.
Prozedur wird von RUN1 automatisch aufgerufen. |
Beispiel |
|
Prozedur | ARCGISOUT_WRITE_OBJECT0 |
Beschreibung | Schreibt ein Objekt in die Datenbank. Das OUT-Objekt muss gemäss dem Objektmodell gefüllt sein. |
Beispiel |
|
Prozedur | ARCGISOUT_WRITE_RECORD1 ! s recordname |
Beschreibung | Schreibt ein Objekt definiert mit <recordname> in die Datenbank. <recordname> ist der Name einer Record-Definition (siehe weiter oben). |
Beispiel |
|
Prozedur | ARCGISOUT_CLOSE [][] |
Beschreibung | Schliesst den Modul und gibt die durch den Modul belegten Resourcen wieder frei. Die Prozedur wird von RUN1 automatisch aufgerufen. |
Beispiel |
|
Methode | ARCGISOUT.COMPRESS [][] |
Beschreibung | Eine SDE Datenbank
komprimieren. Danach sollten die Anzahl SDE-States minimiert
sein: select count(*) from
sde.states . Die Datenbank muss geöffnet
und geschlossen werden.Diese Methode ist für die alleinige
Anwendung ohne Import oder Export gedacht. Soll nach dem
Import eine Komprimierung erfolgen, dann ist folgender
Parameter zu setzen:
ARGGISOUT_PARAM.COMPRESS |
Beispiel |
|
Neben diesen Prozeduren des Modules stehen auch die Methoden der
Klasse DB
zur Verfügung (s.a. iG/Script Benutzer- und
Referenzhandbuch).
! Diese ICS Konfiguration liest ein INTERLIS FIle, ! erzeugt eine Tabelle für LFP's in der Datenbank ! inklusive den Definitionen des Geodatabase Repository ! und schreibt die LFP's in die Tabelle. |LICENSE \license\iltoolspro.lic MAP CONFIG_PARAM GENERATE_MODEL => ON END_MAP MAP USER_INPUT1 DIALOG => FILE MESSAGE => 'Enter INTERLIS Input File' FILE_FILTER => itf FILE_EXISTS => TRUE OPT => input END_MAP MAP USER_INPUT2 DIALOG => ARCGIS MESSAGE => 'Enter SDE or Database Output File' FILE_FILTER => * FILE_EXISTS => FALSE OPT => output END_MAP MAP ILIN_PARAM INTERLIS_DEF => \models\Grunddatensatz.ili STATISTICS => ON CALC_SURFACE => ON ENUM_TO_TEXT => ON TRACE => OFF END_MAP MAP ILIN_TOPO DEFAULT => OFF END_MAP MAP ARCGISOUT_PARAM SRID => 'CH1903 LV03' STATISTICS => ON DATASET => ON END_MAP MAP RECORD_1 TABLE => Fi_LFP1 GDB_DATASET => FixpunkteKategorie1 OBJID => CHAR(32),IN.OBJID Entstehung => CHAR(32),IN.Entstehung.OBJID NBIdent => CHAR(12),IN.NBIdent Nummer => CHAR(12),IN.Nummer SHAPE => GEOMETRY(point;2D;FALSE),IN.Geometrie HoeheGeom => NUMBER(7,3),IN.HoeheGeom LageGen => NUMBER(4,1),IN.LageGen LageZuv => INTEGER,IN.LageZuv LageZuv_TXT => CHAR(4),IN.LageZuv_TXT HoeheGen => NUMBER(4,1),IN.HoeheGen HoeheZuv => INTEGER,IN.HoeheZuv HoeheZuv_TXT => CHAR(4),IN.HoeheZuv_TXT Begehbarkeit => INTEGER,IN.Begehbarkeit Begehbarkeit_TXT => CHAR(14),IN.Begehbarkeit_TXT Punktzeichen => INTEGER,IN.Punktzeichen Punktzeichen_TXT => CHAR(17),IN.Punktzeichen_TXT END_MAP MAP INPUT_SOURCES I1 => ILTOPO,OPT.input END_MAP MAP INOUT I1 => IN.TOPIC,IN.TABLE I1,Fixpunkte,LFP => ARCGISOUT_WRITE_RECORD1,RECORD_1 I1,* => OFF END_MAP |INCL \script\iltopo.mod |INCL \script\arcgisout.mod |INCL \script\il2arcgis\il2arcgis\arcgisout.mod |INCL \script\run1.prg
Die Module ARCGISIN/ARCGISOUT lösen die Module GDBIN/GDBOUT und SDEIN/SDEOUT ab. Bestehende Konfigurationen IL2GDB/GDB2IL und IL2SDE/SDE2IL sind deshalb durch Konfiguration IL2ARCGIS/ARCGIS2il abzulösen. Für dieser Migration steht folgendes Script zur Verfügung.
ILTOOLS\system\script\il2gdb\CFG_GDB2ARCGIS.cfg
Das Script verlangt als Input eine IL2GDB/GDB2IL oder IL2SDE/SDE2IL Konfiguration und schreibt als Output eine analoge IL2ARCGIS/ARCGIS2IL Konfiguration.