Hallo,
mit Hilfe des folgenden sciptes habe ich Koordinaten der Stützpunkte eines Polygons in eine txt-Datei auslesen können.
Das hat bisher auch wunderbar funktioniert.
Jetzt tauscht aber ein vb-Fehler auf.
Kann mir jemand helfen ?
***********************************
Hier der text vom scipt:
>>>
Function VertexToTextFile(TextFile As String)
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pEnF As IEnumFeature
Dim pFea As IFeature
Dim pPC As IPointCollection
Dim pP As IPoint
Dim i As Integer
Dim lFileID As Long
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap
Set pEnF = pMap.FeatureSelection
Set pFea = pEnF.Next
Dim x As Integer
'Dim x As float
x = 0
If Not pFea Is Nothing Then
lFileID = FreeFile()
Open TextFile For Append As lFileID
Print #lFileID, ""
Print #lFileID, "######### " & Now & " #############"
Do While Not pFea Is Nothing
x = x + 1
Print #lFileID, "----------------------------------"
Print #lFileID, "Layer: " & pFea.Class.AliasName
Print #lFileID, "Object-ID: " & pFea.OID
'pFea.Value (3)
Print #lFileID, ""
Print #lFileID, " X Y"
Set pPC = pFea.Shape
For i = 0 To pPC.PointCount - 2 ' der letzte Punkt ist wieder der erste, daher -2 anstatt -1
Set pP = pPC.Point(i)
Print #lFileID, i & ". " & pP.x & " / " & pP.Y
Next i
Set pFea = pEnF.Next
Loop
' geändert durch Heuer, WNA Helmstddt am 22.12.2004
MsgBox "Koordinaten wurden übertragen nach C:\lis\PolyPunktKoordinaten.txt", vbInformation
Close lFileID
Else
' geändert durch Heuer, WNA Helmstddt am 22.12.2004
MsgBox "Sie haben kein Feature ausgewählt", vbCritical, "Bitte markieren Sie die Polygone oder Punkte, von denen Sie die Koordinaten übertragen möchten!"
End If
End Function
<<< (Ende script)
Hier ein Auszug aus dem bisherigem Ergebnis:
>>>
######### 20.01.2005 11:49:18 #############
----------------------------------
Layer: ALK-Bestell-flächen
Object-ID: 0
X Y
0. 4421512,789 / 5811892,41
1. 4421493,441 / 5811906,66
2. 4421321,309 / 5812035,005
...
18. 4421656,748 / 5811975,334
----------------------------------
Layer: ALK-Bestell-flächen
Object-ID: 1
X Y
0. 4421338,247 / 5811639,923
...
17. 4421688,61248875 / 5811841,6008789
----------------------------------
<<< (Ende Txt.Datei)
Der Fehler taucht in folgender Zeile auf:
>>>
Print #lFileID, "Object-ID: " & pFea.OID
<<<<
Die Attributtabelle des zu verwendenen Shapes hat folgende Spalten:
FID Shape ID RECHTSWERT HOCHWERT DATUM
0 Polygon 0,000 0,000 0
1 Polygon 0,000 0,000 0
2 Polygon 0,000 0,000 0
3 Polygon 0,000 0,000 0
4 Polygon 0,000 0,000 0
5 Polygon 4424004,000 5818060,000 0
6 Polygon 0,000 0,000 0
<<<<
Bisher wurde also der Inhalt der ersten Spalte für die Bezeichnung der Objekt-ID verwendet.
Jetzt ist dort ein Fehler.
Warum ?
D.Heuer
P.S. verwendet wird ArcView 8.2
mit Hilfe des folgenden sciptes habe ich Koordinaten der Stützpunkte eines Polygons in eine txt-Datei auslesen können.
Das hat bisher auch wunderbar funktioniert.
Jetzt tauscht aber ein vb-Fehler auf.
Kann mir jemand helfen ?
***********************************
Hier der text vom scipt:
>>>
Function VertexToTextFile(TextFile As String)
Dim pDoc As IMxDocument
Dim pMap As IMap
Dim pEnF As IEnumFeature
Dim pFea As IFeature
Dim pPC As IPointCollection
Dim pP As IPoint
Dim i As Integer
Dim lFileID As Long
Set pDoc = ThisDocument
Set pMap = pDoc.FocusMap
Set pEnF = pMap.FeatureSelection
Set pFea = pEnF.Next
Dim x As Integer
'Dim x As float
x = 0
If Not pFea Is Nothing Then
lFileID = FreeFile()
Open TextFile For Append As lFileID
Print #lFileID, ""
Print #lFileID, "######### " & Now & " #############"
Do While Not pFea Is Nothing
x = x + 1
Print #lFileID, "----------------------------------"
Print #lFileID, "Layer: " & pFea.Class.AliasName
Print #lFileID, "Object-ID: " & pFea.OID
'pFea.Value (3)
Print #lFileID, ""
Print #lFileID, " X Y"
Set pPC = pFea.Shape
For i = 0 To pPC.PointCount - 2 ' der letzte Punkt ist wieder der erste, daher -2 anstatt -1
Set pP = pPC.Point(i)
Print #lFileID, i & ". " & pP.x & " / " & pP.Y
Next i
Set pFea = pEnF.Next
Loop
' geändert durch Heuer, WNA Helmstddt am 22.12.2004
MsgBox "Koordinaten wurden übertragen nach C:\lis\PolyPunktKoordinaten.txt", vbInformation
Close lFileID
Else
' geändert durch Heuer, WNA Helmstddt am 22.12.2004
MsgBox "Sie haben kein Feature ausgewählt", vbCritical, "Bitte markieren Sie die Polygone oder Punkte, von denen Sie die Koordinaten übertragen möchten!"
End If
End Function
<<< (Ende script)
Hier ein Auszug aus dem bisherigem Ergebnis:
>>>
######### 20.01.2005 11:49:18 #############
----------------------------------
Layer: ALK-Bestell-flächen
Object-ID: 0
X Y
0. 4421512,789 / 5811892,41
1. 4421493,441 / 5811906,66
2. 4421321,309 / 5812035,005
...
18. 4421656,748 / 5811975,334
----------------------------------
Layer: ALK-Bestell-flächen
Object-ID: 1
X Y
0. 4421338,247 / 5811639,923
...
17. 4421688,61248875 / 5811841,6008789
----------------------------------
<<< (Ende Txt.Datei)
Der Fehler taucht in folgender Zeile auf:
>>>
Print #lFileID, "Object-ID: " & pFea.OID
<<<<
Die Attributtabelle des zu verwendenen Shapes hat folgende Spalten:
FID Shape ID RECHTSWERT HOCHWERT DATUM
0 Polygon 0,000 0,000 0
1 Polygon 0,000 0,000 0
2 Polygon 0,000 0,000 0
3 Polygon 0,000 0,000 0
4 Polygon 0,000 0,000 0
5 Polygon 4424004,000 5818060,000 0
6 Polygon 0,000 0,000 0
<<<<
Bisher wurde also der Inhalt der ersten Spalte für die Bezeichnung der Objekt-ID verwendet.
Jetzt ist dort ein Fehler.
Warum ?
D.Heuer
P.S. verwendet wird ArcView 8.2
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von ULange am Di., 25.01.2005 - 13:05
Permalinkhallo D.,
so trifft man sich.
Die Eigenschaft OID funktioniert meines Wissens nur bei FeatureClasses einer Geodatabase. Handelt es sich in deinem Falle um ein Shapefile?
Als Loesung kannst du statt der OID das Feld FID verwenden:
intFID = pFea.Fields.FindField("FID")
Print #lFileID, "Object-ID: " & pFea.Value(intFID)
For der Do-Schleife muss dann noch die Integervariable deklariert werden:
Dim intFID As Integer
Viel Erfolg und schoenen Gruss
U. Lange, BAW
Gespeichert von Heuer am Di., 25.01.2005 - 16:06
Permalinkzunächst die Beantwortung der Frage:
In meinem Fall handelt es sich um shape-Files.
Das Auslesen steht in Zusammmenhang mit dem Projekt "LIS" (Liegenschafts Informationssystem) der WSV (Wasser- und Schifffahrsverwaltung.
Wir benutzen "viele" Layer unterschiedlichster Art (von der Benennung der Felder laut Attributtabelle).
Der beschriebene Fehler ist zwar nicht mehr vorhanden, aber der Inhalt der ersten Spalte (Datensatznummer oder ähnliches) wird nicht ausgelesen.
Die Zeile
>>intFID = pFea.Fields.FindField("FID")<<
steht im Augenblick direkt vor der Zeile
>>Print #lFileID, "Object-ID (Flächennr.): " & pFea.Value(intFID) <<
Liegt hier vielleicht das Problem?
------------------------
Wenn ich mehrere Layer geladen und auch markiert habe, werden nach Drücken auf den Schaltbutton (womit dieser script gestartet wird) alle Koordinaten der betroffenen Polygone ausgelesen (also Super Funktion).
Jetzt besteht nur noch das Problem der Identifizierung der einzelen Polygone.
Könnte man da nicht darauf zurück greifen, dass im scipt definiert wird:
Lese den Inhalt der ersten Spalte (der Attributtabelle) (und der Reihe, zu der die Koordinaten ausgedruckt werden) aus und drucke ihn hinter die Beschreibung "Object-ID: " (Ich weiß nicht, ob der Name der Salte abgefragt werden kann, der ist nämlich immer unterschiedlich).
Als zweites habe ich noch folgende Frage zu den Koordianten:
Ist es möglich die x und y-Koordinaten als integer-Zahl (als links vom Komma abschneiden) zu definieren und auszudrucken ?
Wenn du hier weiterhelfen könntest, wäre das sicherlich eine sehr gute Funktion für andere (WSV)-GIS Anwender.
Gruß
D.Heuer
Gespeichert von ULange am Di., 25.01.2005 - 16:59
Permalinkfolgende Zeilen muessen ergaenzt werden, um den Wert eines bestimmten Feldes abfragen zu koennen:
' 1. neue Zeile: Neue Variable deklartieren
Dim pEnumFeatureSetup As IEnumFeatureSetup
:
:
Set pEnF = pMap.FeatureSelection
' 2. und 3. neue Zeile
Set pEnumFeatureSetup = pEnF 'QI
pEnumFeatureSetup.AllFields = True
Danach funktioniert es bei mir.
Der Code zur Formatierung der Kommastellen lautet:
' Keine Kommastelle
Print #lFileID, i & ". " & Format(pP.x, "0") & " / " & Format(pP.Y, "0")
' Zwei Kommastellen
Print #lFileID, i & ". " & Format(pP.x, "0.00") & " / " & Format(pP.Y, "0.00")
Schoenen Gruss
U. Lange
Gespeichert von Heuer am Mi., 26.01.2005 - 11:52
PermalinkBravo und vielen Dank.
In der vorliegenden Form funktiert es wunderbar.
Es können jetzt die Koordinaten (mit oder ohne Kommastellen) der Polygone, die übereinander auf unterschiedlichen Layern liegen, ausgelesen werden.
Zur Identifizierung des Features wird der Inhalt der ersten Spalte ausgelesen.
Wenn Bedarf besteht, kann ich den Inhalt komplett auch für andere Forennutzer zur Verfügung stellen.
Gruß aus Helmstedt
D. Heuer