From e604350e238a02b1671d27e7d5a6ee0c4519d26c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 8 Oct 2021 16:24:58 +0200 Subject: [PATCH] working MPV --- rowers/courses.py | 6 +- rowers/forms.py | 36 ++-- rowers/interactiveplots.py | 269 ++++++++++++++++++++++++---- rowers/models.py | 4 + rowers/templates/course_view.html | 65 +++++++ rowers/templates/list_courses.html | 4 - rowers/templatetags/rowerfilters.py | 8 + rowers/views/racesviews.py | 57 ++++++ rowers/views/workoutviews.py | 6 +- 9 files changed, 401 insertions(+), 54 deletions(-) diff --git a/rowers/courses.py b/rowers/courses.py index 59048cd1..abc44597 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -63,18 +63,22 @@ def getnearestraces(lat_lon,races,whatisnear=150): return races -def getnearestcourses(lat_lon,courses,whatisnear=150): +def getnearestcourses(lat_lon,courses,whatisnear=150,strict=False): + print(lat_lon,whatisnear) newlist = [] counter = 0 for c in courses: coords = c.coord distance = howfaris(lat_lon,c) + if distance < whatisnear: newlist.append(c) counter += 1 if counter>0: courses = newlist + elif strict: + courses = newlist else: orders = [(c.id,howfaris(lat_lon,c)) for c in courses] orders = sorted(orders,key = lambda tup:tup[1]) diff --git a/rowers/forms.py b/rowers/forms.py index 6f27093e..db7daea4 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -1472,30 +1472,36 @@ class RaceResultFilterForm(forms.Form): entrycategory = forms.MultipleChoiceField( choices = [], label = 'Groups', - widget=forms.CheckboxSelectMultiple() + widget=forms.CheckboxSelectMultiple(), + required=False, ) def __init__(self, *args, **kwargs): - if 'records' in kwargs: - records = kwargs.pop('records',None) + records = kwargs.pop('records',None) + groups = kwargs.pop('groups',None) + + super(RaceResultFilterForm,self).__init__(*args,**kwargs) if records: # group - thecategories = [record.entrycategory for record in records] - thecategories = list(set(thecategories)) - if len(thecategories) <= 1: - del self.fields['entrycategory'] + if groups: + thecategories = [record.entrycategory for record in records] + thecategories = list(set(thecategories)) + if len(thecategories) <= 1: + del self.fields['entrycategory'] + else: + categorychoices = [] + for category in thecategories: + if category is not None: + categorychoices.append( + (category.id,category) + ) + self.fields['entrycategory'].choices = categorychoices + self.fields['entrycategory'].initial = [cat[0] for cat in categorychoices] else: - categorychoices = [] - for category in thecategories: - if category is not None: - categorychoices.append( - (category.id,category) - ) - self.fields['entrycategory'].choices = categorychoices - self.fields['entrycategory'].initial = [cat[0] for cat in categorychoices] + del self.fields['entrycategory'] # sex thesexes = [record.sex for record in records] diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 09bac286..f811b63d 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -66,7 +66,7 @@ from rowers.courses import ( ) from rowers import mytypes -from rowers.models import course_spline +from rowers.models import course_spline,VirtualRaceResult import datetime import math @@ -2419,47 +2419,185 @@ def course_map(course): return script,div -def leaflet_chart(lat,lon,name=""): - if lat.empty or lon.empty: # pragma: no cover - return [0,"invalid coordinate data"] +def get_map_script_course( + latmean, + lonmean, + latbegin, + latend, + longbegin, + longend, + scoordinates, + course, + ): + latmean,lonmean,coordinates = course_coord_center(course) + lat_min, lat_max, long_min, long_max = course_coord_maxmin(course) - # Throw out 0,0 - df = pd.DataFrame({ - 'lat':lat, - 'lon':lon - }) - - df = df.replace(0,np.nan) - df = df.loc[(df!=0).any(axis=1)] - df.fillna(method='bfill',axis=0,inplace=True) - df.fillna(method='ffill',axis=0,inplace=True) - lat = df['lat'] - lon = df['lon'] - if lat.empty or lon.empty: # pragma: no cover - return [0,"invalid coordinate data"] - - latmean = lat.mean() - lonmean = lon.mean() - - latbegin = lat[lat.index[0]] - longbegin = lon[lon.index[0]] - latend = lat[lat.index[-1]] - longend = lon[lon.index[-1]] - - coordinates = zip(lat,lon) + coordinates = course_spline(coordinates) scoordinates = "[" - for x,y in coordinates: + for index,row in coordinates.iterrows(): scoordinates += """[{x},{y}], """.format( - x=x, - y=y + x=row['latitude'], + y=row['longitude'] + ) + + scoordinates +="]" + + polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") + + plabels = '' + + for p in polygons: + coords = polygon_coord_center(p) + + plabels += """ + var marker = L.marker([{latbegin}, {longbegin}]).addTo(mymap); + marker.bindPopup("{name}"); + + """.format( + latbegin = coords[0], + longbegin = coords[1], + name = p.name ) - scoordinates += "]" + pcoordinates = """[ + """ + for p in polygons: + pcoordinates += """[ + [""" + + points = GeoPoint.objects.filter(polygon=p).order_by("order_in_poly") + + for pt in points: + pcoordinates += "[{x},{y}],".format( + x = pt.latitude, + y = pt.longitude + ) + + # remove last comma + pcoordinates = pcoordinates[:-1] + pcoordinates += """] + ], + """ + + pcoordinates += """ + ]""" + + script = """ + + """.format( + latmean=latmean, + lonmean=lonmean, + latbegin = latbegin, + latend=latend, + longbegin=longbegin, + longend=longend, + scoordinates=scoordinates, + pcoordinates=pcoordinates, + plabels=plabels + ) + + return script + + +def get_map_script( + latmean, + lonmean, + latbegin, + latend, + longbegin, + longend, + scoordinates, + ): script = """