ArcView: Stützpunkte in Tabelle: Unterschied zwischen den Versionen

GISWiki - Das freie Portal für Geoinformatik (GIS)
Wechseln zu: Navigation, Suche
(ArcPoint - Erstellt ein Punktthema aus den Stützpunkten eines Polyline/Polygonthemas)
 
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt)
Zeile 173: Zeile 173:
  
  
[[Kategorie:ArcView 3.x]]
+
[[Kategorie:ArcView]]
 +
[[Kategorie:Avenue]]

Aktuelle Version vom 15. November 2005, 20:31 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)

Download


'
' 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