def handle(self, *args, **options): event = get_event_from_options(options) rpqs = RacePoint.objects.filter(event=event) i = 0 n = rpqs.count() if not n: print "No race points for this event. You may import a course using import_race_course" return meanlat = rpqs.aggregate(Avg("latitude"))["latitude__avg"] osmdataradius = int(options["data_radius"]) osmlongdelta = calculate_easting_delta(meanlat, osmdataradius) osmlatdelta = osmdataradius * 90./10000000. osmendpoint = options["endpoint_url"] if options["use_ssl"]: osmendpoint = osmendpoint.replace("http://","https://") for rp in rpqs: i += 1 print "Fetching data for point %d/%d"%(i,n) try: query = '[out:json];way(%.6f,%.6f,%.6f,%.6f)["name"];out meta;'%( rp.latitude-osmlatdelta, rp.longitude-osmlongdelta, rp.latitude+osmlatdelta, rp.longitude+osmlongdelta) result = urllib2.urlopen(osmendpoint, query) jsondata = json.loads(result.read()) elements = [] for element in jsondata["elements"]: tags = element["tags"] elementtype = tags.get("amenity", "unknown") for key in [ ("building","building"), ("highway","road"), ("shop","shop"), ("leisure","leisure"), ("tourism","tourism"), ("waterway","waterway")]: if key[0] in tags: elementtype = key[1] if ([tags["name"], elementtype] not in elements): elements.append([tags["name"], elementtype]) postcode = tags.get("postal_code", tags.get("addr:postcode","")).split(" ")[0] if postcode and ([postcode,"postcode"] not in elements): elements.append([postcode,"postcode"]) print ", ".join([e[0] for e in elements]) LocationDistance.objects.filter(reference_point=rp).exclude(location_name__type="race marker").delete() for element in elements: locname, created = LocationName.objects.get_or_create( name = element[0], type = element[1]) LocationDistance.objects.create( location_name = locname, accuracy = osmdataradius, reference_point = rp) except Exception, e: print "Error", e
def handle(self, *args, **options): event = get_event_from_options(options) rpqs = RacePoint.objects.filter(event=event) i = 0 n = rpqs.count() if not n: print "No race points for this event. You may import a course using import_race_course" return meanlat = rpqs.aggregate(Avg("latitude"))["latitude__avg"] osmdataradius = int(options["data_radius"]) osmlongdelta = calculate_easting_delta(meanlat, osmdataradius) osmlatdelta = osmdataradius * 90. / 10000000. osmendpoint = options["endpoint_url"] if options["use_ssl"]: osmendpoint = osmendpoint.replace("http://", "https://") for rp in rpqs: i += 1 print "Fetching data for point %d/%d" % (i, n) try: query = '[out:json];way(%.6f,%.6f,%.6f,%.6f)["name"];out meta;' % ( rp.latitude - osmlatdelta, rp.longitude - osmlongdelta, rp.latitude + osmlatdelta, rp.longitude + osmlongdelta) result = urllib2.urlopen(osmendpoint, query) jsondata = json.loads(result.read()) elements = [] for element in jsondata["elements"]: tags = element["tags"] elementtype = tags.get("amenity", "unknown") for key in [("building", "building"), ("highway", "road"), ("shop", "shop"), ("leisure", "leisure"), ("tourism", "tourism"), ("waterway", "waterway")]: if key[0] in tags: elementtype = key[1] if ([tags["name"], elementtype] not in elements): elements.append([tags["name"], elementtype]) postcode = tags.get("postal_code", tags.get("addr:postcode", "")).split(" ")[0] if postcode and ([postcode, "postcode"] not in elements): elements.append([postcode, "postcode"]) print ", ".join([e[0] for e in elements]) LocationDistance.objects.filter(reference_point=rp).exclude( location_name__type="race marker").delete() for element in elements: locname, created = LocationName.objects.get_or_create( name=element[0], type=element[1]) LocationDistance.objects.create(location_name=locname, accuracy=osmdataradius, reference_point=rp) except Exception, e: print "Error", e
def handle(self, *args, **options): event = get_event_from_options(options) print "Clearing Distance points for %s"%event.name VideoDistance.objects.filter(video__event=event).delete() rpqs = RacePoint.objects.filter(event=event) if not rpqs.exists(): print "No race points for this event. You may import a course using import_race_course" return meanlat = rpqs.aggregate(Avg("latitude"))["latitude__avg"] maxtolerance = 500. longtolerance = calculate_easting_delta(meanlat, maxtolerance) lattolerance = maxtolerance * 90./10000000. otherleg = maxtolerance * 2 pointcache = {} vqs = Video.objects.filter(event=event) for v in vqs: print "Finding location for video %s"%v.id locobj = None for delta in [0,10,30,60,120,300,600]: rtqs = RunnerTag.objects.filter( time__gte=v.start_time - datetime.timedelta(0,delta), time__lte=v.end_time + datetime.timedelta(0,delta), video__spectator=v.spectator, ) if rtqs.exists(): locobj = rtqs.order_by("-time").first() print "Used RunnerTag from a timespan of %d seconds around Video"%delta break puqs = PositionUpdate.objects.filter( time__gte=v.start_time - datetime.timedelta(0,delta), time__lte=v.end_time + datetime.timedelta(0,delta), spectator=v.spectator, ) if puqs.exists(): locobj = puqs.order_by("-time").first() print "Used PositionUpdate from a timespan of %d seconds around Video"%delta break if locobj and locobj.latitude != 0: point = (locobj.latitude, locobj.longitude) gppoint = Point(point) cachekey = "%.5f|%.5f"%point if cachekey in pointcache: bestpoints = pointcache[cachekey] else: candidateqs = rpqs.filter( latitude__gt = point[0] - lattolerance, latitude__lt = point[0] + lattolerance, longitude__gt = point[1] - longtolerance, longitude__lt = point[1] + longtolerance) candidatepoints = [ { "delta": distance.distance(Point(p.latitude,p.longitude),gppoint).m, "point": p} for p in candidateqs] candidatepoints = [p for p in candidatepoints if p["delta"] < maxtolerance] candidatepoints.sort(key=lambda p: p["delta"]) bestpoints = [] if not candidatepoints: print "Video is too far from the race" while candidatepoints: lastdist = candidatepoints[0]["point"].distance bestpoints.append(candidatepoints[0]) candidatepoints = [p for p in candidatepoints if p["delta"] < locobj.accuracy and abs(p["point"].distance-lastdist) > otherleg] pointcache[cachekey] = bestpoints if (len(bestpoints) > 1): print "Ambiguous location: %s"%(",".join(["%dm"%p["point"].distance for p in bestpoints])) pointcache[cachekey] = bestpoints for pt in bestpoints: VideoDistance.objects.create( video = v, reference_point = pt["point"], accuracy = max(10, locobj.accuracy, pt["delta"]) ) else: print "No location found for Video" print "%d video distances inserted"%VideoDistance.objects.filter(video__event=event).count()