def nearbyStops(lat,lon,radius,routeID,direction): # limit the radius value to 500 if radius > 1000: radius = 1000 if routeID is None or routeID == "": #logging.debug('nearbyStops (%s,%s,%s,%s)' % (lat,lon,radius,routeID)) results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat,lon), # Or db.GeoPt max_results=100, max_distance=radius) else: if direction is not None: results = StopLocation.proximity_fetch( StopLocation.all().filter('routeID =', routeID).filter('direction =', direction), geotypes.Point(lat,lon), # Or db.GeoPt max_results=100, max_distance=radius) else: results = StopLocation.proximity_fetch( StopLocation.all().filter('routeID =', routeID), geotypes.Point(lat,lon), # Or db.GeoPt max_results=100, max_distance=radius) if results is None: response_dict = {'status':'0', 'info':'No stops found', } return response_dict response_dict = {'status':'0',} stop_results = [] stop_tracking = [] for stop in results: # kind of a hack, but limit the results to one per route. # the query will return multiple results for each stop if stop.stopID not in stop_tracking: stop_results.append(dict({ 'stopID':stop.stopID, 'intersection':stop.intersection, 'latitude':stop.location.lat, 'longitude':stop.location.lon, })) #logging.debug('appending %s to route tracking list' % stop.stopID) stop_tracking.append(stop.stopID) response_dict.update({'stop':stop_results}) return response_dict
def get(self): # do some analysis on the request history... reqs = getRequestedStops() # find that lat/longs for all the stops validStops = reqs.keys() stopLocs = memcache.get_multi(validStops) if self.request.get('clean') or stopLocs is None: memcache.delete_multi(validStops) logging.debug("logging stop locations!") locations = dict() cursor = None # Start a query for all stop locations q = StopLocation.all() while q is not None: # If the app stored a cursor during a previous request, use it. if cursor: q.with_cursor(cursor) # Perform the query to get results. locationQuery = q.fetch(1000) cursor = q.cursor() if len(locationQuery) > 0: logging.debug( 'just read in another chunk of stop locations...') for l in locationQuery: location = l.location stopKey = l.stopID + ':loc' if l.stopID in validStops and stopKey not in stopLocs: logging.debug('adding location %s for stopID %s' % (location, l.stopID)) stopLocs[stopKey] = location else: logging.debug('No more stop locations left in the query!') break memcache.set_multi(stopLocs) return
def get(self): # do some analysis on the request history... reqs = getRequestedStops() # find that lat/longs for all the stops validStops = reqs.keys() stopLocs = memcache.get_multi(validStops) if self.request.get('clean') or stopLocs is None: memcache.delete_multi(validStops) logging.debug("logging stop locations!") locations = dict() cursor = None # Start a query for all stop locations q = StopLocation.all() while q is not None: # If the app stored a cursor during a previous request, use it. if cursor: q.with_cursor(cursor) # Perform the query to get results. locationQuery = q.fetch(1000) cursor = q.cursor() if len(locationQuery) > 0: logging.debug('just read in another chunk of stop locations...') for l in locationQuery: location = l.location stopKey = l.stopID + ':loc' if l.stopID in validStops and stopKey not in stopLocs: #logging.debug('adding location %s for stopID %s' % (location,l.stopID)) stopLocs[stopKey] = location else: logging.debug('No more stop locations left in the query!') break memcache.set_multi(stopLocs) return
def nearbyStops(lat, lon, radius, routeID, destination): route_stops = None # limit results to 200 max_results = 200 # limit the radius value to 500 if radius > 1000: radius = 1000 logging.debug('nearbyStops (%s,%s,%s,%s,%s)' % (lat, lon, radius, routeID, destination)) if routeID is None or routeID == "": results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat, lon), # Or db.GeoPt max_results=max_results, max_distance=radius) else: if destination is not None and destination is not "": destination_code = getDestinationCode(destination) if destination_code == -1: response_dict = { 'status': '-1', 'info': ('Unknown destination %s' % destination) } return response_dict else: # first filter stops by route and destination... logging.debug( '... filter by destination for route %s and destination %s' % (routeID, destination_code)) q = db.GqlQuery( 'select stopID from RouteListing where route = :1 and direction = :2 order by route', routeID, destination_code) routes = q.fetch(1000) route_stops = [] for route in routes: route_stops.append(route.stopID) results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat, lon), # Or db.GeoPt max_results=max_results, max_distance=radius) else: # first filter stops by route and destination... logging.debug('... filter by destination for route %s' % routeID) q = db.GqlQuery('select * from RouteListing where route = :1', routeID) routes = q.fetch(1000) route_stops = [] for route in routes: route_stops.append(route.stopID) results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat, lon), # Or db.GeoPt max_results=max_results, max_distance=radius) if results is None: response_dict = { 'status': '0', 'timestamp': api_utils.getLocalTimestamp(), 'info': 'No stops found', 'stops': [] } return response_dict response_dict = { 'status': '0', 'timestamp': api_utils.getLocalTimestamp(), } stop_results = [] stop_tracking = [] logging.info('loop through %s results' % len(results)) for stop in results: # manually apply the destination filter here because # the GCL query limits our ability to apply it in the # proximity query if route_stops is not None and stop.stopID not in route_stops: #logging.debug('filtered out %s' % stop.stopID) continue # kind of a hack, but limit the results to one per route. # the query will return multiple results for each stop if stop.stopID not in stop_tracking: stop_results.append( dict({ 'stopID': stop.stopID, 'intersection': stop.intersection, 'latitude': stop.location.lat, 'longitude': stop.location.lon, })) logging.debug('appending %s to route tracking list' % stop.stopID) stop_tracking.append(stop.stopID) response_dict.update({'stop': stop_results}) return response_dict
def nearbyStops(lat,lon,radius,routeID,destination): route_stops = None # limit results to 200 max_results = 200 # limit the radius value to 500 if radius > 1000: radius = 1000 logging.debug('nearbyStops (%s,%s,%s,%s,%s)' % (lat,lon,radius,routeID,destination)) if routeID is None or routeID == "": results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat,lon), # Or db.GeoPt max_results=max_results, max_distance=radius) else: if destination is not None and destination is not "": destination_code = getDestinationCode(destination) if destination_code == -1 : response_dict = {'status' : '-1', 'info' : ('Unknown destination %s' % destination) } return response_dict else: # first filter stops by route and destination... logging.debug('... filter by destination for route %s and destination %s' % (routeID,destination_code)) q = db.GqlQuery('select stopID from RouteListing where route = :1 and direction = :2 order by route', routeID, destination_code) routes = q.fetch(1000) route_stops = [] for route in routes: route_stops.append(route.stopID) results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat,lon), # Or db.GeoPt max_results=max_results, max_distance=radius) else: # first filter stops by route and destination... logging.debug('... filter by destination for route %s' % routeID) q = db.GqlQuery('select * from RouteListing where route = :1', routeID) routes = q.fetch(1000) route_stops = [] for route in routes: route_stops.append(route.stopID) results = StopLocation.proximity_fetch( StopLocation.all(), geotypes.Point(lat,lon), # Or db.GeoPt max_results=max_results, max_distance=radius) if results is None: response_dict = {'status':'0', 'timestamp':api_utils.getLocalTimestamp(), 'info':'No stops found', 'stops':[] } return response_dict response_dict = {'status':'0','timestamp':api_utils.getLocalTimestamp(),} stop_results = [] stop_tracking = [] logging.info('loop through %s results' % len(results)) for stop in results: # manually apply the destination filter here because # the GCL query limits our ability to apply it in the # proximity query if route_stops is not None and stop.stopID not in route_stops: #logging.debug('filtered out %s' % stop.stopID) continue # kind of a hack, but limit the results to one per route. # the query will return multiple results for each stop if stop.stopID not in stop_tracking: stop_results.append(dict({ 'stopID':stop.stopID, 'intersection':stop.intersection, 'latitude':stop.location.lat, 'longitude':stop.location.lon, })) logging.debug('appending %s to route tracking list' % stop.stopID) stop_tracking.append(stop.stopID) response_dict.update({'stop':stop_results}) return response_dict