H/V/A-Abhaengigkeiten im Batch-Modus

Gibt es eine Funktion mit dem 3D-Analyst oder mit Hilfe eines Scripts die Flaechen- Volumenberechnung eines TINS oder GRIDS im Batchmodus zu verarbeiten?

Es soll sich eine Tabelle ergeben, wo sich die Flaeche und das Volumen aus der festgelegten Hoehe ergibt. Sicherlich waere es eine Moeglichkeit die Prozedur einzeln durchzufuehren. Ich wuerde es aber gerne etwas automatisierter haben.
Mich würde das auch interessieren. Das ständige Eingeben von Höhenwerten in die Area-Volume-Tool-Maske ist ziemlich nervenaufreibend.

GISbert

PS: Hast Du schon eine Lösung gefunden?
Hi GISbert,

leider noch nicht. Wie ich gesehen habe wurde das Thema noch vor kurzem unter http://www.anuva.de/service_arcforum.php?action=vthread&forum=2&topic= 2881 angesprochen.

Maxilla hat da einen Tipp mit dem Modellbuilder gegeben. Da ich momentan etwas wenig Zeit habe, konnte ich ihn mir nur fluechtig anschauen.

Grundsaetzlich habe ich es hinbekommen ein Modell in der Art zu basteln, was von der Løsung noch weit entfernt ist. Da Area/Volume anhand der Høhe berechnet wird ist es bloed, dass sie nur einzeln eingegeben werden kann. Es muss also entweder eine Moeglichkeit geben mehrere Hoehen mit einem mal einzugeben oder eine Datei (dbf oder ASCII) muss eingelesen werden, die die Hoehen enthaelt. Daraus soll dann der 3D Analyst dann A und V berechnen.

Wenn jemand also eine Idee hat oder weiss wie son Ding zu basteln ist, bitte posten...
Hallo Novosibirsk,

ja den Thread mit dem Modelbuilder habe ich auch verfolgt. Ich habe es auch mal mit dem Modelbuilder probiert, bin aber nicht entscheidend weitergekommen.

In ArcView 3 (wenn es erlaubt ist mal kurz in die andere Produktfamilie umzuschwenken) habe ich mir im Scripteditor das Systemscript "3D.AreaVolumeStats" eingeladen. Ich denke hier liegt ein Ansatzpunkt. Es ist das Systemscript um die Area-Volume-Berechnung anhand einer Höhe durchführen zu können. Wenn man dieses Script mit seinen Messageboxen und Eingabemasken so umprogrammiert, dass man mit Höhenwerten VON-BIS und mit einem Intervall agieren könnte, hätte man ja die Lösung. Vorausgesetzt man beherrscht AVENUE. Ich leider nicht. Aber vielleicht kann da jemand ein paar kurze Tips geben, welche Anweisungen notwendig wären...und den Rest muss man (ich) dann eben learning-by-doing ausprobieren.

Gruß,

GISbert
In AV3 ist das einigermaßen einfach:

' 3D.AreaVolumeStats_Batch
' Aktives View, aktives TIN

theView = av.GetActiveDoc

theTheme = theView.GetActiveThemes.Get(0) 'TIN !
s = theTheme.GetSurface

'LISTE DER HÖHEN HIER EINTIPPEN:
theBHList = {1,2,3,4,5,6,7}

'UBER DEN BASISHÖHEN = FALSE, UNTER = TRUE:
below = FALSE

if (below) then
bStr = "BELOW"
else
bStr = "ABOVE"
end

theRep = ""
for each datum in theBHList
area = s.Area(datum, below, TRUE)
sarea = s.Area(datum, below, FALSE)
volum = s.Volume(datum, below)
theRep = theRep+bStr++"base height of"++datum.asString +nl+
"Planimetric Area = " + area.SetFormat("d.ddd").asString+nl+
"Surface Area = " + sarea.SetFormat("d.ddd").asString+nl+
"Volume = " + volum.SetFormat("d.ddd").asString+nl+nl
end

MsgBox.Report(theRep,"Area and Volume Statistics")


Gruß von Mx.
Hallo Maxilla,

toll! Das hat geholfen. Und da das ganze gar nicht so schwer aussieht, werde ich mich wohl auch mal ans Programmieren wagen....

Danke, Maxilla!

Gruß,

GISbert
...und so in der Art würde das dann mit deiner Intervall-Idee aussehen:

' 3D_AreaVolumeStats_Batch
' Aktives View, aktives TIN

theView = av.GetActiveDoc
if (theView.Is(View).Not) then return NIL end
theTheme = theView.GetActiveThemes.Get(0) 'TIN !
if (theTheme.Is(STheme).Not) then return NIL end
s = theTheme.GetSurface

theLabs = {"From:"," To:","Step size:"}
theDefs = {"1","20","1.0"}
theInt = MsgBox.MultiInput("Enter an interval:","Base heights Interval",
theLabs,theDefs)
if (theInt.count = 0) then return nil end

theMin = theInt.Get(0).AsNumber
theMax = theInt.Get(1).AsNumber
theInc = theInt.Get(2).AsNumber

choices = {"Above","Below"}
bStr = MsgBox.ChoiceAsString(choices,"Calculate from which direction of base height:",
"Area and Volume Statistics")
if (bStr = NIL) then return NIL end
if (bStr = "Above") then
below = FALSE
else
below = TRUE
end

theRep = ""
for each datum in theMin..theMax by theInc
area = s.Area(datum, below, TRUE)
sarea = s.Area(datum, below, FALSE)
volum = s.Volume(datum, below)
theRep = theRep+bStr.AsString.UCase++"base height of"++datum.asString +nl+
"Planimetric Area = " + area.SetFormat("d.ddd").asString+nl+
"Surface Area = " + sarea.SetFormat("d.ddd").asString+nl+
"Volume = " + volum.SetFormat("d.ddd").asString+nl+nl
end

MsgBox.Report(theRep,"Area and Volume Statistics")
Wow, vielen Dank Maxilla. Hast Du das Script "mal eben gebastelt"?

Ich habe sonst noch sowas in der Art unter http://arcscripts.esri.com/details.asp?dbid=14349 gefunden. Hab es sebler noch nicht ausprobiert. Dennoch wirkt das gepostete AvenueScript besser aus mich.
Nun ja, so toll ist das nicht: Das Schöne an ArcView 3 ist ja, dass das System-Skript in solchen Fällen fertig vorliegt und nur noch ein bissl getoastet werden muss...

Genau das ist es, was mir in ArcGIS am meisten fehlt: der Zugriff auf den Basic-Code.

Gruß von Mx.
Dann gebe mir doch einfach mal einen Tipp, wie ich am besten mit etwas GIS-Programmierung anfange.

Als erstes waere ein Uebrblick ueber die Moeglichkeiten sinvoll, damit ich mich fuer eine Richtung entscheiden kann (Avenue, VB, Python etc.)

Dann waeren praktische Tutorials oder aehnliches ganz gut. Gibt es sowas im I-Net oder ein gutes Buch, welches Du mir empfehlen kannst?