grandlyon: generate geojson on the fly

This commit is contained in:
Frédéric Péters 2018-06-06 13:25:30 +02:00
parent ac52134db5
commit ded8b06699
2 changed files with 63 additions and 11 deletions

View File

@ -1,8 +1,16 @@
import inspect
import json
import os
from quixote import get_publisher
from pyproj import Proj, transform, Geod
from qommon import misc
from qommon.storage import Contains
from wcs.wf.geolocate import GeolocateWorkflowStatusItem
geod = Geod(ellps='WGS84')
formdef = form_objects.formdef
result = False
coords = vars().get('form_var_carte')
if not coords and 'form_var_numero' in vars():
@ -14,12 +22,15 @@ if not coords and 'form_var_numero' in vars():
if coords:
lat, lon = coords.split(';')
lat, lon = float(lat), float(lon)
lat1, lat2 = lat - 0.008, lat + 0.008
lon1, lon2 = lon - 0.006, lon + 0.006
geojson_file = os.path.join(get_publisher().app_dir, 'geojsons', form_slug + '.json')
for feature in json.load(open(geojson_file))['features']:
lon, lat = feature['geometry']['coordinates']
if lon > lon1 and lon < lon2 and lat > lat1 and lat < lat2:
applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_not_endpoint_status()]
formdatas = formdef.data_class().select([Contains('status', applied_filters)])
for formdata in formdatas:
if not formdata.geolocations:
continue
coords = misc.normalize_geolocation(formdata.geolocations['base'])
distance = geod.inv(coords['lon'], coords['lat'], lon, lat)[2]
if distance < 750:
result = True
break

View File

@ -1,8 +1,20 @@
from wcs.wf.geolocate import GeolocateWorkflowStatusItem
import inspect
import json
import time
from pyproj import Proj, transform, Geod
from qommon import misc
from qommon.storage import Contains
from qommon.form import MapWidget
from wcs.wf.geolocate import GeolocateWorkflowStatusItem
geod = Geod(ellps='WGS84')
result = ''
formdef = form_objects.formdef
coords = vars().get('form_var_carte')
if not coords and 'form_var_numero' in vars():
@ -13,11 +25,40 @@ if not coords and 'form_var_numero' in vars():
coords = '%(lat)s;%(lon)s' % coords
if coords:
print 'similar map'
lat, lon = coords.split(';')
lat, lon = float(lat), float(lon)
map_widget = MapWidget('geo', readonly=True, value=coords,
initial_zoom=16)
features = []
applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_not_endpoint_status()]
formdatas = formdef.data_class().select([Contains('status', applied_filters)])
for formdata in formdatas:
if not formdata.geolocations:
continue
coords = misc.normalize_geolocation(formdata.geolocations['base'])
distance = geod.inv(coords['lon'], coords['lat'], lon, lat)[2]
if distance < 750:
feature = {
'type': 'Feature',
'properties': {},
'geometry': {
'type': 'Point',
'coordinates': [coords['lon'], coords['lat']],
}
}
for field in formdef.fields:
if field.varname in ('numero', 'voie', 'commune', 'message', 'type_probleme'):
feature['properties'][field.varname] = formdata.data.get(field.id)
feature['properties']['datetime'] = time.strftime('%d/%m/%Y %H:%M', formdata.receipt_time)
feature['properties']['reference'] = '%s:%s' % (formdef.url_name, formdata.id)
features.append(feature)
result = '''
<link href="%s/static/css/combo.map.css" type="text/css" media="all" rel="stylesheet">
<div id="similar" data-geojson-url="%s">%s</div>
<div id="similar"><script>geojson_data = %s;</script>%s</div>
''' % (portal_user_url,
'/geojsons/%s.json' % form_slug,
json.dumps(features),
map_widget.render())