ArcView: Stützpunkte in Tabelle
ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas
Dies ist ein Script aus der Extension von Stephen Lead. Die Extension ist im Original bei Esri downloadbar. Da die Extension bei mir nicht funktionierte, habe ich das relevante Script herausgezogen und hier eingestellt. Vor dem Ablaufen des Scripts muss das Polygon- oder Polylinethema bereinigt werden: Multipart Shape zu Singlepart Shape, z.B mit den XTools (bei Esri downloadbar.
Das Tabellenergebnis besteht aus X-, Y- und Z-Werten. Die ID' der Shapes werden nicht übernommen. Diesbezüglich müsste das Script angepasst werden.
(von heinzJ)
Ich habe das Script um ein neues Feld (ID) erweitert. Die ID ergibt sich aus der Datensatznummer des Eingabethemas und ermöglicht 1 : n Beziehungen zwischen Eingabe- und Ergebnisthema.
Das Script wurde auch dahin gehend erweitert, dass doppelte Punkte bei Bedarf beibehalten werden können (alle Stützpunkte werden in die Ergebnistabelle aufgenommen). Die Voreinstellung ist 1 (=alle)
(von heinzJ)
'
' Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas
'
' History
' 23 September 2002 - original coding, Stephen Lead (based on nodepoint.apr)
' 18 November 2002 - now uses selected features if they exist. Calculates the Z value of each
' vertex in a polylineZ or polygonZ dataset. Fixed bug in install script.
' 13 März 2003 - Übersetzung ins Deutsche (nur das Notwendigste)
'
' Erweiterung um ein neues Feld (ID). Die ID ergibt sich aus der Datensatznummer
' des Eingabethemas und ermöglicht 1 : n Beziehungen zwischen Eingabe- und
' Ergebnisthema.
'
' Erweiterung des Scripts um die Möglichkeit doppelte Punkte beizubehalten.
' Siehe Variable DeleteDopellte weiter unten
'
'
' Please report any problems or comments to slead@esriau.com.au
' Melden Sie bitte Probleme oder Komentare zur Erweiterung an h-j.luecking@t-online.de
'
' THIS SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
'
' DeleteDopellte: Doppelte Punkte im Ergebnisthema löschen (=0) oder nicht (=1)
' Die Beibehaltung doppelter Punkte wirkt sich positiv auf die Geschwindigkeit aus und
' gibt zudem - bei Bedarf - alle Stützpunkte wieder.
DeleteDopellte = 1
theView = av.GetActiveDoc
thePrj = theView.GetProjection
theThm = theView.GetActiveThemes.Get(0)
theFTab = theThm.GetFTab
theShpFld = theFTab.FindField("shape")
'Falls das Thema im View editiert wird, dann beenden Sie bitte die Bearbeitung,
'bevor Sie weiterverfahren
editThm = theView.GetEditableTheme
if (editThm <> nil) then
doSave = MsgBox.YesNoCancel("Sollen die Änderungen im Thema "+editThm.GetName+" gespeichert werden?","Bearbeitung beenden",true)
if (doSave = nil) then
return nil
end
if (editThm.StopEditing(doSave).Not) then
MsgBox.Info("Speicherung der Änderungen nicht möglich "
+ editThm.GetName +", bitte nutzen Sie die Option Änderungen Speichern unter ...", "")
return nil
else
theView.SetEditableTheme(NIL)
end
end
def = av.GetProject.MakeFileName("arcpnt", "shp")
def = FileDialog.Put(def, "*.shp", "Geben Sie eine Namen für das Ergebnissthema ein")
if (def <> nil) then
pntFTab = FTab.MakeNew(def, point)
if (pntFTab.HasError) then
if (pntFTab.HasLockError) then
MsgBox.Error("Unable to acquire Write Lock for file " + def.GetBaseName, "")
else
MsgBox.Error("Unable to create " + def.GetBaseName, "")
end
return nil
end
'Add some fields to the point table.
pntShpFld = pntFTab.FindField("shape")
FlagFld = Field.Make("flag", #FIELD_DECIMAL, 1,0)
IDFld = Field.Make("ID",#FIELD_DECIMAL, 16, 0)
XFld = Field.Make("x_coord",#FIELD_DOUBLE, 16, 6)
YFld = Field.Make("y_coord",#FIELD_DOUBLE, 16, 6)
ZFld = Field.Make("z_value",#FIELD_DOUBLE, 16, 6)
pntFTab.AddFields({FlagFld, IDFld, XFld, YFld, ZFld})
'Convert each vertex in each selected arc in the shapefile to a point.
av.UseWaitCursor
theBitMap = theFTab.GetSelection
if (theBitMap.Count = 0) then
theBitMap = theFTab
end
for each rec in theBitMap
theArc = theFTab.ReturnValue(theShpFld, rec)
hasZValue = theArc.HasZ
thePoints = theArc.AsList.Get(0)
for each aPoint in thePoints
theRec = pntFTab.AddRecord
pntFTab.SetValue(pntShpFld,theRec,aPoint)
pntFTab.SetValue(FlagFld,theRec,1)
pntFTab.SetValue(IdFld,theRec,rec)
pntFTab.SetValue(XFld,theRec,aPoint.GetX)
pntFTab.SetValue(YFld,theRec,aPoint.GetY)
if(aPoint.HasZ) then
pntFTab.SetValue(ZFld,theRec,aPoint.GetZ)
end
end
end
If (DeleteDopellte = 0) then
'Identify duplicate points (these will exist at arc intersections)
for each rec in pntFTab
av.UseWaitCursor
theFlag = pntFTab.ReturnValue(flagFld,rec)
if(theFlag = 1) then
theBitMap = pntFTab.GetSelection
thePoint = pntFTab.ReturnValue(pntShpFld,rec)
'Search for other normal points coincident with this one.
pntFTab.SelectByPoint(thePoint,0,#VTAB_SELTYPE_NEW)
'You could include a clause here to consider item values.
'eg pntFTab.Query(item = x, theBitMap, #VTAB_SELTYPE_AND), etc
'Keep the first point, but mark the others for deletion.
theBitMap = pntFTab.GetSelection
if(theBitMap.Count > 1) then
theBitOffSet = -1
for each i in 0 .. (theBitMap.Count - 2)
theBitOffSet = theBitMap.GetNextSet(theBitOffset)
pntFTab.SetValue(FlagFld,theBitOffSet,9)
end
end
end
end
end
pntFTab.SetEditable(true)
pntTheme = FTheme.Make(pntFTab)
theView.AddTheme(pntTheme)
pntTheme.SetVisible(true)
If (DeleteDopellte = 0) then
'Remove the duplicate points - these will have FLAG = 9.
'Also remove the temporary flag field.
theBitMap = pntFTab.GetSelection
pntFTab.Query("[[Flag]]" + "= 9",theBitMap,#VTAB_SELTYPE_NEW)
pntFTab.RemoveRecords(pntFTab.GetSelection.Clone)
end
pntFTab.RemoveFields({FlagFld})
pntTheme.StopEditing(true)
pntFTab.SetEditable(false)
av.GetProject.SetModified(true)
end