Schummerungsbild in ArcGis 9.3

Hallo zusammen.
Ich muß demnächst von einem (größeren) DGM mehrere Schummerungsbilder generieren. ArcGis 9.3 ist verfügbar.
Ich bin zugegebener Weise das ArcGis 9 -Handbuch noch nicht ganz durch - ist ja auch ein doller Schmöker ;)
Doch bis jetzt bin ich noch nicht über die Lösung gestolpert. Sollte doch aber in ArcGis kein Problem sein?
Kann jemand mir armen Anfänger auf die Sprünge helfen?

Ciao
Andi
Hallo

Falls ich unter Schummerung das selbe verstehe, dann machst du das mit "Create Hillshade" mit dem Spatial-Analyst oder 3D-Analyst.

In der Symbologie kannst du ansonsten auch ein Hillshade-Effekt einschalten.


vg
Jo
Oha, habe die ArcToolboc gefunden mit 3DAnalyst Tools, und dort unter "Raster Surface" das "Hillshade"-Werkzeug. Funktioniert.

Damit komme ich zum zweiten Teil meiner Frage. Da ich eine größere Anzahl von Schummerungsbildern erstellen muß, wäre es nicht schlecht, das automatisieren zu können. So in der Art, "Klicke auf Knopf, und es werden 6-12 verschiedene Schummerungsbilder für das DGM mit voreingestellten Werten für Richtungswinkel und Höhenwinkel berechnet. Läßt sich sowas als VisualBasic-Script/Programm realisieren?

Ciao
Andi
Klasse, Danke, das ist doch schon mal ein Anfang. Hab das Hillshade-Werkzeug jetzt auch im Handbuch gefunden....
Hallo,
ja, daß geht. Du kannst auf die toolbox zugreifen mit:

Dim pUID As New UID
pUID = "esriGeoprocessingUI.ArcToolboxExtension"
Dim pATBExt As IArcToolboxExtension
Set pATBExt = Application.FindExtensionByCLSID(pUID)
Dim pAtb As IArcToolbox
Set pAtb = pATBExt.ArcToolbox
'Beispiel Tabletodbase conversion:
Set pTool = pAtb.GetToolbyNameString("tabletodbase_conversion" ).
Dim pCommand As IGPToolCommandHelper
Set pCommand = New GPToolCommandHelper
pCommand.SetTool pTool
pCommand.Invoke Nothing


Grüße
Hallo,
Danke für den Code.
Damit werde ich mich jetzt erst mal auseinandersetzen müssen... Ist doch etwas komplizierter, als ich dachte.
Also ran an die ArcObjects ;)
Wenn ich's geblickt habe, melde ich mich wieder.
Aber schon jetzt mal vielen Dank.


Ciao,
Andi
Hm, jetzt habe ich mich etwas in die ArcObjects eingearbeitet. (-> Buch Wolfgang Liebig, ArcGis-ArcView 9 Programmierung, Einführung in Visual Basic und ArcObjects).

Das Problem/Die Probleme:
- mit dem obigen Script von "lorenz" erhalte ich nur Fehlermeldungen.
Schon die Zeile: "Dim pATBExt As IArcToolboxExtension"
wird quittiert mit "Fehler beim Kompilieren, Benutzerdefinierter Typ nicht
definiert". Ich krieg's einfach nicht lauffähig.
- Das Script hat auch irgendwie nix mit dem zu tun, was in besagtem Buch steht.
- und lustiger Weiße gibt die Desktop-Hilfe nochmal etwas ganz anderes für den Aufruf von "hillshade" via ArcObjects vor. Das zugehörige Beispiel funktioniert ebenfalls nicht, zumindest nicht, wenn man es einfach "rüberkopiert".

Das verwirrt etwas...

Nach Liebigs Buch, Seite 201ff, können Werkzeuge aus der ArcToolbox ab ArcView-Version 9.2 aufgerufen werden mit:

pgeoProcessor.Execute " Werkzeugname", WerkzeugParameter, Abbruchereignis

Damit habe ich das auch nach langem rumwurschteln tatsächlich hinbekommen!! (freu und wunder).
Aber wieso funzt das Script von „lorenz" bei mir nicht?

AUßerdem habe ich da noch zwei andere Fragen:

wahrscheinlich ist das erste trivial / steht wahrscheinlich irgendwo und ich war bislang nur zu dusselig, es zu finden...:
Als Parameter out_raster für "hillshade_3d" geben ich
out_raster = "c:\temp\Daten\hill"
an.
Und erhalte am Ende eine Datei "hill.aux", einen Ordner "Hill" mit sieben *.adf-Dateien und einer *.XML-Datei, sowie einen Ordner "Info" mit einer *.001, einer *.dir und je drei *.dat und *.nit-Dateien.
Da ich mit den Dingern weiterarbeiten muss.... könnte mir aus dem Stegreif jemand schnell erklären, was das jeweils ist?

Zweite Frage
Nachdem ich das "Hill.aux-Dings" als Layer geladen habe, kann ich es mit Rechtsklick -> Data -> ExportData in ein *.img (Format IMAGINE Image) umwandeln und erhalte je eine *.rrd und *.img. Das müsste jetzt doch wieder ein normales Raster-Bild sein, oder?
Kann man dieses Umwandeln auch als vba/ArcObjects-Skript automatisieren bzw. gibt es ein ArcToolbox-Werkzeug dafür?
Oder kann man das direkt in "pgeoProcessor.Execute "Hillshade_3d"... machen lassen?

Ciao,
ein völlig vergrübelter Andi
Und ein zweites Problem tut sich auf...
Im Skript habe ich den Pfad zum Eingabe-Raster-DGM ja praktisch "fest verdratet". Gibt es eine ArcObjects/VBA-Funktion, um über ein Eingabe-Fenster das Eingabe-DGM sozusagen explorermäßig" per Maus auszuwählen? Das Ausgabefile kann weiter in dem festen Pfad landen, aber für die Eingangs-Datei wäre sowas schon praktisch.

Also sozusagen eine Art "Suche die Datei mit der Maus iin einer Art Mini-Explorer und übergebe den Pfad dann in die Variable für den Pfad der Eingangs-Datei.

Ciao,
Andi
Hi Andi,

Du mußt die IArcToolboxExtension referenzieren, das geht über im Visual BAsic Editor über Tools-> references. Da mußt Du mal bei den Esri Sachen schauen, ob irgendwo ein Häckchen fehlt.

Frage 2: Du hast zunächst ein Raster erzeugt, die Dateien, die Du siehst gehören alle zum Arc Raster. Die Img Datei ist dann wieder ein Bild, richtig (im Erdas Imaging Format, wenn ich mich nicht irre, die rrd datei einsteht (ebenfalls falls ich mich nicht irre) bei der pyramiden bildung (immer zu empfehlen). Und klar, in VBA/arcObjects kreigt mann das auch hin. Wenn Du mal im Netz googlest findest Du auch ein Sample- Script mit dem mann die Toolbox aufrufen kann und außerdem Properties mit übergeben kann, weiß nur leider gerade nicht mehr, wo ich das gesehen habe.


Grüße
Lorenz
Hi Andi, das geht z.B. so (öffnet in diesem Fall ein Fester zur Auswahl eines dBase Files):

Dim pGxDialog As IGxDialog
Set pGxDialog = New GxDialog
Dim pGxObjectFilter As IGxObjectFilter
Set pGxObjectFilter = New GxFilterdBASEFiles
Dim pEnumGXObject As IEnumGxObject

'----- set dialog options -----
Dim blnFlag As Boolean
pGxDialog.Title = "Select Source File"
pGxDialog.ButtonCaption = "Select"
pGxDialog.AllowMultiSelect = False
pGxDialog.RememberLocation = True
Set pGxDialog.ObjectFilter = pGxObjectFilter

'----- open dialog browser -----
blnFlag = pGxDialog.DoModalOpen(0, pEnumGXObject)
If blnFlag = False Then Exit Sub

'----- capture results of dialog -----
pEnumGXObject.Reset
Dim pGXObject As IGxObject

Do
Set pGXObject = pEnumGXObject.Next
If pGXObject Is Nothing Then Exit Do
Select Case pGXObject.Category
Case "dBASE Table"
tbInputFileType.value = pGXObject.Category
tbInputPath.value = pGxDialog.FinalLocation.FullName
tbInputFile.value = pGXObject.BaseName
Case Else
'MsgBox (pGXObject.Category)
MsgBox "Not Supported"
End Select
Loop
Hi,
danke für die prompten Antworten.
Was ich bisher davon "abgearbeitet" habe:
- Ein ArcToolbox habe ich zwar, zumindest steht da der rote Werkzeugkasten in der Menüzeile und liefert mir beispilesweise das hillshade-Werkzeug.
Unter "Select the extensions you want to use" habe ich jedoch nur "3DAnalyst" und "SpatialAnalyst". Beide haben eine Haken. Mehr Einträge hat's da nicht, auch keine "IArcToolboxExtension". Da wurde dann ja wohl was nicht installiert. Das hier ist leider kein privater Rechner, da ist das Nachinstallieren von Komponenten kaum möglich.
Da hätte ich dann ja noch lange rumprobieren können....

Das skript für das Menü funktioniert nicht schlecht.
Mal sehen, ob ich es auf Raster-Bilder anpassen kann.
Zumindest habe ich schon mal gefunden, daß ich
"Set pGxObjectFilter = New GxFilterdBASEFiles"
ersetzen muß duch
"Set pGxObjectFilter = New RasterFormatImgFilter"

Jetzt muß ich wahrscheinlich nur noch rausfinden, wie ich die Case-Verzweigung dazu bekomme, mein Bild zu akzeptieren.
Wenn ich
Case "dBASE Table"
durch
Case "IMAGINE Image"
ersetze, springt er zu "not supportet".
entweder ist ""Imagine Image" falsch oder ich habe noch was übersehen oder mein *,img-Eingangsbild ist doch kein IMAGINE-Image.
... Hm
Metadaten anschau:... Spatial data description - Raster dataset information -> Raster format: IMAGINE Image
Also liegts wohl nicht am Bild.

...Hm
Format Name: Imagine ; String Used: "IMAGINE Image"
Also entweder bin ich da in einer falschen Ecke, oder am String liegt es nicht.

...hm also was habe ich übersehen?
Hm... wenn ich in der Case-Anweisung die "pGXObject.Category"als MsgBox ausgeben lasse, kommt "Raster Dataset".
Also statt
Case "dBASE Table" halt
Case "Raster Dataset"
eingetragen, und schon geht die Zeile.
Dafür bekomme ich jetzt bei
tbInputFileType.Value = pGXObject.Category
die Fehlermeldung "Laufzeitfehler 424, Objekt erforderlich.
Mist, da geht es hin, das Wochenende ;)

Ciao,
Andi
Hi Andi,

ja, mühsam ernährt sich das Eichhörnchen. Habe huete leider keine Zeit mit Dir auf Fehlersuche zu gehen, aber ich denke Du bist auf einem guten Weg :-).

SChönen Tach noch
Lorenz
Hi ANdi,
ich nochmal. Ein Image.img file ist ja eigentlich ein Bild.
Hast Du mal "Image " statt Raster-Dataset versucht?
Grüße
Lorenz
Hi Andi,
kommando zurück, hab nochmal nachgeschaut. mit raster biste auf dem richtigen weg
Hi ANdi, blanc mal folgendes aus:

MsgBox (pGXObject.Category)
'tbInputFileType.Value = pGXObject.Category
'tbInputPath.Value = pGxDialog.FinalLocation.FullName
'tbInputFile.Value = pGXObject.BaseName
'MsgBox (pGXObject.Category)

Also die ganzen tb-geschichten.
Dann klappt das, Du mußt jetzt nur noch das Ergebnis des Auswahl-dialogs
als LAyer in Dein ArcMAp holen

Grüße
Dirk
Hi Andi,
leg mal folgendes auf einen Button:
Leider habe ich jetzt keine Zeit mehr den Fehler zu suchen (man muß immer noch per Hand die data source setzen) aber auf jedenfall wird der IMage file als Layer hinzugefügt.


Private Sub CommandButton1_Click()
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument

Dim pGxDialog As IGxDialog
Set pGxDialog = New GxDialog
pGxDialog.AllowMultiSelect = True
pGxDialog.Title = "Select Image to Add To Map"

Dim pGxFilter As IGxObjectFilter
Set pGxFilter = New RasterFormatImgFilter
Set pGxDialog.ObjectFilter = pGxFilter

Dim pGxObjects As IEnumGxObject
pGxDialog.DoModalOpen ThisDocument.Parent.hWnd, pGxObjects

If (pGxObjects Is Nothing) Then Exit Sub
pGxObjects.Reset

Dim pLayer As IRasterLayer
Dim pGxDataset As IGxDataset
Set pGxDataset = pGxObjects.Next
Do Until (pGxDataset Is Nothing)
Set pLayer = New RasterLayer



'Set pLayer.FeatureClass = pGxDataset.Dataset
'pLayer.Name = pLayer.FeatureClass.AliasName
pMxDoc.FocusMap.AddLayer pLayer
Set pGxDataset = pGxObjects.Next
Loop
pMxDoc.ActiveView.PartialRefresh esriViewGeography, Nothing, Nothing
Me.Hide
End Sub


SChönes WE
Lorenz
Hier das ganze Lauffähig für Shapes und Geodatabases:

Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument

Dim pGxDialog As IGxDialog
Set pGxDialog = New GxDialog
pGxDialog.AllowMultiSelect = True
pGxDialog.Title = "Select Feature Classes to Add To Map"

Dim pGxFilter As IGxObjectFilter
Set pGxFilter = New GxFilterFeatureClasses
Set pGxDialog.ObjectFilter = pGxFilter

Dim pGxObjects As IEnumGxObject
pGxDialog.DoModalOpen ThisDocument.Parent.hWnd, pGxObjects

If (pGxObjects Is Nothing) Then Exit Sub
pGxObjects.Reset

Dim pLayer As IFeatureLayer
Dim pGxDataset As IGxDataset
Set pGxDataset = pGxObjects.Next
Do Until (pGxDataset Is Nothing)
Set pLayer = New FeatureLayer
Set pLayer.FeatureClass = pGxDataset.Dataset
pLayer.Name = pLayer.FeatureClass.AliasName
pMxDoc.FocusMap.AddLayer pLayer
Set pGxDataset = pGxObjects.Next
Loop
pMxDoc.ActiveView.PartialRefresh esriViewGeography, Nothing, Nothing
Hi,
hatte mich nach meinem Post am Freitag Mittag nach Hause verzogen und über's Wochenende ein wenig am Heim-PC rumprobiert. Daher habe ich die nachfolgenden Antworten nicht mehr mitbekommen.

Oha, die viele Mühe noch am Freitag Nachmittag.....
Vielen vielen Dank (Niederknie).
Bin jetzt noch gar nicht zum ausprobieren gekommen.

Ich habe am Wochenende einfach mal die ( also praktisch das, was im Post von 15:14 vorgeschlagen wurde.)
tbInputFileType.Value...,
bInputPath.Value...
tbInputFile.Value.... -Zeilen auskommentiert und dafür
MsgBox "Dateiformat/pGXObject.Category: " & pGXObject.Category
MsgBox "pGxDialog.FinalLocation.FullName " & pGxDialog.FinalLocation.FullName
MsgBox "pGXObject.BaseName " & pGXObject.BaseName
Zeilen reingeschrieben.

Da gibt er mir aus:
"Dateiformat/pGXObject.Category: RasterDataset " sowie
"pGxDialog.FinalLocation.FullName: c:\temp\Daten" und
"pGXObject.BaseName: RasterGK" (das ist der Dateiname ohne Endung)

Soweit hat's also getan. Mit dem "tbInputFileType.Value", "tbInputPath.Value" und "tbInputFile.Value" kann mein Programm irgendwie nix anfangen. Diesbezüglich bin ich auch in der Desktop-Hilfe nicht fündig geworden. Welche Funktion hätten die denn gehabt?

Aber eigentlich würde mir das bisher erreichte ja schon genügen, denn Pfad und Dateiname (ohne Endung) hat er ja nun schon.
Ein explizites Öffnen der Datei als Layer im ArcMap brauche ich ja eigentlich nicht, ich bin eigentlich "nur" auf den Dateipfad scharf, um die Datei im weiteren Verlauf wie weiter oben beschrieben direkt in ein Schummerungsbild umzuwandeln. Also "Klick (UIButtonControl) -> Datei auswählen per Dialog -> Schummerungsbild wird fabriziert -> Schummerungsbild wird gespeichert". Fertig.
Als Layer in ArcMap öffnen braucht's eigentlich erst mal noch nix.

Ich müßte nun eigentlich nur noch aus
pGXObject.Category (=RasterDataset)
pGxDialog.FinalLocation.FullName (=c:\temp\Daten)
pGXObject.BaseName (=Dateiname_ohne_Endung)

ein
"Variable as string (=c:\temp\Daten\Dateiname.img)"
machen, das ich dann an den "in_raster"-Parameter von Hillschade_3d übergebe.

Womit ich mich nun erst mal in die unendlichen Weiten der Hilfefunktionen hinab begebe. Wenn jemand schon weiß wie's geht, wäre ein Zeit- und Nerven ersparender Tip herzlich willkommen.

Ciao
Andi
Oh, hab das was gefuunden.
Melde mich gleich wieder.
So,
bin über
http://edndoc.esri.com/arcobjects/9.1/ExtendingArc Objects/Ch06/OtherGxObjects.htm
gestolpert.

Dort steht was von "IGxObject name properties for other types of GxObject"
Demnach bringt "FullName" den ganzen Pfad mit Dateiname und Endung.
Aber scheinbar nur, wenn ich INNERHALB der "Loop-Schleife"
uebergabe = pGXObject.FullName
schrteibe und dann AU?ERHALB der "Loop-Schleife"
das ganze mit
MsgBox "pGXObject.FullName: " & uebergabe
ausgebe.
Allerdings scheint
in_raster = uebergabe
nicht zu funktionieren, denn nun kommt in der "hillshade_3d-Zeile eine Fehlermeldung

Also weitergrübeln....

Ciao
Andi
Oh, funktioniert.
Ich schreibe in der Loop-Schleife am Ende

Dim uebergabe As String
uebergabe = pGXObject.FullName

und später beim Erzeugen des Schummerungsbilds
in_raster = uebergabe

Danke nochmalsas für die ganze Mühe.

Ciao
Andi
Jetzt dachte ich, ich schreibe einfach zwei mal die Hillshade-Aktion untereinander, ändere die Objektnamen beim zweiten Mal alle nach dem System "Name2" und schreibe das zweite hillshade in eine
out_raster2=hillshade2.

In der Zeile
pgeoProcessor2.Execute "Hillshade_3d", HillshadeParameter2, Nothing
hängt es jetzt mit der Meldung: "Laufzeitfehler sowiseo, Automatisierungsfehler, Unbekannter Fehler.
Mist
Wo klemmt's denn jetzt wieder?

Kann mir jemand bitte folgende Vermutung überprüfen:
wenn ich mit dem geoProcessor das Schummerungsbild erzeugt habe, wird es ja als Layer in ArcMap geladen.
Wenn ich das gleiche Skript nochmal laufen lassen will, muß ich erst sowohl den Layer löschen als auch die Datei(en) auf der Festplatte. Sonst funktiponiert es nicht.

Wenn ich jetzt in einem Skript zweimal hintereinander ein Schummerungsbild erstellen lasse, in dem ich den Code einfach nochmal dahinterkopiere, dann geht's nicht.
Auch wenn ich Name und Pfad der Ausgabe-Datei ändere (Schummerung1 in c:\ Daten1 und Schummerung_zwei in c:\Daten2)
Kann es sein, daß das Problem der schon in ArcMap geöffnete Layer Schummerung_1 ist? Muß ich den offenen Layer erst löschen, bevor ich den Vorgang nochmal, wenn auch mit anderen Dateinamen, starte?

Kopfrauch...

Ciao
Andi
Frage
wie kann ich den Layer aus vba heraus schließen, ohne ihn vorher mit der maus auswählen zu müssen. also nicht nur ausblenden, sondern richtig aus ArcMap "entladen".
So in der Art

Dim pLayer As ILayer
Set pLayer = pMXDocument. Alle_geöffneten_Layer
If pLayer. existiert = True
Then pLayer. Alle_Schliessen
Ich mache für die "Layer schließen aus VBA-Skript heraus"-Geschichte mal 'nen neuen Thrad auf, denn es ist ja ein eigentlich "eigenständiges" Problem
Ciao
Andi
Hallo Andi,
komme leider erst jetzt dazu Diene Fragen zu beantworten:
also:
die tbinputfile-Geschichten zeigen dateipfad usw. in listboxen gleichen namens an (die muß man zunächst natürlich erstmal anlegen), sorry hatte das auf die Schnelle einfach aus meinem Skript so rüberkopiert...
und zum 2.:
Du schreibst: Ich schreibe in der Loop-Schleife am Ende

Dim uebergabe As String
uebergabe = pGXObject.FullName

Ich würde die Variablen Definition (also die Dim geschichte) aus dem Loop rausnehmen, weil du sonst bei jedem Durchlauf die Variable neu definierst, das ist unnötig und unschön :-) einmal reicht ja.

Grüße
Lorenz
Hallo Lorenz,
Danke für den Tip, "Dim uebergabe As String" aus der Loop-Schleife herauszunehmen. Hab's einfach vor das "Do" gesetzt, und es funktioniert einwandfrei.

Vielen Dank nochmal für die Hilfe hierzu.