docs: def geopatterns(self, rt=None, pid=None):
          """
          Returns a set of geographic points that make up a particular routing
          ('pattern', in API terminology) for a bus route. A bus route can have
          more than one routing.
          
          Arguments: either
              `rt`: route designator
              or
              `pid`: comma-separated list or an iterable of pattern IDs (max 10)
              
          Response:
              `ptr`: (pattern container) contains list of
                  `pid`: pattern ID
                  `ln`: length of pattern in feet
                  `rtdir`: route direction (see `self.route_directions`)
                  
                  `pt`: geo points, contains list of
                      `seq`: position of point in pattern
                      `typ`: 'S' = stop, 'W' = waypoint
  
                      -> if `typ` is a stop, will contain:
                      `stpid`, `stpnm`, `pdist` (see `self.stops`)
                      
                      `lat`, `lon`: position of point
                      
          http://realtime.portauthority.org/bustime/apidoc/v1/main.jsp?section=patterns.jsp   
          """
          if rt and pid:
              raise ValueError("The `rt` and `pid` parameters cannot be specified simultaneously.")
          if not (rt or pid):
              ValueError("You must specify either the `rt` or `pid` parameter.")
  
          if listlike(pid): pid = ",".join(pid)
          
          url = self.endpoint("R_GEO", dict(rt=rt, pid=pid))            
          
          return self._lru_geopatterns(url)