ArcView: Stützpunkte in Tabelle: Unterschied zwischen den Versionen
(→ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas) |
(→ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas) |
||
Zeile 1: | Zeile 1: | ||
===ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas === | ===ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas === | ||
− | Dies ist ein Script aus der Extension von Stephen Lead. | + | Dies ist ein Script aus der Extension von Stephen Lead. [http://arcscripts.esri.com/details.asp?dbid=12395 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 [http://arcscripts.esri.com/details.asp?dbid=11526 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. | Das Tabellenergebnis besteht aus X-, Y- und Z-Werten. Die ID' der Shapes werden nicht übernommen. Diesbezüglich müsste das Script angepasst werden. |
Version vom 31. Mai 2005, 20:30 Uhr
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