def handle(self, *args, **options): event = get_event_from_options(options) print "Clearing Race results for %s" % event.name RaceResult.objects.filter(event=event).delete() if not options["file_name"]: print "Please give a JSON file name" return with open(options["file_name"], 'r') as json_file: result_list = json.loads(json_file.read()) for result in result_list: if result["club"]: club, created = RunningClub.objects.get_or_create( name=result["club"]) else: club = None finish_time_parts = [ int(k) for k in result["finish_time"].split(":") ] finish_time = 3600 * finish_time_parts[ 0] + 60 * finish_time_parts[1] + finish_time_parts[2] RaceResult.objects.create(event=event, finishing_time=finish_time, name=result["name"], runner_number=result["bib"], club=club) print "%d Race result objects created" % RaceResult.objects.filter( event=event).count()
def handle(self, *args, **options): event = get_event_from_options(options) print "Clearing Race results for %s"%event.name RaceResult.objects.filter(event=event).delete() if not options["file_name"]: print "Please give a JSON file name" return with open(options["file_name"],'r') as json_file: result_list = json.loads(json_file.read()) for result in result_list: if result["club"]: club, created = RunningClub.objects.get_or_create(name=result["club"]) else: club = None finish_time_parts = [int(k) for k in result["finish_time"].split(":")] finish_time = 3600 * finish_time_parts[0] + 60 * finish_time_parts[1] + finish_time_parts[2] RaceResult.objects.create( event = event, finishing_time = finish_time, name = result["name"], runner_number = result["bib"], club = club ) print "%d Race result objects created"%RaceResult.objects.filter(event=event).count()
def handle(self, *args, **options): event = get_event_from_options(options) print "Clearing Race points for %s"%event.name RacePoint.objects.filter(event=event).delete() if not options["file_name"]: print "Please give a JSON file name" return with open(options["file_name"],'r') as json_file: featurelist = json.loads(json_file.read()) basecourse = [] for feature in featurelist["features"]: if feature["geometry"]["type"] == "LineString": basecourse = feature["geometry"]["coordinates"] break basecourse = [(ll[1],ll[0]) for ll in basecourse] print "Base course made of %d points"%len(basecourse) RacePoint.objects.create( distance = 0, latitude = basecourse[0][0], longitude = basecourse[0][1], event = event ) totald = 0 pointpitch = 10 nxt = pointpitch for i,p in enumerate(basecourse): if i: lastp = basecourse[i-1] dist = distance.distance(Point(lastp),Point(p)).m distafterp = totald + dist while distafterp > nxt: kp = (nxt - totald)/dist latitude = (kp * p[0] + (1-kp) * lastp[0]) longitude = (kp * p[1] + (1-kp) * lastp[1]) RacePoint.objects.create( distance = nxt, latitude = latitude, longitude = longitude, event = event ) nxt += pointpitch totald = distafterp print "%d Race point objects created"%RacePoint.objects.filter(event=event).count()
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): def fromtimestamp(ts): return datetime.datetime.fromtimestamp(ts, pytz.utc) if options["file_name"] is None: print "Please enter a file name" return event = get_event_from_options(options) sqs = Spectator.objects.filter(videos__event=event).distinct() tqs = RunnerTag.objects.filter(video__event=event).exclude(runner_number=-99) vqs = Video.objects.filter(event=event) if options["online_only"]: tqs = tqs.filter(video__online=True) vqs = vqs.filter(online=True) videos_list = [] for v in vqs: video_obj = { "_id": v.guid, "start-time": v.start_time.strftime("%s"), "start-time-iso": v.start_time.isoformat(), "url": v.url, "spectator": v.spectator.guid, "duration": v.duration, "thumbnail": v.thumbnail, } locobj = None if v.runnertags.exists(): locobj = v.runnertags.first() print "Used 1st runner" else: for delta in [0,10,30,60,120,300,600]: 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 a timespan of %d seconds around Video"%delta break video_obj["latitude"] = getattr(locobj, "latitude", 0.) video_obj["longitude"] = getattr(locobj, "longitude", 0.) video_obj["accuracy"] = getattr(locobj, "accuracy", -1) videos_list.append(video_obj) #print video_obj export_obj = { "spectators": [{ "_id": s.guid, "name": s.name } for s in sqs], "tags": [{ "_id": t.guid, "runner_number": t.runner_number, "latitude": t.latitude, "longitude": t.longitude, "accuracy": t.accuracy, "time": t.time.strftime("%s"), "time-iso": t.time.isoformat(), "spectator": t.video.spectator.guid, "video": t.video.guid, "thumbnail": t.thumbnail, } for t in tqs], "videos": videos_list } with open(options["file_name"],'w') as json_file: json_file.write(json.dumps(export_obj,indent=4))
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()
def handle(self, *args, **options): def fromtimestamp(ts): return datetime.datetime.fromtimestamp(ts, pytz.utc) if options["file_name"] is None: print "Please enter a file name" return event = get_event_from_options(options) sqs = Spectator.objects.filter(videos__event=event).distinct() tqs = RunnerTag.objects.filter(video__event=event).exclude( runner_number=-99) vqs = Video.objects.filter(event=event) if options["online_only"]: tqs = tqs.filter(video__online=True) vqs = vqs.filter(online=True) videos_list = [] for v in vqs: video_obj = { "_id": v.guid, "start-time": v.start_time.strftime("%s"), "start-time-iso": v.start_time.isoformat(), "url": v.url, "spectator": v.spectator.guid, "duration": v.duration, "thumbnail": v.thumbnail, } locobj = None if v.runnertags.exists(): locobj = v.runnertags.first() print "Used 1st runner" else: for delta in [0, 10, 30, 60, 120, 300, 600]: 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 a timespan of %d seconds around Video" % delta break video_obj["latitude"] = getattr(locobj, "latitude", 0.) video_obj["longitude"] = getattr(locobj, "longitude", 0.) video_obj["accuracy"] = getattr(locobj, "accuracy", -1) videos_list.append(video_obj) #print video_obj export_obj = { "spectators": [{ "_id": s.guid, "name": s.name } for s in sqs], "tags": [{ "_id": t.guid, "runner_number": t.runner_number, "latitude": t.latitude, "longitude": t.longitude, "accuracy": t.accuracy, "time": t.time.strftime("%s"), "time-iso": t.time.isoformat(), "spectator": t.video.spectator.guid, "video": t.video.guid, "thumbnail": t.thumbnail, } for t in tqs], "videos": videos_list } with open(options["file_name"], 'w') as json_file: json_file.write(json.dumps(export_obj, indent=4))