Changeset 5956


Ignore:
Timestamp:
Jan 14, 2016 9:29:56 PM (6 years ago)
Author:
dkearney
Message:

merging in mapping layer objects, examples, and tests from the geomap branch.

Location:
trunk
Files:
4 edited
24 copied

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/gui/scripts/Makefile.in

    r5331 r5956  
    6161                $(srcdir)/gauge.tcl \
    6262                $(srcdir)/getopts.tcl \
     63                $(srcdir)/geomapdataprovider.tcl \
     64                $(srcdir)/geomapdataprovidercolorramp.tcl \
     65                $(srcdir)/geomapdataprovidergdal.tcl \
     66                $(srcdir)/geomapdataproviderogr.tcl \
     67                $(srcdir)/geomapdataprovidertfs.tcl \
     68                $(srcdir)/geomapdataprovidertms.tcl \
     69                $(srcdir)/geomapdataproviderwfs.tcl \
     70                $(srcdir)/geomapdataproviderwms.tcl \
     71                $(srcdir)/geomapdataproviderxyz.tcl \
     72                $(srcdir)/geomaplayer.tcl \
     73                $(srcdir)/geomaplayerimage.tcl \
    6374                $(srcdir)/grab.tcl \
    6475                $(srcdir)/groupentry.tcl \
  • trunk/gui/scripts/map.tcl

    r5948 r5956  
    3030    }
    3131
    32     public method addLayer { type name paramArray driver driverParamArray {stylesheet {}} {script {}} {selectors {}} }
    3332    public method addViewpoint { name props }
    34     public method deleteLayer { layerName }
    3533    public method earthfile {}
    36     public method hasLayer { layerName }
    3734    public method hints { args }
    3835    public method isGeocentric {}
     
    4037        return $_isValid;
    4138    }
    42     public method layer { layerName }
     39    public method layer { option args }
    4340    public method layers {}
    4441    public method selectors { layerName }
     
    5855    protected method Parse { xmlobj path }
    5956
     57    private method AddLayer { args }
     58    private method DeleteLayer { layerName }
     59    private method GetLayerNames {}
     60    private method GetLayerSettings { layerName }
     61
     62
    6063    private variable _tree "";         # Tree of information about the map.
    6164    private variable _isValid 0;
     65    private common _nextLayer 0;       # Counter used to generate unique
     66                                       # layer names.
    6267    private common _nextSelector 0;
    6368    private common _nextViewpoint 0;   # Counter used to generate unique
     
    147152    foreach layer [$layers children -type layer] {
    148153        # Unique identifier for layer.
    149         set name [$map element -as id "layers.$layer"]
    150         if {[hasLayer $name]} {
    151             puts stderr "ERROR: Duplicate layer ID '$name', skipping"
    152             continue
    153         }
     154        set name "layer[incr _nextLayer]"
    154155        set child [$_tree insert $parent -label $name]
    155156        set layerType [$layers get $layer.type]
     
    157158            error "invalid layer type \"$layerType\": should be one of [array names _layerTypes]"
    158159        }
    159         $_tree set $child "name" $name
     160        $_tree set $child "name" $layer
    160161        $_tree set $child "type" $layerType
    161162        foreach key { label description attribution profile srs verticalDatum } {
     
    456457}
    457458
    458 itcl::body Rappture::Map::addLayer { type name paramArray driver driverParamArray {stylesheet {}} {script {}} {selectors {}} } {
    459     set id "$name"
    460     if {[hasLayer $id]} {
    461         error "Layer '$id' already exists"
    462     }
    463     set parent [$_tree findchild root "layers"]
    464     set child [$_tree insert $parent -label $id]
    465     $_tree set $child "name" $name
    466     $_tree set $child "type" $type
    467     array set params $paramArray
    468     foreach key { label description attribution profile srs verticalDatum } {
    469         if {[info exists params($key)]} {
    470             $_tree set $child $key $params($key)
    471         } else {
    472             $_tree set $child $key ""
    473         }
    474     }
    475     # Common settings (for all layer types) with defaults
    476     foreach { key defval } { visible 1 cache 1 } {
    477         $_tree set $child $key $defval
    478         if {[info exists params($key)]} {
    479             set val $params($key)
    480             if {$val != ""} {
    481                 $_tree set $child $key $val
    482             }
    483         }
    484     }
    485     # These are settings for which there should be no default
    486     # We want to know if they have been set by the user or not
    487     # Not all layer types use these
    488     foreach key { coverage opacity content priority style } {
    489         if {[info exists params($key)]} {
    490             set val $params($key)
    491             if {$val != ""} {
    492                 $_tree set $child $key $val
    493             }
    494         }
    495     }
    496     if {$stylesheet != ""} {
    497         set val $stylesheet
    498         # Normalize whitespace
    499         regsub -all "\[ \t\r\n\]+" [string trim $val] " " val
    500         $_tree set $child stylesheet $val
    501     }
    502     if {$script != ""} {
    503         regsub -all "\[\r\n\]+" [string trim $script] " " script
    504         $_tree set $child script $script
    505     }
    506     if {$selectors != ""} {
    507         set sparent [$_tree insert $child -label "selectors"]
    508         foreach selectorItem $selectors {
    509             array set selector $selectorItem
    510             set id "selector[incr _nextSelector]"
    511             set snode [$_tree insert $sparent -label $id]
    512             foreach key { name style styleExpression query queryBounds queryOrderBy } {
    513                 if {[info exists selector($key)]} {
    514                     set val $selector($key)
    515                     if {$val != ""} {
    516                         $_tree set $snode $key $val
    517                     }
    518                 }
    519             }
    520         }
    521     }
    522     $_tree set $child "driver" $driver
    523     switch -- $driver {
    524         "arcgis" {
    525             array set params $driverParamArray
    526             foreach key { url token format layers } {
    527                 if {[info exists params($key)]} {
    528                     set value $params($key)
    529                     $_tree set $child "arcgis.$key" $value
    530                 }
    531             }
    532         }
    533         "colorramp" {
    534             array set params $driverParamArray
    535             $_tree set $child "colorramp.elevdriver" "gdal"
    536             $_tree set $child "colorramp.colormap" "0 0 0 0 1 1 1 1 1 1"
    537             if {[info exists params(colormap)]} {
    538                 set cmap $params(colormap)
    539                 if {$cmap != ""} {
    540                     # Normalize whitespace
    541                     regsub -all "\[ \t\r\n\]+" [string trim $cmap] " " cmap
    542                     $_tree set $child "colorramp.colormap" $cmap
    543                 }
    544             }
    545             foreach key { url elevdriver } {
    546                 if {[info exists params($key)]} {
    547                     set value $params($key)
    548                     if {$value != ""} {
    549                         $_tree set $child "colorramp.$key" $value
    550                     }
    551                 }
    552             }
    553         }
    554         "gdal" {
    555             array set params $driverParamArray
    556             foreach key { url } {
    557                 set value $params($key)
    558                 $_tree set $child "gdal.$key" $value
    559             }
    560         }
    561         "ogr" {
    562             array set params $driverParamArray
    563             foreach key { url } {
    564                 set value $params($key)
    565                 $_tree set $child "ogr.$key" $value
    566             }
    567             foreach key { connection geometry geometry_url layer ogr_driver build_spatial_index } {
    568                 if {[info exists params($key)]} {
    569                     set value $params($key)
    570                     if { $value != "" } {
    571                         $_tree set $child "ogr.$key" $value
    572                     }
    573                 }
    574             }
    575         }
    576         "tfs" {
    577             foreach key { url format } {
    578                 if {[info exists params($key)]} {
    579                     set value $params($key)
    580                     $_tree set $child "tfs.$key" $value
    581                 }
    582             }
    583         }
    584         "tms" {
    585             foreach key { url tmsType format } {
    586                 if {[info exists params($key)]} {
    587                     set value $params($key)
    588                     $_tree set $child "tms.$key" $value
    589                 }
    590             }
    591         }
    592         "wcs" {
    593             foreach key { url identifier format elevationUnit rangeSubset } {
    594                 if {[info exists params($key)]} {
    595                     set value $params($key)
    596                     $_tree set $child "wcs.$key" $value
    597                 }
    598             }
    599         }
    600         "wfs" {
    601             foreach key { url typename format maxfeatures requestBuffer } {
    602                 if {[info exists params($key)]} {
    603                     set value $params($key)
    604                     $_tree set $child "wfs.$key" $value
    605                 }
    606             }
    607         }
    608         "wms" {
    609             foreach key { url layers format transparent } {
    610                 if {[info exists params($key)]} {
    611                     set value $params($key)
    612                     $_tree set $child "wms.$key" $value
    613                 }
    614             }
    615         }
    616         "xyz" {
    617             foreach key { url } {
    618                 if {[info exists params($key)]} {
    619                     set value $params($key)
    620                     $_tree set $child "xyz.$key" $value
    621                 }
    622             }
    623         }
    624     }
    625     return $id
    626 }
    627 
    628 itcl::body Rappture::Map::deleteLayer { layerName } {
    629     set id [$_tree findchild root->"layers" $layerName]
    630     if { $id < 0 } {
    631         error "unknown layer \"$layerName\""
    632     }
    633     $_tree delete $id
    634 }
    635 
    636 # ----------------------------------------------------------------------
    637 # USAGE: layers
    638 #
    639 # Returns a list of IDs for the layers in the map
    640 # ----------------------------------------------------------------------
    641 itcl::body Rappture::Map::layers {} {
    642     set list {}
    643     foreach node [$_tree children root->"layers"] {
    644         lappend list [$_tree label $node]
    645     }
    646     return $list
    647 }
    648 
    649459# ----------------------------------------------------------------------
    650460# USAGE: viewpoints
     
    663473
    664474# ----------------------------------------------------------------------
     475# USAGE: AddLayer -format <format>
     476#
     477# Associate a new layer to the map
     478# ----------------------------------------------------------------------
     479itcl::body Rappture::Map::AddLayer { args } {
     480    set layerName ""
     481    set valids "-format"
     482    set format "blt_tree"
     483
     484    set layerObj [lrange $args end end]
     485    set args [lrange $args 0 end-1]
     486
     487    while {[llength $args] > 0} {
     488        set flag [lindex $args 0]
     489        switch -- $flag {
     490            "-format" {
     491                if {[llength $args] > 1} {
     492                    set format [lindex $args 1]
     493                    set args [lrange $args 2 end]
     494                } else {
     495                    error "wrong number args: should be ?-format <format>?"
     496                }
     497            }
     498            default {
     499                error "invalid option \"$flag\": should be one of $valids"
     500            }
     501        }
     502    }
     503
     504    set valids "blt_tree"
     505
     506    switch -- $format {
     507        "blt_tree" {
     508            # check if a layer by the same name already exists
     509            set layerName "layer[incr _nextLayer]"
     510            if {[$_tree findchild root->"layers" $layerName] != -1} {
     511                error "key error \"$layerName\": layer name exists"
     512            }
     513            # copy the incomming layer data into our map object
     514            set id [$layerObj copy root $_tree root->"layers"]
     515            # give the layer a searchable layer name
     516            $_tree label $id $layerName
     517        }
     518        default {
     519            error "bad format \"$format\": should be one of $valids"
     520        }
     521    }
     522
     523    return $layerName
     524}
     525
     526# ----------------------------------------------------------------------
     527# USAGE: DeleteLayer <layerName>
     528#
     529# Remove a layer from the map
     530# ----------------------------------------------------------------------
     531itcl::body Rappture::Map::DeleteLayer { layerName } {
     532    set id [$_tree findchild root->"layers" $layerName]
     533    if {$id <= 0} {
     534        # layer not found
     535        error "invalid layer \"$layerName\": should be one of [GetLayerNames]"
     536    }
     537    # delete the layer
     538    $_tree delete $id
     539}
     540
     541
     542# ----------------------------------------------------------------------
     543# USAGE: GetLayerNames
     544# USAGE: layers
     545#
     546# Returns a list of IDs for the layers in the map
     547# ----------------------------------------------------------------------
     548itcl::body Rappture::Map::GetLayerNames {} {
     549    set list {}
     550    foreach node [$_tree children root->"layers"] {
     551        lappend list [$_tree label $node]
     552    }
     553    return $list
     554}
     555
     556# ----------------------------------------------------------------------
     557# USAGE: GetLayerSettings <layerName>
    665558# USAGE: layer <layerName>
    666559#
    667 # Returns an array of settings for the named layer
    668 # ----------------------------------------------------------------------
    669 itcl::body Rappture::Map::layer { layerName } {
     560# Returns a list of settings for the named layer
     561# ----------------------------------------------------------------------
     562itcl::body Rappture::Map::GetLayerSettings { layerName } {
    670563    set id [$_tree findchild root->"layers" $layerName]
    671564    if { $id < 0 } {
     
    675568}
    676569
    677 itcl::body Rappture::Map::hasLayer { layerName } {
    678     set id [$_tree findchild root->"layers" $layerName]
    679     if { $id < 0 } {
    680         return 0
    681     } else {
    682         return 1
    683     }
    684 }
     570# ----------------------------------------------------------------------
     571# USAGE: layer
     572#
     573#   This public method is called by clients using this widget to manage
     574#   layers in the map.
     575#
     576#       layer add ?-type type? layerData
     577#       layer delete layerName
     578#       layer names
     579#       layer settings layerName
     580#
     581itcl::body Rappture::Map::layer {option args} {
     582    set result ""
     583    switch -- $option {
     584        "add" {
     585            set result [eval AddLayer $args]
     586        }
     587        "delete" {
     588            set result [eval DeleteLayer $args]
     589        }
     590        "names" {
     591            set result [GetLayerNames]
     592        }
     593        "settings" {
     594            set result [GetLayerSettings $args]
     595        }
     596        default {
     597            error "unknown layer option \"$option\""
     598        }
     599    }
     600    return $result
     601}
     602
    685603
    686604# ----------------------------------------------------------------------
  • trunk/gui/scripts/mapviewer.tcl

    r5950 r5956  
    5353    public method camera {option args}
    5454    public method delete {args}
     55    public method remove {args}
    5556    public method disconnect {}
    5657    public method download {option args}
     
    6364    public method select {option {args ""}}
    6465    public method setSelectCallback {cmd}
     66
     67    public method send { cmd }
    6568
    6669    private method KeyPress { key }
     
    539542}
    540543
     544#
     545# send --
     546#
     547#   Test method for dsk
     548#
     549#       send [list my command]
     550#
     551itcl::body Rappture::MapViewer::send {cmd} {
     552    puts "sending: \"$cmd\""
     553    SendCmd $cmd
     554}
     555
    541556itcl::body Rappture::MapViewer::DoResize {} {
    542557    set sendResize 1
     
    697712        }
    698713        # When a map is marked deleted, we hide its layers.
    699         foreach layer [$dataobj layers] {
     714        foreach layer [$dataobj layer names] {
    700715            SendCmd "map layer visible 0 $layer"
    701716            set _visibility($layer) 0
     717        }
     718        # Remove it from the dataobj list.
     719        set _dlist [lreplace $_dlist $pos $pos]
     720        array unset _obj2ovride $dataobj-*
     721        array unset _settings $dataobj-*
     722        set changed 1
     723    }
     724    # If anything changed, then rebuild the plot
     725    if { $changed } {
     726        $_dispatcher event -idle !rebuild
     727    }
     728}
     729
     730# ----------------------------------------------------------------------
     731# USAGE: remove ?<dataobj1> <dataobj2> ...?
     732#
     733# Clients use this to permanantly remove a dataobj from the client
     734# and the server. If no dataobjs are specified, then all dataobjs
     735# are removed. Unlike the delete method, dataobjects are permenantly
     736# removed from both the client and the server and it is safe to add
     737# them again without conflict in layer names.
     738# ----------------------------------------------------------------------
     739itcl::body Rappture::MapViewer::remove {args} {
     740    DebugTrace "Enter"
     741    if { [llength $args] == 0} {
     742        set args $_dlist
     743    }
     744    # Remove all specified dataobjs
     745    set changed 0
     746    foreach dataobj $args {
     747        set pos [lsearch -exact $_dlist $dataobj]
     748        if { $pos < 0 } {
     749            continue;                   # Don't know anything about it.
     750        }
     751        # Remove the layers from the client and server.
     752        foreach layer [$dataobj layer names] {
     753            SendCmd "map layer delete $layer"
     754            if { [info exists _layers($layer)] } {
     755                array unset _layers $layer
     756            }
     757            if { [info exists _opacity($layer)] } {
     758                array unset _opacity $layer
     759            }
     760            if { [info exists _visibility($layer)] } {
     761                array unset _visibility $layer
     762            }
    702763        }
    703764        # Remove it from the dataobj list.
     
    855916            }
    856917        }
    857         foreach layer [$dataobj layers] {
     918        foreach layer [$dataobj layer names] {
    858919            if { [$dataobj type $layer] == "elevation" } {
    859920                set _haveTerrain 1
     
    13001361            set _first $dataobj
    13011362        }
    1302         foreach layer [$dataobj layers] {
     1363        foreach layer [$dataobj layer names] {
    13031364            array unset info
    1304             array set info [$dataobj layer $layer]
     1365            array set info [$dataobj layer settings $layer]
    13051366            if { ![info exists _layers($layer)] } {
    13061367                if { $_reportClientInfo }  {
     
    14721533    set rlist ""
    14731534    foreach dataobj $dlist {
    1474         foreach layer [$dataobj layers] {
     1535        foreach layer [$dataobj layer names] {
    14751536            if { [info exists _layers($layer)] && $_layers($layer) } {
    14761537                lappend rlist $layer
     
    24062467
    24072468itcl::body Rappture::MapViewer::SetLayerStyle { dataobj layer } {
    2408     array set info [$dataobj layer $layer]
     2469    array set info [$dataobj layer settings $layer]
    24092470    if { [info exists info(visible)] &&
    24102471         !$info(visible) } {
     
    28512912    set imgIdx 0
    28522913    foreach dataobj [get -objects] {
    2853         foreach layer [$dataobj layers] {
     2914        foreach layer [$dataobj layer names] {
    28542915            array unset info
    2855             array set info [$dataobj layer $layer]
     2916            array set info [$dataobj layer settings $layer]
    28562917            checkbutton $f.${layer}_visible \
    28572918                -text $info(label) \
     
    29953056
    29963057    foreach dataobj [get -objects] {
    2997         foreach layer [$dataobj layers] {
     3058        foreach layer [$dataobj layer names] {
    29983059            set _layers($layer) 1
    29993060            array unset info
    3000             array set info [$dataobj layer $layer]
     3061            array set info [$dataobj layer settings $layer]
    30013062            switch -- $info(type) {
    30023063                "image" {
Note: See TracChangeset for help on using the changeset viewer.