list course view
This commit is contained in:
@@ -14,6 +14,8 @@ from utils import myqueue
|
||||
from matplotlib import path
|
||||
import xml.etree.ElementTree as et
|
||||
|
||||
import pandas as pd
|
||||
|
||||
ns = {'opengis': 'http://www.opengis.net/kml/2.2'}
|
||||
|
||||
import django_rq
|
||||
@@ -34,8 +36,59 @@ class InvalidTrajectoryError(Exception):
|
||||
def __str__(self):
|
||||
return repr(self.value)
|
||||
|
||||
def polygon_coord_center(polygon):
|
||||
|
||||
points = GeoPoint.objects.filter(polygon=polygon).order_by("order_in_poly")
|
||||
|
||||
latitudes = pd.Series([p.latitude for p in points])
|
||||
longitudes = pd.Series([p.longitude for p in points])
|
||||
|
||||
return latitudes.mean(), longitudes.mean()
|
||||
|
||||
def course_coord_center(course):
|
||||
|
||||
polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course")
|
||||
|
||||
latitudes = []
|
||||
longitudes = []
|
||||
|
||||
for p in polygons:
|
||||
latitude,longitude = polygon_coord_center(p)
|
||||
latitudes.append(latitude)
|
||||
longitudes.append(longitude)
|
||||
|
||||
latitude = pd.Series(latitudes).median()
|
||||
longitude = pd.Series(longitudes).median()
|
||||
|
||||
coordinates = pd.DataFrame({
|
||||
'latitude':latitudes,
|
||||
'longitude':longitudes,
|
||||
})
|
||||
|
||||
return latitude,longitude,coordinates
|
||||
|
||||
def course_coord_maxmin(course):
|
||||
|
||||
polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course")
|
||||
|
||||
latitudes = []
|
||||
longitudes = []
|
||||
|
||||
for p in polygons:
|
||||
latitude,longitude = polygon_coord_center(p)
|
||||
latitudes.append(latitude)
|
||||
longitudes.append(longitude)
|
||||
|
||||
lat_min = pd.Series(latitudes).min()
|
||||
lat_max = pd.Series(latitudes).max()
|
||||
long_min = pd.Series(longitudes).min()
|
||||
long_max = pd.Series(longitudes).max()
|
||||
|
||||
|
||||
return lat_min,lat_max,long_min,long_max
|
||||
|
||||
def polygon_to_path(polygon):
|
||||
points = GeoPoint.objects.filter(polygon==polygon).order_by(order_in_polygon)
|
||||
points = GeoPoint.objects.filter(polygon==polygon).order_by("order_in_polygon")
|
||||
s = []
|
||||
for point in points:
|
||||
s.append([point.latitude,point.longitude])
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import colorsys
|
||||
from rowers.models import Workout, User, Rower, WorkoutForm,RowerForm,GraphImage
|
||||
from rowers.models import (
|
||||
Workout, User, Rower, WorkoutForm,RowerForm,
|
||||
GraphImage,GeoPolygon,GeoCourse,GeoPoint
|
||||
)
|
||||
from rowingdata import rower as rrower
|
||||
from rowingdata import main as rmain
|
||||
from rowingdata import cumcpdata,histodata
|
||||
@@ -35,6 +38,10 @@ from bokeh.core.properties import value
|
||||
from collections import OrderedDict
|
||||
from django.conf import settings
|
||||
|
||||
from courses import (
|
||||
course_coord_center,course_coord_maxmin,
|
||||
)
|
||||
|
||||
import datetime
|
||||
import math
|
||||
import numpy as np
|
||||
@@ -707,6 +714,124 @@ def interactive_histoall(theworkouts):
|
||||
script, div = components(plot)
|
||||
return [script,div]
|
||||
|
||||
def course_map(course):
|
||||
latmean,lonmean,coordinates = course_coord_center(course)
|
||||
lat_min, lat_max, long_min, long_max = course_coord_maxmin(course)
|
||||
|
||||
scoordinates = "["
|
||||
|
||||
for index,row in coordinates.iterrows():
|
||||
scoordinates += """[{x},{y}],
|
||||
""".format(
|
||||
x=row['latitude'],
|
||||
y=row['longitude']
|
||||
)
|
||||
|
||||
scoordinates +="]"
|
||||
|
||||
polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course")
|
||||
|
||||
|
||||
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 += """
|
||||
]"""
|
||||
|
||||
|
||||
print pcoordinates
|
||||
|
||||
script = """
|
||||
<script>
|
||||
|
||||
|
||||
var streets = L.tileLayer('https://api.tiles.mapbox.com/v4/{{id}}/{{z}}/{{x}}/{{y}}.png?access_token=pk.eyJ1Ijoic2FuZGVycm9vc2VuZGFhbCIsImEiOiJjajY3aTRkeWQwNmx6MzJvMTN3andlcnBlIn0.MFG8Xt0kDeSA9j7puZQ9hA', {{
|
||||
maxZoom: 18,
|
||||
id: 'mapbox.streets'
|
||||
}}),
|
||||
|
||||
satellite = L.tileLayer('https://api.tiles.mapbox.com/v4/{{id}}/{{z}}/{{x}}/{{y}}.png?access_token=pk.eyJ1Ijoic2FuZGVycm9vc2VuZGFhbCIsImEiOiJjajY3aTRkeWQwNmx6MzJvMTN3andlcnBlIn0.MFG8Xt0kDeSA9j7puZQ9hA', {{
|
||||
maxZoom: 18,
|
||||
id: 'mapbox.satellite'
|
||||
}}),
|
||||
|
||||
outdoors = L.tileLayer('https://api.tiles.mapbox.com/v4/{{id}}/{{z}}/{{x}}/{{y}}.png?access_token=pk.eyJ1Ijoic2FuZGVycm9vc2VuZGFhbCIsImEiOiJjajY3aTRkeWQwNmx6MzJvMTN3andlcnBlIn0.MFG8Xt0kDeSA9j7puZQ9hA', {{
|
||||
maxZoom: 18,
|
||||
id: 'mapbox.outdoors'
|
||||
}});
|
||||
|
||||
|
||||
|
||||
var mymap = L.map('map_canvas', {{
|
||||
center: [{latmean}, {lonmean}],
|
||||
zoom: 13,
|
||||
layers: [streets, satellite]
|
||||
}}).setView([{latmean},{lonmean}], 13);
|
||||
|
||||
var navionics = new JNC.Leaflet.NavionicsOverlay({{
|
||||
navKey: 'Navionics_webapi_03205',
|
||||
chartType: JNC.NAVIONICS_CHARTS.NAUTICAL,
|
||||
isTransparent: true,
|
||||
zIndex: 1
|
||||
}});
|
||||
|
||||
|
||||
var osmUrl2='http://tiles.openseamap.org/seamark/{{z}}/{{x}}/{{y}}.png';
|
||||
var osmUrl='http://{{s}}.tile.openstreetmap.org/{{z}}/{{x}}/{{y}}.png';
|
||||
|
||||
|
||||
//create two TileLayer
|
||||
var nautical=new L.TileLayer(osmUrl,{{
|
||||
maxZoom:18}});
|
||||
|
||||
|
||||
L.control.layers({{
|
||||
"Streets": streets,
|
||||
"Satellite": satellite,
|
||||
"Outdoors": outdoors,
|
||||
"Nautical": nautical,
|
||||
}},{{
|
||||
"Navionics":navionics,
|
||||
}}).addTo(mymap);
|
||||
|
||||
var latlongs = {scoordinates}
|
||||
var polyline = L.polyline(latlongs, {{color:'red'}}).addTo(mymap)
|
||||
mymap.fitBounds(polyline.getBounds())
|
||||
|
||||
var platlongs = {pcoordinates}
|
||||
var polygons = L.polygon(platlongs, {{color:'blue'}}).addTo(mymap)
|
||||
|
||||
</script>
|
||||
""".format(
|
||||
latmean=latmean,
|
||||
lonmean=lonmean,
|
||||
scoordinates=scoordinates,
|
||||
pcoordinates=pcoordinates
|
||||
)
|
||||
|
||||
div = """
|
||||
<div id="map_canvas" style="width: 100%; height: 400px;"><p> </p></div>
|
||||
"""
|
||||
|
||||
return script,div
|
||||
|
||||
def leaflet_chart(lat,lon,name=""):
|
||||
if lat.empty or lon.empty:
|
||||
|
||||
1
rowers/templates/.#workout_view.html
Normal file
1
rowers/templates/.#workout_view.html
Normal file
@@ -0,0 +1 @@
|
||||
E408191@CZ27LT9RCGN72.9092:1519040360
|
||||
24
rowers/templates/course_view.html
Normal file
24
rowers/templates/course_view.html
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends "base.html" %}
|
||||
{% load staticfiles %}
|
||||
{% load rowerfilters %}
|
||||
{% block scripts %}
|
||||
{% include "monitorjobs.html" %}
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}{{ course.name }} {% endblock %}
|
||||
{% block og_title %}{{ course.name }} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="grid_12 alpha">
|
||||
|
||||
|
||||
<h1>{{ course.name }}</h1>
|
||||
|
||||
{{ mapdiv|safe }}
|
||||
|
||||
|
||||
{{ mapscript|safe }}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -32,8 +32,14 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for course in courses %}
|
||||
<td> {{ course.country }} </td>
|
||||
<td> {{ course.name }} </td>
|
||||
<td> {{ course.country }} </td>
|
||||
<td>
|
||||
{% if course.manager.user == user %}
|
||||
<a href="/rowers/courses/{{ course.id }}/edit">{{ course.name }}</a>
|
||||
{% else %}
|
||||
<a href="/rowers/courses/{{ course.id }}">{{ course.name }}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -485,6 +485,8 @@ urlpatterns = [
|
||||
url(r'^sessions/rower/(?P<rowerid>\d+)$',views.plannedsessions_view),
|
||||
url(r'^sessions/(?P<timeperiod>[\w\ ]+.*)/rower/(?P<rowerid>\d+)$',views.plannedsessions_view),
|
||||
url(r'^sessions/(?P<timeperiod>[\w\ ]+.*)$',views.plannedsessions_view),
|
||||
url(r'^courses/(?P<id>\d+)/edit$',views.course_edit_view,
|
||||
name='course_edit_view'),
|
||||
]
|
||||
|
||||
if settings.DEBUG:
|
||||
|
||||
@@ -8405,6 +8405,24 @@ def workout_comment_view(request,id=0):
|
||||
'form':form,
|
||||
})
|
||||
|
||||
@login_required()
|
||||
def course_edit_view(request,id=0):
|
||||
try:
|
||||
course = GeoCourse.objects.get(id=id)
|
||||
except GeoCourse.DoesNotExist:
|
||||
return Http404("Course doesn't exist")
|
||||
|
||||
|
||||
script,div = course_map(course)
|
||||
|
||||
return render(request, 'course_view.html',
|
||||
{
|
||||
'course':course,
|
||||
'mapscript':script,
|
||||
'mapdiv':div,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
# The basic edit page
|
||||
@login_required()
|
||||
|
||||
Reference in New Issue
Block a user