[GRASS-dev] gis.m: cannot get profile from profile tool
Moritz Lennert
mlennert at club.worldonline.be
Thu Jul 27 08:40:41 EDT 2006
Micheal,
I think I found it: It seems that the tcltk profiling tool does not work
in a latlong projections.
I just reprojected the map into a projected location and now it works !
So, if this is confirmed, we will either have to add a warning or find a
way to use latlong projections.
Moritz
Michael Barton wrote:
> Try this update to profile.tcl. Just drop it into $GISBASE/etc/gm
>
> I found a way to set the max and min elevation according to the region
> displayed. This makes more sense. Maybe it will fix your problem too.
>
> Michael
> __________________________________________
> Michael Barton, Professor of Anthropology
> School of Human Evolution & Social Change
> Center for Social Dynamics & Complexity
> Arizona State University
>
> phone: 480-965-6213
> fax: 480-965-7671
> www: http://www.public.asu.edu/~cmbarton
>
>
>
>> From: Moritz Lennert <mlennert at club.worldonline.be>
>> Date: Thu, 27 Jul 2006 08:33:11 +0200
>> To: Michael Barton <michael.barton at asu.edu>
>> Cc: Grass Developers List <grass-dev at grass.itc.it>
>> Subject: Re: [GRASS-dev] gis.m: cannot get profile from profile tool
>>
>> Michael Barton wrote:
>>> Hi Moritz,
>>>
>>> Did you select a raster to profile?
>> Yes, as you can see in the screenshot, it says in the bottom left:
>> "Profile for srtm_be".
>>
>>
>>> Third button from the left on the
>>> profiler toolbar.
>>> Rather like d.profile, the profiler differentiates between
>>> a map you use as a background to the profiling line (what is shown in the
>>> map display) and the map that you actually use to compute profile values.
>>
>> I understand that, but I still don't get a profile. Actually, I
>> sometimes do not even get the straight blue line you see in the
>> screenshot (http://moritz.homelinux.org/grass/gism_profile.png), just an
>> empty graph.
>>
>> The min and max of the heights on the y axis seem correct, though.
>>
>> Moritz
>
>
> ------------------------------------------------------------------------
>
> ##########################################################################
> # profile.tcl - Dialog to create profile of raster surface for GRASS GIS Manager
> # May 2006 Michael Barton, Arizona State University
> # COPYRIGHT: (C) 1999 - 2006 by the GRASS Development Team
> #
> # This program is free software under the GNU General Public
> # License (>=v2). Read the file COPYING that comes with GRASS
> # for details.
> #
> ##########################################################################
>
> namespace eval GmProfile {
> variable pcan
> variable status ""
> variable pmap ""
> variable pmainframe
> variable transect ""
> variable tottransect ""
> variable pcoords ""
> variable pcoordslist ""
> variable profilelist ""
> variable x
> variable y
> variable first 1
> variable firsteast 0.0
> variable firstnorth 0.0
> variable east1 0.0
> variable north1 0.0
> variable east2 0.0
> variable north2 0.0
> variable tlength 0.0
> variable tottlength 0.0
> variable linex1 0.0
> variable liney1 0.0
> variable linex2 0.0
> variable liney2 0.0
> variable array psegment len #
> variable elevrange 0.0
> variable elevmax 0.0
> variable elevmin 0.0
> variable elev 0.0
> }
>
>
> ###############################################################################
> # select raster map to profile
>
> # select base raster map from list and put name in layer tree node
> proc GmProfile::select_rast { } {
> variable pmap
> variable status
> variable elevrange
> variable elevmax
> variable elevmin
>
> set m [GSelect cell]
> if { $m != "" } {
> set pmap $m
> }
>
> #calculate elevation range so all profiles with same window geometry with have
> # same scale. Scale depends on region.
>
> set input [exec r.describe -rdq map=$pmap]
> regexp -nocase {^([0-9]+) thru ([0-9]+)} $input trash elevmin elevmax
> set elevrange [expr $elevmax - $elevmin]
>
> # put map name in status bar
> set GmProfile::status [G_msg "Profile for $pmap"]
>
>
> }
>
> ###############################################################################
> # create canvas for displaying profile
> proc GmProfile::create { mapcan } {
> global gmpath
> global iconpath
> global env
> global bgcolor
> variable pmap
> variable pcan
>
> if { [winfo exists .profile] } {return}
>
> set ptitle "Profile Window"
> toplevel .profile
> wm title .profile [G_msg $ptitle]
>
>
> wm withdraw .profile
> #wm overrideredirect $txt 1
>
> # create canvas for profile
> set profilemf [MainFrame .profile.mf \
> -textvariable GmProfile::status]
>
> set profile_frame [$profilemf getframe]
>
> set pcan [canvas $profile_frame.can -bg white\
> -borderwidth 0 -closeenough 1.0 \
> -relief ridge -selectbackground #c4c4c4 \
> -width 600 -height 200 ]
>
> # setting geometry
> place $pcan \
> -in $profile_frame -x 0 -y 0 -anchor nw \
> -bordermode ignore
>
> # profile control buttons
> set pcan_tb [$profilemf addtoolbar]
> set pcanbb [ButtonBox $pcan_tb.bb -orient horizontal]
> $pcanbb add -image [image create photo -file "$iconpath/gui-profiledefine.gif"] \
> -command "GmProfile::profilebind $mapcan" \
> -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \
> -highlightbackground $bgcolor -activebackground $bgcolor\
> -helptext [G_msg "Draw profile transect in map display"] -highlightbackground $bgcolor
> $pcanbb add -image [image create photo -file "$iconpath/gui-profiledraw.gif"] \
> -command "GmProfile::pdraw" \
> -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \
> -highlightbackground $bgcolor -activebackground $bgcolor\
> -helptext [G_msg "Draw profile"] -highlightbackground $bgcolor
> $pcanbb add -image [image create photo -file "$iconpath/element-cell.gif"] \
> -command "GmProfile::select_rast" \
> -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \
> -highlightbackground $bgcolor -activebackground $bgcolor\
> -helptext [G_msg "Select raster map to profile"] -highlightbackground $bgcolor
> $pcanbb add -image [image create photo -file "$iconpath/gui-erase.gif"] \
> -command "GmProfile::perase $mapcan" \
> -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \
> -highlightbackground $bgcolor -activebackground $bgcolor\
> -helptext [G_msg "Clear profile"] -highlightbackground $bgcolor
> $pcanbb add -image [image create photo -file "$iconpath/file-save.gif"] \
> -command "GmProfile::psave" \
> -highlightthickness 0 -takefocus 0 -relief link -borderwidth 1 \
> -highlightbackground $bgcolor -activebackground $bgcolor\
> -helptext [G_msg "Save profile to EPS file"] -highlightbackground $bgcolor
>
> # add a menu button to set preferences?
>
> pack $profilemf -expand yes -fill both -padx 0 -pady 0
> pack $pcan -fill both -expand yes
> pack $pcanbb -side left -anchor w
>
> set GmProfile::status [G_msg "Profile for $pmap"]
> $profilemf showstatusbar status
> pack $profilemf -fill both -expand yes
>
> BWidget::place .profile 0 0 at 500 100
> wm deiconify .profile
>
> # bindings for closing profile window
> bind .profile <Destroy> "GmProfile::cleanup %W $mapcan"
>
> }
>
>
>
> ###############################################################################
> # save profile to eps file
> proc GmProfile::psave { } {
> variable pcan
> global env
>
> set types {
> {{EPS} {.eps}}
> }
>
> if { [info exists HOME] } {
> set dir $env(HOME)
> set path [tk_getSaveFile -filetypes $types -initialdir $dir \
> -defaultextension ".eps"]
> } else {
> set path [tk_getSaveFile -filetypes $types -defaultextension ".eps"]
> }
>
> $pcan postscript -file "$path"
>
> return
> }
>
>
> ###############################################################################
> # procedures for marking profile location
>
> # bindings for drawing profile transect
> proc GmProfile::profilebind { mapcan } {
> variable measurement_annotation_handle
> variable tlength
> variable tottlength
> variable linex1
> variable liney1
> variable linex2
> variable liney2
> variable first
> global mon
> global GmProfile::msg
>
> # Make the output for the measurement
> set measurement_annotation_handle [monitor_annotation_start $mon "Measurement" {}]
>
> if {[info exists linex1]} {unset linex1}
> if {[info exists liney1]} {unset liney1}
> if {[info exists linex2]} {unset linex2}
> if {[info exists liney2]} {unset liney2}
>
> bind $mapcan <1> "GmProfile::marktransect $mapcan %x %y"
> bind $mapcan <B1-Motion> "GmProfile::drawtransect $mapcan %x %y"
> bind $mapcan <ButtonRelease-1> "GmProfile::getcoords $mapcan"
>
> set GmProfile::msg "Draw profile transect with mouse"
>
> MapCanvas::setcursor $mon "pencil"
> set tlength 0
> set tottlength 0
>
> }
>
> # start profile transect
> proc GmProfile::marktransect {mapcan x y} {
> variable transect
> variable tlength
> variable tottlength
> variable linex1
> variable liney1
> variable linex2
> variable liney2
> variable first
> variable firsteast
> variable firstnorth
> variable pcoords
>
> #start line
> if { ![info exists linex1] } {
> set linex1 [$mapcan canvasx $x]
> set liney1 [$mapcan canvasy $y]
> }
>
> if { $first == 1 } {
> set firsteast [MapCanvas::scrx2mape $linex1]
> set firstnorth [MapCanvas::scry2mapn $liney1]
> set pcoords "$firsteast,$firstnorth"
> }
>
> set first 0
>
> #check for click with no drag
> if { ![info exists linex2] } {
> set linex2 $linex1
> }
> if { ![info exists liney2] } {
> set liney2 $liney1
> }
>
> $mapcan delete transect
> }
>
> # draw profile transect
> proc GmProfile::drawtransect { mapcan x y } {
>
> variable measurement_annotation_handle
> variable transect
> variable tlength
> variable tottlength
> variable linex1
> variable liney1
> variable linex2
> variable liney2
> variable pcoords
>
> set scrxmov $x
> set scrymov $y
> set eastcoord [eval MapCanvas::scrx2mape $x]
> set northcoord [eval MapCanvas::scry2mapn $y]
> set coords "$eastcoord,$northcoord"
> set xc [$mapcan canvasx $x]
> set yc [$mapcan canvasy $y]
>
> # draw line segment
> if {($linex1 != $xc) && ($liney1 != $yc)} {
> $mapcan delete transect
> $mapcan addtag transect withtag \
> [$mapcan create line $linex1 $liney1 $xc $yc \
> -fill red -arrow last -width 2]
> set linex2 $xc
> set liney2 $yc
> }
> }
>
> # get coordinates for transect nodes and endpoints
> proc GmProfile::getcoords { mapcan } {
> variable measurement_annotation_handle
> variable transect
> variable tottransect
> variable tlength
> variable tottlength
> variable linex1
> variable liney1
> variable linex2
> variable liney2
> variable pcoords
> variable firsteast
> variable east1
> variable north1
> variable east2
> variable north2
> variable pcoords
> variable pcoordslist
>
> # draw cumulative line
> $mapcan addtag tottransect withtag \
> [$mapcan create line $linex1 $liney1 $linex2 $liney2 \
> -fill blue -arrow last -width 2]
>
> # get line endpoints in map coordinates
>
> set east1 [MapCanvas::scrx2mape $linex1]
> set north1 [MapCanvas::scry2mapn $liney1]
> set east2 [MapCanvas::scrx2mape $linex2]
> set north2 [MapCanvas::scry2mapn $liney2]
>
> # coordinates for use in r.profile
> append pcoords "," $east2 "," $north2
>
> # x distance off each transect segment
>
> # First convert map coordinates to profile screen coordinates
> # Then add the profile screen coordinates to the profile coordinates list.
> # Only add east1 and north1 the first time;
> # continue to add east2 and north2 until ready to draw profile
>
> # calculate line segment length and total length
> set tlength [expr {sqrt(pow(($east1 - $east2), 2) + pow(($north1 - $north2), 2))}]
> set tottlength [expr {$tottlength + $tlength}]
>
> lappend pcoordslist $tottlength
>
> monitor_annotate $measurement_annotation_handle " --segment length\t= $tlength\n"
> monitor_annotate $measurement_annotation_handle "cumulative length\t= $tottlength\n"
>
> set linex1 $linex2
> set liney1 $liney2
> }
>
> ###############################################################################
> # draw profile
> proc GmProfile::pdraw {} {
> variable pcan
> variable pmap
> variable tottlength
> variable elevrange
> variable elevmax
> variable elevmin
> variable firsteast
> variable firstnorth
> variable east1
> variable north1
> variable east2
> variable north2
> variable pcoords
> variable pcoordslist
> variable profilelist
>
> $pcan delete all
> set profilelist ""
>
> # calculate screen length and width
> set w [winfo width $pcan]
> set h [winfo height $pcan]
>
> #calculate graph box and scale extents
> set top [expr 0.10 * $h]
> set bottom [expr 0.80 * $h]
> set height [expr $bottom - $top]
> set left [expr 0.2 * $w]
> set right [expr 0.9 * $w]
> set width [expr $right - $left]
> set yscaleright [expr $left - 10]
> set xscaletop [expr $bottom + 10]
>
> # create y axis (from 20%x10% to 20%x80% - top to bottom)
> $pcan create line $left $top $left [expr $bottom + 5]
>
> # add scale to y axis
> $pcan create text $yscaleright $top \
> -text $elevmax \
> -anchor e \
> -justify right
>
> $pcan create text $yscaleright $bottom \
> -text $elevmin \
> -anchor e \
> -justify right
>
> # create x axis (from 20%x80% to 90%x80% - left to right)
> $pcan create line [expr $left - 5] $bottom $right $bottom
>
> # add scale to x axis
> $pcan create text $left $xscaletop \
> -text "0" \
> -anchor n \
> -justify center
>
> $pcan create text $right $xscaletop \
> -text "$tottlength" \
> -anchor n \
> -justify center
>
> # add tick marks
> $pcan create line $right $bottom $right [expr $bottom + 5]
> $pcan create line [expr $left - 5] $top $left $top
>
> # add transect segment markers
>
> foreach {x} $pcoordslist {
> set segx [expr $left + (($x * $width) / $tottlength)]
> $pcan create line $segx $bottom $segx $top -fill grey
> }
>
>
> # run r.profile
> # convert dist elev (stdout) to xy coordinates of profile line
>
> if {![catch {open "|r.profile input=$pmap profile=$pcoords" r} input]} {
> while {[gets $input line] >= 0} {
> if { [regexp -nocase {^([0-9].*) ([0-9].*)$} $line trash dist elev] } {
> set pelev [expr $bottom - ($height * ($elev - $elevmin) / $elevrange)]
> set pdist [expr $left + (($dist * $width) / $tottlength)]
> lappend profilelist $pdist $pelev
> }
> }
> catch close $input
> }
>
> # draw profile line
> if { [llength $profilelist] > 3 } {
> $pcan create line $profilelist -fill blue
> }
>
> }
> ###############################################################################
> # erase profile and clear transects
> proc GmProfile::perase { mapcan } {
> variable pcan
> variable pmap
> variable transect
> variable tottransect
> variable tlength
> variable tottlength
> variable pcoords
> variable pcoordslist
> variable profilelist
> variable first
> variable linex1
> variable liney1
> variable elevrange
> variable elevmax
> variable elevmin
>
> $pcan delete all
> $mapcan delete transect
> $mapcan delete tottransect
> set tlength 0.0
> set tottlength 0.0
> set pcoords ""
> set pcoordslist ""
> set profilelist ""
> set first 1
> if { [info exists linex1] } {
> unset linex1
> }
> if { [info exists liney1] } {
> unset liney1
> }
>
> #recalculate elevation range in case region has changed
>
> set input [exec r.describe -rdq map=$pmap]
> regexp -nocase {^([0-9]+) thru ([0-9]+)} $input trash elevmin elevmax
> set elevrange [expr $elevmax - $elevmin]
>
> }
>
> ###############################################################################
>
> proc GmProfile::cleanup { destroywin mapcan } {
> # cleanup procedures on closing profile window
> variable pcan
> variable transect
> variable tottransect
> variable tlength
> variable tottlength
> variable pcoords
> variable pcoordslist
> variable profilelist
> variable first
> variable linex1
> variable liney1
> global mon
>
> set tlength 0.0
> set tottlength 0.0
> set pcoords ""
> set pcoordslist ""
> set profilelist ""
> set first 1
> if { [info exists linex1] } {
> unset linex1
> }
> if { [info exists liney1] } {
> unset liney1
> }
>
> $mapcan delete transect
> $mapcan delete tottransect
> MapCanvas::restorecursor $mon
>
> }
>
>
> ###############################################################################
More information about the grass-dev
mailing list