def get(self): self.response.headers["Content-Type"] = "text/xml" currlocationlat = 41.99765 currlocationlong = -87.6745 tag = self.request.get("tag", None) if self.request.get("LatLngBounds") == "": radius = self.request.get("radius", 3) else: lat_lo, lng_lo, lat_hi, lng_hi = self.request.get("LatLngBounds").split(",") distance = float(geoutil.calcDistance(float(lat_lo), float(lng_lo), float(lat_hi), float(lng_hi))) radius = distance / 2 # self.response.out.write('radius: ' + radius + '\r') if self.request.get("location") == "": latitude = self.request.get("latitude", currlocationlat) longitude = self.request.get("longitude", currlocationlong) else: latitude, longitude = self.request.get("location").split(",") # self.response.out.write('location: ' + str(latitude) + ',' + str(longitude) + '\r') dist = searchplaces(tag, latitude, longitude, radius, self.request.get("owner", None)) self.response.out.write("<places>") self.response.out.write("<version>1.1.3</version>") self.response.out.write("<version-date>2010-08-17</version-date>") for place in sorted(dist, key=operator.attrgetter("distance")): ret = xmlEncode(place) ## self.response.out.write(place.name) ## self.response.out.write(place.distance) ## self.response.out.write(place.recordid) # self.response.out.write('<hr>') self.response.out.write(ret) self.response.out.write("</places>")
def searchplaces(tag, latitude, longitude, radius=50, owner=None): if owner is not None: ownerclause = "owner = :owner" else: ownerclause = "" if tag is not None: tagclause = "tag = :search" else: tagclause = "" baseSelect = "SELECT * FROM Place" print >>sys.stderr, baseSelect if owner is not None: if tag is not None: placeclause = baseSelect + " WHERE " + ownerclause + " AND " + tagclause places = db.GqlQuery(placeclause, search=tag, owner=owner) else: places = db.GqlQuery(baseSelect + " WHERE " + ownerclause, owner=owner) else: if tag is not None: places = db.GqlQuery(baseSelect + " WHERE " + tagclause, search=tag) else: places = db.GqlQuery(baseSelect) dist = [] for place in places: if (place.latitude == "") or (place.longitude == ""): distance = 1000 else: distance = float(geoutil.calcDistance(latitude, longitude, float(place.latitude), float(place.longitude))) if is_number(radius): radius = float(radius) else: radius = 50 if distance < radius: dist.append(place) dist[-1].distance = distance return dist