Changeset 363

Show
Ignore:
Timestamp:
10/31/07 09:50:35 (1 year ago)
Author:
asc
Message:

rejiggled validate params; added initial support for extentified maps

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/py/ws-compose.py

    r362 r363  
    1616import tempfile 
    1717import textwrap 
     18import string 
    1819import base64 
    1920import Image 
     
    7879 
    7980    def draw_map_extentified (self, args) : 
    80         self.error(999, "I'm sorry, Dave. Ican't let you do that.") 
     81 
     82        provider = self.load_provider(args['provider']) 
     83         
     84        coord, offset = ModestMaps.calculateMapExtent(provider, 
     85                                                      args['width'], args['height'], 
     86                                                      ModestMaps.Geo.Location(args['bbox'][0], args['bbox'][1]), 
     87                                                      ModestMaps.Geo.Location(args['bbox'][2], args['bbox'][3])) 
     88 
     89        dim = ModestMaps.Core.Point(args['width'], args['height']) 
     90        map = ModestMaps.Map(provider, dim, coord, offset)             
     91        img = map.draw() 
     92 
     93        if args.has_key('filter') : 
     94            img = self.apply_filtering(img, args['filter']) 
     95 
     96        return img 
    8197     
    8298    # ########################################################## 
     
    99115        img = map.draw() 
    100116 
    101         if args['dither']
    102             img = self.apply_atkinson_dithering(img
    103              
    104         if args['marker'] : 
     117        if args.has_key('filter')
     118            img = self.apply_filtering(img, args['filter']
     119 
     120        if args.has_key('marker') :             
    105121            self.add_marker(img, args) 
    106122                 
     
    237253    # ########################################################## 
    238254 
     255    def apply_filtering (self, img, filter) : 
     256 
     257        return self.apply_atkinson_dithering(img) 
     258     
     259    # ########################################################## 
     260     
    239261    # 
    240262    # http://mike.teczno.com/notes/atkinson.html 
     
    306328        self.send_header("Content-Type", "image/png") 
    307329        self.send_header("Content-Length", fh.len)          
     330        self.send_header("X-ImageHeight", img.size[1]) 
     331        self.send_header("X-ImageWidth", img.size[0])         
    308332        self.end_headers() 
    309333 
     
    357381 
    358382        # 
     383 
     384        valid = {} 
    359385         
    360386        re_coord    = re.compile(r"^-?\d+(?:\.\d+)?$") 
     
    362388        re_provider = re.compile(r"^(GOOGLE|YAHOO|MICROSOFT)_(ROAD|HYBRID|AERIAL)$") 
    363389 
    364         for p in ('latitude', 'longitude') : 
     390        # 
     391        # where am i? 
     392        #  
     393         
     394        if params.has_key('bbox') : 
     395 
     396            bbox = params['bbox'][0].split(",") 
     397 
     398            if len(bbox) != 4 : 
     399                self.error(101, "Missing or incomplete %s parameter" % 'bbox') 
     400                return False 
     401 
     402            bbox = map(string.strip, bbox) 
     403             
     404            for pt in bbox : 
     405                if not re_coord.match(pt) : 
     406                    self.error(102, "Not a valid lat/long : %s" % pt) 
     407                    return False 
     408 
     409            valid['bbox'] = map(float, bbox) 
     410             
     411        else : 
     412         
     413            for p in ('latitude', 'longitude') : 
     414 
     415                if not params.has_key(p) : 
     416                    self.error(101, "Missing %s parameter" % p) 
     417                    return False 
     418             
     419                if not re_coord.match(params[p][0]) : 
     420                    self.error(102, "Not a valid lat/long : %s" % p) 
     421                    return False 
     422 
     423                valid[p] = float(params[p][0]) 
     424 
     425            # 
     426             
     427            if not params.has_key('accuracy') : 
     428                self.error(101, "Missing %s parameter" % 'accuracy') 
     429                return False 
     430 
     431            if not re_num.match(params['accuracy'][0]) : 
     432                self.error(102, "Not a valid number %s" % 'accuracy') 
     433                return False 
     434 
     435            valid['zoom'] = float(params['accuracy'][0])             
     436             
     437        # 
     438        # dimensions 
     439        # 
     440         
     441        for p in ('height', 'width') : 
    365442 
    366443            if not params.has_key(p) : 
    367444                self.error(101, "Missing %s parameter" % p) 
    368445                return False 
    369              
    370             if not re_coord.match(params[p][0]) : 
    371                 self.error(102, "Not a valid lat/long : %s" % p) 
    372                 return False 
    373              
    374         # 
    375  
    376         for p in ('height', 'width', 'accuracy') : 
    377  
    378             if not params.has_key(p) : 
    379                 self.error(101, "Missing %s parameter" % p) 
    380                 return False 
    381446 
    382447            if not re_num.match(params[p][0]) : 
    383448                self.error(102, "Not a valid number %s" % p) 
    384449                return False 
    385              
    386         # 
    387  
     450 
     451            valid[p] = int(params[p][0]) 
     452             
     453        # 
     454        # map provider 
     455        # 
     456         
    388457        if not params.has_key('provider') : 
    389458            self.error(101, "Missing %s parameter" % p) 
    390459            return False 
    391  
     460         
    392461        if not re_provider.match(params['provider'][0].upper()) : 
    393462            self.error(102, "Not a valid provider") 
    394463            return False 
    395464 
     465        valid['provider'] = params['provider'][0].upper() 
     466         
     467        # 
     468        # markers? 
    396469        # 
    397470         
     
    401474                return False 
    402475 
    403         else : 
    404             params['marker'] = [''] 
    405  
    406         # 
    407  
    408         if params.has_key('dither') and int(params['dither'][0]) : 
    409             params['dither'] = 1 
    410         else : 
    411             params['dither'] = 0 
    412  
    413         # 
    414          
    415         return { 
    416             'provider'  : params['provider'][0].upper(), 
    417             'latitude'  : float(params['latitude'][0]), 
    418             'longitude' : float(params['longitude'][0]), 
    419             'zoom'      : float(params['accuracy'][0]),             
    420             'height'    : int(params['height'][0]), 
    421             'width'     : int(params['width'][0]), 
    422             'marker'    : params['marker'][0], 
    423             'dither'    : params['dither'], 
    424             } 
     476            valid['marker'] = params['marker'][0] 
     477         
     478        # 
     479        # filters 
     480        # 
     481 
     482        if params.has_key('filter') and params['filter'][0]: 
     483            valid['filter'] = params['filter'][0] 
     484 
     485        # 
     486        # whoooosh 
     487        # 
     488         
     489        return valid 
    425490 
    426491    # ##########################################################