hallo zusammen, ich hoffe man mir hier weiter helfen.
versuche heraus zufinden wie man in ArcGIS programmtechnisch neue Attribute in eine Tabelle oder in eine Attribut- Tabelle einzufügen.
Wenn ich ein neues Polygon digitalisiert habe möchte ich nicht immer die Attribute die dazugehören per hand schreiben das ist ziemlich mühsam, es soll automatisch in die Felder geschrieben werden, wie z.B. Nutzungsart, Kurzbezeichnung, Schlüssel u.s.w.
Gibt es in ArcGIS wie man das realisieren könnte, bin nicht so fitt in ArcObject des wegen meine anfrage hier.
ich bedanke mich vorab schon an diejenigen die mir helfen können.
Gruß Anja
versuche heraus zufinden wie man in ArcGIS programmtechnisch neue Attribute in eine Tabelle oder in eine Attribut- Tabelle einzufügen.
Wenn ich ein neues Polygon digitalisiert habe möchte ich nicht immer die Attribute die dazugehören per hand schreiben das ist ziemlich mühsam, es soll automatisch in die Felder geschrieben werden, wie z.B. Nutzungsart, Kurzbezeichnung, Schlüssel u.s.w.
Gibt es in ArcGIS wie man das realisieren könnte, bin nicht so fitt in ArcObject des wegen meine anfrage hier.
ich bedanke mich vorab schon an diejenigen die mir helfen können.
Gruß Anja
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von Gast am Mi., 12.05.2004 - 11:02
PermalinkNeue Attribute kannst Du am besten dann einbinden, wenn ein Feature neu erstellt wird
Du mußt dafür einfach nur die EditEvents einbinden:
Option explicit
Private WithEvents EditEvents As esriCore.Editor
Private m_pEditor As IEditor
Private Function MxDocument_OpenDocument() As Boolean
Dim pID As New UID
pID = "esriCore.Editor"
Set m_pEditor = Application.FindExtensionByCLSID(pID)
Set EditEvents = m_pEditor
End Function
'und dann zB bei der Neuerstellung eines Objektes:
Private Sub EditEvents_OnCreateFeature(ByVal obj As IObject)
obj.store
'Du kannst dann hier direkt das Objekt als IFeature referenzieren und damit weiterarbeiten:
Dim pFeat As IFeature
Set pFeat = obj
msgbox "Hallo Anja"
'Hier Deine Felder ausfüllen lassen, zB.
Dim pTab As ITable
Set pTab = pFeat.Table
Dim strLayer As String
strLayer = pFeat.Class.AliasName
'strLayer ist dabei der DATEINAME ohne ".shp", nicht der LAYERNAME (wegen evtl Umbenennung in der mxd)
Dim strFieldName As String
Dim varValue As Variant
Dim idx As Long
Dim pFieldEdit As IFieldEdit
'Für das Bsp gibts in Deiner Karte einen Layer (Layer1.shp), bei dem Du
'eine ID einfügen möchtest mit Step = 2, sowie einen
'Kategorie-Schlüssel, wie zB den Datei-Namen. Beide Felder müssen
'in der Attributtabelle existieren ID = long, Kategorie = Text.
Select Case strLayer
Case "Layer1" ' oder Namen ändern...
'Zuerst die ID
strFieldName = "ID"
idx = pTab.Fields.FindField(strFieldName)
Set pFieldEdit = pTab.Fields.Field(idx)
varValue = GetMaxValue(pTab, strFieldName) + 2
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CLng(varValue)
pFeat.Store
'dann die Kategorie
strFieldName = "Kategorie"
idx = pTab.Fields.FindField(strFieldName)
Set pFieldEdit = pTab.Fields.Field(idx)
varValue = strLayer
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CStr(varValue)
pFeat.Store
'Case "Layer2"
' Hier Deine Felder ausfüllen wenn Du einen anderen Layer bearbeitest...
'Case "Layer3"
'etc
End Select
End Sub
'Dann noch in einem allgemeines Modul die Funktion für die ID:
Public Function GetMaxValue(pTab As ITable, strFieldName As String) As Variant
'Keine strings, nur long, double etc
Dim pfcur As IFeatureCursor
Set pfcur = pTab.Search(Nothing, False)
Dim pFeat As IFeature
Set pFeat = pfcur.NextFeature
Dim var As Variant
Do While Not pFeat Is Nothing
If CVar(pFeat.Value(pFeat.Fields.FindField(strFieldName))) > var Then
var = CVar(pFeat.Value(pFeat.Fields.FindField(strFieldName)))
End If
Set pFeat = pfcur.NextFeature
Loop
GetMaxValue = var
End Function
Siehe auch andere Events (stehen dann oben rechts in der Combobox des VBE).
Und nicht vergessen, einmal Deine Datei neu zu öffnen, sonst sin die
Events noch nicht verfügbar.
Hoffe das war, was Du wissen wolltest?
Viele Grüße
Jörg Ostendorp
Gespeichert von Gast am Mi., 12.05.2004 - 11:44
Permalinkwoher "weiß" denn das Polygon, welche Attribute eingetragen werden müssen?
Gespeichert von Gast am Mi., 12.05.2004 - 12:34
Permalinkalso ich habe mir das so vorgestellt:
das ich natürlich bevor ich ein Polygon zeichne dem system sage welchen Schlüsselfeld es nähmen soll, die wiederum in "normalen" Tabelle stehen, mit den weiteren dazugehörigen Sachdaten oder Attributen, und am Ende der Digitalisierung also wenn ich das Polygon abschließe, sollen die Sachdaten in das Shape oder Geodatabase mit dem neuem Polygon erzeugt werden.
hoffe ich konnte das einwenig deutlich machen wo mein Problem liegt,
Mann könnte natürlich auch mit Comboboxen arbeiten, das man dort nur den Schlüssel auswählt der dann zur der Tabelle mit den Sachdaten hinweist und dort sich die Informationen holt und sie ins Shape schreibt.
ich wäre wirklich froh wenn wir gemeinsam so was entwickeln könnten.
danke nochmals an alle.
gruß Anja
Gespeichert von Gast am Mi., 12.05.2004 - 13:10
PermalinkÖh, äh, eigentlich dachte ich, ich hätte es verstanden. Jetzt bin ich aber eher reichlich
verunsichert. Beschreib doch mal *ganz genau*, was Du machen willst und auch, wie Deine Datenhaltung
aussieht. Mir sind folgende Punkte nicht klar:
> bevor ich ein Polygon zeichne dem system sage welchen Schlüsselfeld es nähmen soll
- Du meinst, damit welches Feld in der *Attribut*-Tabelle nun der Primärschlüssel sein soll, also
eine Art ObjectID?
- Diese Info, für welchen Layer welches Feld der Attributtabelle der Primärschlüssel ist, soll nicht
direkt im Code gespechert werden?
> die wiederum in "normalen" Tabelle stehen, mit den weiteren dazugehörigen Sachdaten
> oder Attributen, und am Ende der Digitalisierung also wenn ich das Polygon abschließe, sollen die
> Sachdaten in das Shape oder Geodatabase mit dem neuem Polygon erzeugt werden.
- Häh? Bahnhof! Du hast also schon Attribute in einer anderen Tabelle vorliegen? Zu den Attributen
fehlen jetzt nur noch die Raumdaten? Dann wirst Du doch da auch en Primärschlüsselfeld haben, über das
Du einfach diese Tabelle mit der Attributtabelle der Layer *verknüpfst*. Die Infos aus der zusätzlichen Tabelle
müßtest Du doch dann nicht noch mal in die Attributtabelle kopieren, wäre doch redundant ..
Oder ist Deine zusätzlichen Tabellen Katalogtabellen (n:1) und Du möchtest die Info im Klartext?
Nein, ich versteh' leider nicht wirklich, was Du machen willst. Erklär nochmal für Doofe.
Viele Grüße
Jörg Ostendorp
Gespeichert von Gast am Mi., 12.05.2004 - 15:45
Permalinkim Prinzipe möchte ich so was machen wie ein Subtype in Geodatabase,
dort kann man ja mit Subtyps Unterklassen bilden für ein FeatureClass,
und bestimmte Felder mit vordefinierten Attributen füllen.
Nun der Vorteil dabei ist ja wenn ich jetzt ein neues Polygon digitalisieren,
brauch ich einfach nur zu wissen was für Polygon das sein soll,
dies kann man dann im „Editor –Werkzeugleiste“ im Ziel Layer die
Unterklasse die man ja dort vorher ja mit Subtyps definiert hatte auswählen.
So jetzt kann man Digitalisieren und nach abschließen des Polygons,
werden automatisch auch die Felder mit den Attributen gefüllt
(die ich ja auch im Subtype vordefiniert hatte). Das alles geht aber nur wenn man ArcEditor
Linzens hat, hab ich aber nicht:-).
und so was ähnlich es möchte ich auch programmieren.
Im Ziel Layer sollen meine Unterklassen für das Polygon auf gelistet werden.
das kann man als Combobox entwickeln, beim digitalisieren wähle vorher dann
aus der Combobox meine Klasse aus, dieser muß natürlich dann die Feld Attribute
von mir aus eine Standaloetabelle heraus lesen und in mein Polygon hineinschreiben.
in meine Standaloetabelle steht natürlich auch meine definierte Unterklasse und die sachdaten.
z.B. Objektschlüssel I Nutzungsart I Kurzname I Name I u.s.w.
ich hoffe du weist jetzt was ich meine :-)
gruß Anja
Gespeichert von Gast am Mi., 12.05.2004 - 22:07
PermalinkJo, glaube jetzt hab ichs fast.
Mir ist nur noch nicht ganz klar, ob Du wirklich Subtypes nachbauen willst oder einfach ein etwas suboptimales Tabellendesign hast :-)
Nimm's mir nicht übel, aber da frage ich sicherheitshalber nochmal nach:
1. sind die Felder Deiner anderen Attribute bezogen auf ein "Subtype" immer gleich (in der Attributtabelle):
Subtype Feld1 Feld 2 Feld 3
1 1 2 3
1 1 2 3
2 4 5 6
2 4 5 6
oder definiert Dein Subtype wirklich nur Standardwerte, die Du ggf. manuell nachbearbeiten mußt:
Subtype Feld1 Feld 2 Feld 3
1 1 2 3
1 1 2 1
2 6 5 6
2 4 5 6
2. Benötigst Du auch Domänen?
(Das wird schwierig)
Viele Grüße
Jörg Ostendorp
Gespeichert von Gast am Do., 13.05.2004 - 07:56
Permalinknein Domänen brauch ich nicht und die Subtyps sind Feste Werte die werden auch nachträglich nach dem erfassen des Polygons nicht bearbeitet, nur eventuell in der Standaloentabelle, wenn sich mal eine Bezeichnung geändert hat oder ein neue Fachbedeutung ist dazu gekommen u.s.w.
auf jeden fall brauch ich eine Combobox was so ähnlich abgebildet ist wie ein Subtyps.
Die Standaloentabelle ist ja im Hintergrund, der Anwender braucht es ja nicht zusehen, es muss nur wissen was für eine Fachbedeutung er gerade digitalisieren möchte, und die dann in der Combobox auswählen, die restlichen Sachdaten sollen ja automatisch eingefügt werden.
Gruß Anja
Gespeichert von Gast am Do., 13.05.2004 - 23:41
PermalinkGut, dann hat das aber alles mit Subtypes nichts zu tun und Dein eigentliches Problem ist auch nicht das Ausfüllen von Feldern, sondern lediglich das Bereitstellen einer Auswahlliste. Was Du hast, ist ja eine einfache n:1-Beziehung zu einer Katalogtabelle "Fachbedeutung". Die Daten aus der Katalogtabelle mußt (und solltest) Du aber nicht jedes Mal in Deine Attributtabelle schreiben, sondern nur verknüpfen. Wenn Du für ein Feature dann eine Fachbedeutung angibst, werden auch automatisch die entsprechenden Werte aus Deiner Katalogtabelle angezeigt.
> auf jeden fall brauch ich eine Combobox was so ähnlich abgebildet ist wie ein Subtyps.
Gut, nur wie, wann und wo wolltest Du die genau anzeigen lassen? (Habe noch nie mit dem ArcEditor/ArcInfo gearbeitet und weiß nicht, wie das da geregelt ist).
Wenn direkt als Zelle im TableWindow, dann vergiß es. Soweit ich weiß stellt ArcView dafür keine Methoden zur verfügung, da müßtest wohl per API ran und da wäre der Aufwand wirklich viel zu hoch. Auch irgendwelche Konstrukte über Eingabeformulare würde ich für eine einzelne Combobox aus diversen Gründen für zu auffendig halten.
Die einfachste Möglichkeit wäre eine UI_Combobox, die Du zb in der Editor-Commandbar rechts neben die Layerauswahl setzt und bei passenden Layern aktivierst/neu lädst oder deaktivierst. Hier müßtest Du dann - wie beim Layer - *vor* dem Digitalisieren eine "Fachbedeutung" (oder was auch immer) angeben.
Könntest Du mit sowas leben (habe für sowas keinen Code fertig und keine Lust mir unnötig Arbeit zu machen ;-))?
Viele Grüße
Jörg Ostendorp
BTW: Was für ein Betriebssystem setzt Du ein ?
Ich hoffe, Du hast Access?
Gespeichert von Gast am Mo., 17.05.2004 - 15:10
PermalinkDanke für dein Tipp mit dem UIcombobox,werde das versuchen zu realisieren.
Habe XP und Access.
gruß Anja
Gespeichert von Gast am Mo., 17.05.2004 - 19:30
Permalinkahh, zwischenzeitlich hab ichs endgültig verstanden, schwere Geburt :-)
Bin gerade durch Zufall auf der Esri-Homepage über eine Abbildung der Subtypes gestolpert.
Also, ich sehe im Prinzip keine Möglichkeit, das so 1:1 umzusetzen und halte die zuzsätzliche Combobox tatsächlich für die einzig praktikable Lösung.
(Die einzige 1:1-Lösung die ich mir vorstellen könnte, wäre reines Api-Gedaddel und hätte mit den ArcObjects nur noch am Rande was zu tun. Und zumindest mir wär das dann auch schon ein bißchen zu hoch).
Habe gerade ein bißchen gebastelt und finde die folgenden Weg eigentlich ganz akzeptabel. Kannst es ja mal ausprobieren:
- Erstell Dir eine Accessdatenbank. Name und Pfad sind egal. Diese Datenbank dient als Container für Deine "Standalone"- bzw. Katalogtabellen. Du kannst sie später von allen mxds aus nutzen (selbstreden aber auch neue DBs anlegen). In der Accesdatenbank legst Dir Deine verschiedenen Katalogtabellen an.
Als erste vier Felder müßtest Du noch jeweils einfügen (in dieser Reihenfolge):
1. Ein Feld "Reihenfolge", Feldtyp long
2. "Bezeichnung", Feldtyp "Text"
3. "Wert", Feldtyp je nach zu speicherndem Wert unterschiedlich (Text, Long, Integer, Double oder Single) s.u.
4. "Standard", Feldtyp Boolean (ja/nein)
5. es folgen Deine weiteren Attributfelder für die jeweilige Tabelle
-Reihenfolge gibt eine Sortierung für die Combobox vor
-Bezeichnung gibt den Text vor, der in der Combobox erscheinen soll
-Wert ist das Feld, mit dem Du
a) die Tabellen zu einem Feld in der Attributtabelle Deines Layers
b) dessen Wert in die Attributtabelle geschrieben wird
es muß somit vom gleichen Feldtyp sein wie das Feld in der Attributtabelle.
- Standard, gehört eigentlich nicht in diese Tabelle ist aber einfacher so. Du
kannst hier einen Datensatz ("Subtype") auswählen, der als Standard
im Combifeld angezeigt werden soll.
Wie Du die Tabellen bennenst ist egal.
Bsp "tblBundesänder" (leider klappt das hier mit der Formatierung nicht so richtig)
Reihenfolge | Bezeichnung | Wert | Standard | Attribut1(zB Hauptstadt)| Attribut2()...
1 | BAY | 1 | false | Bayern | München | ...
3 | NRW | 3 | true | Nordrhein-Westfalen | Düsseldorf | ...
2 | B | 2 | false | Berlin | ...
(Als Wert könnte hier natürlich auch ein Text etc. stehen...)
Dann fehlt nur noch eine Tabelle mit Namen "tblLinkTable" in der Du Angeben machst welcher Layer mit welcher Accesstabelle verbunden werden soll.
Die Tabelle muß folgende Felder enthalten:
1. "Layer", Typ Text, auf Feldlänge 255 erweitern
2. "Tabelle", Typ Text
3. "LSchlüssel", Typ text
-Layer: vollständiger Pfad zu Deiner Shapedatei
-Tabelle: Hier gibts Du den Namen der Katalog-Ta belle in der Accessdatenbank an, die die Daten für die entsprechende Shapedatei enthält
-LSchlüssel ist der Feldname des Feldes in der Attributtabelle, das mit dem Feld WERT Deiner Accesstabelle verknüpft wird.
Bsp "tblLinkTable"
Layer | Tabelle | LSchlüssel
C:\Landkreise.shp | tblBundesländer | Bundesland
C:\Landkreise.shp | tblWasAnderes | NochEinFeld
C:\Gemeinden.shp | tblLandkreise | Landkreis
etc.
Die Layer-Attributtabelle
Ich hoffe, das ist soweit verständlich?
- In ArcView müßtest Du Dir eine Combobox anlegen mit Namen "UIComboBoxControl1" und sie in eine Commandbar setzen (sinnvollerweise in den Editor).
- Anschließend kannst Du einfach folgenden Code (s.u.) ins Projekt kopieren (alles in Thisdocument). Du müßtest lediglich noch
a) in der MxDocument_OpenDocument-Prozedur den korrekten Pfad zu Deiner Accessdatenbank angeben und
b) im VBE unter "Extras" einen Verweis auf ADO setzen (Microsoft Activex Data Object (2.7 (?), weiß nicht genau welche Version das bei XP ist, sollte auf jeden Fall die neueste sein.
- Zuguterletzt müßtest Du nur noch Deine Layer mit den Access-Tabellen (Feld: Wert) oder entsprechenden Abfragenverknüpfen. Dabei müssen wie gesagt die Feldtypen identisch sein.
Fertig.
Jedesmal wenn Du Du eine Editiersitzung startest bzw einen Layer auswählst wird geprüft, ob es in der angegebenen Datenbank eine Katalogtabelle gibt. Wenn ja wird das Combifeld aktiviert und entsprechend gefüllt. Wählst Du in der Combobox einen Eintrag aus und erstellt dann ein neues Feature, wird der entsprechende *Wert* in das entsprechende Feld der Attributtabelle geschrieben. Durch die Verknüpfung werden auch die anderen Attribute der Katalogtabelle angezeigt, sind vor Bearbeitung aber geschützt. (Die Anzeige der verküpften Feldern erfolgt nur in der Attributtabelle und im Identifizieren-Tool, nicht im AttributeWindow, was, wie ich denke, von Esri durchaus so beabsichtigt und eigentlich auch sinnvoll ist).
Kleiner Nachteil ist eben, daß die Auswahl kann nur vor dem Digitalisieren getroffen werden. Verzichten müßtest Du auf jeden Fall auf eine nachträgliche Auswahlmöglichkeit per Kombifeld im Attribute- bzw TableWindow.
Viele Grüße
Jörg Ostendorp
Hier noch der Code:
Option Explicit
'EditEvents
Private WithEvents EditEvents As esriCore.Editor
'Variablen
Private mEditor As IEditor
Private mCatDB As String ' Pfad zur DB
Private mCatTab As String ' Tabelle in der DB,
'die Angaben zur Beziehung Layer - Katalogtabellen enthält
Private mComboEnabled As Boolean
Private mWert As String
'Prozeduren
'Beim Erstellen eines neuen Features
Private Sub EditEvents_OnCreateFeature(ByVal obj As IObject)
obj.Store
If GetFeldwert = "" Or GetPrimaryKey = "" Then
Exit Sub
End If
Dim pFeat As IFeature
Dim pTab As ITable
Dim strLayer As String
Dim strFieldName As String
Dim varValue As Variant
Dim idx As Long
Dim pFieldEdit As IFieldEdit
Dim pField As IField
Set pFeat = obj
Set pTab = pFeat.Table
strLayer = pFeat.Class.AliasName
strFieldName = GetPrimaryKey
idx = pTab.Fields.FindField(strFieldName)
Set pField = pTab.Fields.Field(idx)
Set pFieldEdit = pTab.Fields.Field(idx)
varValue = GetFeldwert
If pField.Type = esriFieldTypeSmallInteger Then
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CInt(varValue)
ElseIf pField.Type = esriFieldTypeInteger Then
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CLng(varValue)
ElseIf pField.Type = esriFieldTypeSingle Then
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CSng(varValue)
ElseIf pField.Type = esriFieldTypeDouble Then
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CDbl(varValue)
ElseIf pField.Type = esriFieldTypeString Then
pFeat.Value(pFeat.Fields.FindField(strFieldName)) = CStr(varValue)
Else ' Datum, Geometrie, OID, Blob
'nichts machen, gibt nur Ärger
End If
pFeat.Store
End Sub
'Bei neuer Layerauswahl Combo neu Laden
Private Sub EditEvents_OnCurrentLayerChanged()
ComboLaden
End Sub
Private Function MxDocument_OpenDocument() As Boolean
Dim pID As New UID
pID = "esriCore.Editor"
Set mEditor = Application.FindExtensionByCLSID(pID)
Set EditEvents = mEditor
mCatDB = "Hier den Pfad zu Deiner Access-Datenbank angeben"
mCatTab = "tblLinkTable"
End Function
Private Sub Test_Click()
Dim pID As New UID
pID = "esriCore.Editor"
Set mEditor = Application.FindExtensionByCLSID(pID)
Set EditEvents = mEditor
MsgBox pID.Generate
End Sub
Private Function UIComboBoxControl1_Enabled() As Boolean
If mComboEnabled = True Then
UIComboBoxControl1_Enabled = True
Else
UIComboBoxControl1_Enabled = False
End If
End Function
Private Sub UIComboBoxControl1_SelectionChange(ByVal newIndex As Long)
mWert = UIComboBoxControl1.EditText
End Sub
Private Sub ComboLaden()
UIComboBoxControl1.RemoveAll
mWert = ""
Dim Conn As ADODB.Connection
Dim strConn As String
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim rst3 As ADODB.Recordset
Dim strsql As String
Dim strtab As String
Dim strStandard As String
strStandard = ""
Set Conn = New ADODB.Connection
Set rst1 = New ADODB.Recordset
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & mCatDB
Conn.Open strConn
strsql = "Select Tabelle from " & mCatTab & " where Layer = '" & GetCurrentLayer & "'"
rst1.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
If Not rst1.BOF And Not rst1.EOF Then
rst1.MoveFirst
strtab = rst1.Fields(0)
mComboEnabled = True
strsql = "Select * from " & strtab & " order by 1"
Set rst2 = New ADODB.Recordset
rst2.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
UIComboBoxControl1.AddItem "<keine Auswahl>"
Do While Not rst2.EOF
UIComboBoxControl1.AddItem rst2.Fields(1)
rst2.MoveNext
Loop
rst2.Close
Set rst2 = Nothing
strsql = "Select Bezeichnung from " & strtab & " where Standard = true Order by 1"
Set rst3 = New ADODB.Recordset
rst3.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
If Not rst3.BOF And Not rst3.EOF Then
rst3.MoveFirst
strStandard = rst3.Fields(0)
UIComboBoxControl1.EditText = strStandard
mWert = strStandard
End If
rst3.Close
Set rst3 = Nothing
Else
mComboEnabled = False
rst1.Close
Set rst1 = Nothing
Exit Sub
End If
rst1.Close
Set rst1 = Nothing
Set Conn = Nothing
End Sub
'Feld in der Layer-Tabelle ermitteln
Private Function GetPrimaryKey() As String
GetPrimaryKey = ""
Dim Conn As ADODB.Connection
Dim strConn As String
Dim rst As ADODB.Recordset
Dim strsql As String
Dim strtab As String
Dim strStandard As String
strStandard = ""
Set Conn = New ADODB.Connection
Set rst = New ADODB.Recordset
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & mCatDB
Conn.Open strConn
strsql = "Select LSchlüssel from " & mCatTab & " where Layer =
Gespeichert von Gast am Mo., 17.05.2004 - 19:35
Permalinkstrsql = "Select LSchlüssel from " & mCatTab & " where Layer = '" & GetCurrentLayer & "'"
rst.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
If Not rst.BOF And Not rst.EOF Then
rst.MoveFirst
GetPrimaryKey = rst.Fields(0)
End If
End Function
'Zugehörigen Wert des Comboboxeintrages ermitteln
Private Function GetFeldwert() As Variant
Dim Conn As ADODB.Connection
Dim strConn As String
Dim rst1 As ADODB.Recordset
Dim rst2 As ADODB.Recordset
Dim strsql As String
Dim strtab As String
Dim strStandard As String
strStandard = ""
Set Conn = New ADODB.Connection
Set rst1 = New ADODB.Recordset
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & mCatDB
Conn.Open strConn
strsql = "Select Tabelle from " & mCatTab & " where Layer = '" & GetCurrentLayer & "'"
rst1.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
If Not rst1.BOF And Not rst1.EOF Then
rst1.MoveFirst
strtab = rst1.Fields(0)
mComboEnabled = True
strsql = "Select Wert from " & strtab & " where Bezeichnung = '" & mWert & "'"
Set rst2 = New ADODB.Recordset
rst2.Open strsql, strConn, adOpenForwardOnly, adLockOptimistic
If Not rst2.BOF And Not rst2.EOF Then
rst2.MoveFirst
GetFeldwert = rst2.Fields(0)
'Hier ggf. Feldtyp prüfen
End If
rst2.Close
Set rst2 = Nothing
End If
rst1.Close
Set rst1 = Nothing
Set Conn = Nothing
End Function
'Pfad des ausgewählten Layers ermitteln
Private Function GetLayerFullSource(pLayer As ILayer) As String
Dim path As String
If TypeOf pLayer Is IFeaturelayer Then
Dim pFLayer As IFeaturelayer
Dim pd As IDataset
Set pFLayer = pLayer
Set pd = pFLayer.FeatureClass
path = pd.Workspace.PathName & "\" & pd.Name & ".shp"
GetLayerFullSource = path
End If
End Function
'Ausgewählten Layer ermitteln
Private Function GetCurrentLayer() As String
Dim pEditLayers As IEditLayers
Set pEditLayers = mEditor
If Not pEditLayers.CurrentLayer Is Nothing Then
Dim pLayer As ILayer
Set pLayer = pEditLayers.CurrentLayer
GetCurrentLayer = GetLayerFullSource(pLayer)
Else
GetCurrentLayer = ""
End If
End Function
Gespeichert von Gast am Mo., 17.05.2004 - 21:32
PermalinkViele Grüße
Jörg Ostendorp
Gespeichert von Gast am Di., 18.05.2004 - 14:18
Permalinkerst mal herzlichen dank für die mühe die du gemacht hast, ich finde du hast sehr gute Kenntnisse in ArcObjects, was ich nicht von mir behaupten kann, wie lange arbeitest du schon mit ArcGIS? Leider konnte ich das alles nicht so umsetzten können wie du es mir beschrieben hast, es sind noch einige Details offen die ich dir noch schildern muß.
1. Die Daten die ich benutze liegen in Geodatabase vor.
2. In dieser Geodatabase gibt es einen Feature - Dataset und dort sind alle Feature-Class
(Point,Polygon,Polyline u.s.w.)
3. In ArcView habe noch in TOC also im Dataframe die Feature-Class Gruppiert, wegen
der Übersichtlichkeit.
4. Die Standalone Tabellen sind auch in der Geodatabase.
wenn du sagst.
„ Zuguterletzt müsstest Du nur noch Deine Layer mit den Access-Tabellen (Feld: Wert)
oder entsprechenden Abfragenverknüpfen. Dabei müssen wie gesagt die Feldtypen
identisch sein.“
was genau meinst du damit? etwa Join?.
weil’s das ist keine so gute Idee, weil nämlich dann die Daten von der Standalone
Tabelle alle in der Attributtabelle stehen und das will ich ja gerade nicht.
es sollen aus der Standalone Tabelle nur heraus gelesen werden in die Attributtabelle
geschrieben werden.
Ein Wort zu Access: würde am liebsten nur ArcGIS verwenden kein Access oder andere
externe Programme.
was meinst du dazu, ob das machbar ist ?
gruß Anja
Gespeichert von Gast am Di., 18.05.2004 - 21:37
Permalinkalso um Access kommst Du nicht herum, ohne Access gibts schließlich auch keine Personal-Geodatabase :-)
Aber ob Du eine PGDB oder eine separate DB für Deine Standalone-Tabellen nimmst ist egal (Code muß etwas angepaßt werden), ebenso ob Du mit Gruppenlayern arbeitest oder nicht.
(Eine zentrale DB hätte den Vorteil einer gewissen Übersichtlichkeit. Bei eine PGDB hingegen mußt Du zB keinen Pfad mehr zur Datenbank angeben, den kannst Du Dir dann ja aus dem aktuellen Layer auslesen.
Du könntest aber auch eine zentrale DB machen und Dir daraus die entsprechenden Tabellen in Deine verschiedenen PGDBs verknüpfen (per Access). Wenn Du zB eine bestimmte Katalogtabelle in mehreren PGDBs verwendest, müßtest Du sie nur einmal zentral speichern, was dann auch die Datenpflege erheblich vereinfachen würde (die Weitergabe der Daten hingegen wieder (ein klein wenig) erschweren)).
Wie hast Du denn Deine Standalone-Tabellen denn in der PGDB angelegt? Mit ArcCatalog?
Und vor allem: wie bearbeitest Du sie, wenn nicht mit Access?
Wie auch immer, ich komme aber noch nicht mit Deiner Datenhaltung klar (aber ich bin zuversichtlich, daß wir noch zueinder finden):
> weil’s das ist keine so gute Idee, weil nämlich dann die Daten
> von der Standalone Tabelle alle in der Attributtabelle stehen
> und das will ich ja gerade nicht.
.."alle".. Nein, das will ich auch nicht, und das passiert beim Verknüpfen in ArcView auch eben gerade nicht.
> es sollen aus der Standalone Tabelle nur heraus gelesen werden
> in die Attributtabelle geschrieben werden.
ja, fast haben wir's: *was* soll rausgelesen und reingeschreiben werden?
Alles worauf ich hinaus will, ist die Einhaltung von Normalisierungsregeln (soweit das in diesem Pseudo-RDBMS von ArcView halt möglich ist)
siehe zb http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/ , besonders 3.NF: transitive Abhängigkeit.
Die transitiv abhängigen Felder hast Du ja sozusagen schon korrekt von der Attribut- in die Standalone-Tabelle "ausgelagert" (indem Du eben eine Standalone-Tabelle verwendest). Nun solltest Du diese ausgelagerten Felder natürlich nicht alle wieder in die Attributtabelle zurückschreiben: Das einzige Feld der Standalonetabelle, das in der Attributtabelle gespeichert wird, ist deren Primärschlüssel. Da Du im Identifyer aber nicht nur das Primärschlüsselfeld (zB die Nummer Deiner Fachbedeutung) sehen willst sondern auch die zugehörigen anderen Felder der Standalone-Tabelle (zB Kurzname, Name etc) verbindest Du beide Tabellen in ArcView: Layer-Kontextmenü --> Verbindungen und Beziehungen --> Verbinden...
Durch das Verknüpfen/Verbinden werden die Standalone-Daten auch in der Attributtabelle *angezeigt*, werden dort aber nicht *gespeichert*. Sie können somit auch von dort aus nicht bearbeitet resp. verhunzt werden.
Alles andere ist Murks und führt nur zu Problemen (-> Aktualisierungsanomalien, Dateninkonstistenz).
Meinen wir das gleiche? :-)
Sonst sag nochmal wie Du's *genau* machen wolltest...
Viele Grüße
Jörg Ostendorp
PS: *g* Benutze ArcGIS seit einem Jahr.
Gespeichert von Gast am Do., 03.06.2004 - 09:06
Permalink>Und vor allem: wie bearbeitest Du sie, wenn nicht mit Access?
ja mit ArcCatalog und bearbeite es in ArcMap.
Das mit dem Verknüpfen habe ich jetzt auch verstanden :-)
>ja, fast haben wir's: *was* soll rausgelesen und reingeschrieben werden?
Die Attribute die in der Standalone Tabelle stehen. Zu jedem Objekt gibt es einen bestimmten Schlüssel der noch weitere Attribute besitzt.
wenn man jetzt eine neue Fläche (Objekt)gezeichnet hat sollen die Attribute übertragen werden.
Ein Combobox hab ich erstellt aus dem ich mein Text auswählen kann.
jetzt muß ich es nur noch aus der Standalone-Tabelle auslesen und in das neue Objekt übertragen.
hier komm ich nicht weiter :-(
gruß Anja
Gespeichert von Gast am Do., 03.06.2004 - 10:56
Permalinkglaube es wäre das einfachste, wenn Du mir mal Deine mxd samt PGDB mit einigen Beispieldaten zumailst (bitte gezippt und < 2MB/Datei).
JoergOstendorp@web.de
Bin aber gerade etwas im Umzugsstress. Kann daher etwas dauern, bis ich dazu komme, mir das mal angucken zu können.
Viele Grüße
Jörg Ostendorp