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()
Пример #2
0
 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()
Пример #3
0
    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()
Пример #4
0
    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
Пример #5
0
 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))
Пример #7
0
    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()
            
        
Пример #8
0
    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))