Changeset 3219

Show
Ignore:
Timestamp:
05/30/08 13:50:02 (7 months ago)
Author:
ksprotte
Message:

branches/bos-trunk-sat: fixed SAT-LAYER-TOP-LEVEL-NODES

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/bos-trunk-sat/projects/bos/web/sat-tree.lisp

    r3205 r3219  
    66(defpersistent-class sat-layer () 
    77  ((name :reader name :initarg :name 
    8                                :index-type unique-index 
    9                                :index-reader find-sat-layer) 
     8         :index-type unique-index 
     9         :index-reader find-sat-layer) 
    1010   (geo-box :reader geo-box :initarg :geo-box))) 
    1111 
    12 (defun sat-layer-top-level-nodes (sat-layer) 
    13   (warn "this function is till buggy") 
    14   (let (nodes 
    15         top-level-depth) 
    16     (map-nodes (lambda (n)                  
    17                  (let ((sat-node (find-if (lambda (e) (and (eql (name e) (name sat-layer))                                                         
    18                                                            (typep e 'sat-node))) 
    19                                           (extensions n)))) 
    20                    (when sat-node 
    21                      (unless top-level-depth 
    22                        (setq top-level-depth (depth n))) 
    23                      (if (= top-level-depth (depth n)) 
    24                          (push sat-node nodes) 
    25                          nil)))) 
    26                *quad-tree* 
    27                :prune-test (lambda (n) (not (geo-box-intersect-p (geo-box n) (geo-box sat-layer))))) 
     12(defun sat-layer-top-level-nodes (sat-layer)   
     13  (let ((nodes ()) 
     14        top-level-depth 
     15        (state 'no-layer-node)) 
     16    (block collect 
     17      (map-nodes (lambda (n)                    
     18                   (let ((layer-node (find-if (lambda (e) (and (eql (name e) (name sat-layer)) 
     19                                                               (typep e 'sat-node))) 
     20                                              (extensions n))))                      
     21                     (ecase state 
     22                       (no-layer-node 
     23                        (when layer-node 
     24                          (push layer-node nodes)                           
     25                          (setq state 'got-top-level-layer-node))) 
     26                       (got-top-level-layer-node 
     27                        (unless top-level-depth 
     28                          (setq top-level-depth (depth n))) 
     29                        (if (and layer-node (= (depth n) top-level-depth)) 
     30                            (push layer-node nodes) 
     31                            (return-from collect)))))) 
     32                 *quad-tree* 
     33                 :prune-test (lambda (n) (not (geo-box-intersect-p (geo-box n) (geo-box sat-layer)))) 
     34                 :order :breadth-first)) 
    2835    (nreverse nodes))) 
    2936 
     
    5461         (n (geo-box-north geo-box)) 
    5562         (e (geo-box-east geo-box)) 
    56          (s (geo-box-south geo-box))         
     63         (s (geo-box-south geo-box)) 
    5764         (bw (geo-box-west tile-geo-box)) 
    5865         (bn (geo-box-north tile-geo-box)) 
     
    7784         (th (round (/ ph scaling)))) 
    7885    (values scaling 
    79             pw ph px py px2 py2  
     86            pw ph px py px2 py2 
    8087            tw th rounded-geo-box))) 
    8188 
    8289(defun make-sat-image-tile (image geo-box quad-node tile-geo-box name max-scaling) 
    8390  (multiple-value-bind (scaling 
    84                         pw ph px py px2 py2  
     91                        pw ph px py px2 py2 
    8592                        tw th rounded-geo-box) 
    8693      (sat-image-tile-properties image geo-box tile-geo-box max-scaling) 
     
    99106                                                :name (format nil "~A-~{~D~}" name path) 
    100107                                                :initargs `(:path ,path 
    101                                                             :image-geo-box ,rounded-geo-box))))))) 
     108                                                                  :image-geo-box ,rounded-geo-box))))))) 
    102109 
    103 (defun make-sat-layer (image geo-box name &optional (start-depth 0))   
     110(defun make-sat-layer (image geo-box name &optional (start-depth 0)) 
    104111  (check-type name symbol) 
    105112  (assert (not (find-sat-layer name)) (name) 
    106113          "A sat-layer of name ~S already exists." name) 
    107114  (check-type image cl-gd::image) 
    108   (assert (geo-box-encloses-p *m2-geo-box* geo-box))   
     115  (assert (geo-box-encloses-p *m2-geo-box* geo-box)) 
    109116  (check-type start-depth (integer 0)) 
    110117  (labels ((layer-quad-nodes () 
     
    113120                                             (lambda (n) (when (= start-depth (depth n)) 
    114121                                                           (push n nodes))) 
    115                                              (lambda (n) (= start-depth (depth n))))                
     122                                             (lambda (n) (= start-depth (depth n)))) 
    116123               (mapcar 
    117124                (lambda (quad-node) 
     
    128135             (reduce #'max nodes 
    129136                     :key (lambda (node) 
    130                             (sat-image-tile-properties image geo-box (tile-geo-box node))))))         
    131     (let* ((nodes (remove-if-not #'pw-ph-large-enough (layer-quad-nodes)))            
     137                            (sat-image-tile-properties image geo-box (tile-geo-box node)))))) 
     138    (let* ((nodes (remove-if-not #'pw-ph-large-enough (layer-quad-nodes))) 
    132139           (max-scaling (max-scaling nodes))) 
    133140      (dolist (node nodes)