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
Beispiel #2
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
Beispiel #3
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()