misc-fred/grandlyon/wcs-scripts/similar_map.py

65 lines
2.3 KiB
Python

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():
geolocate = GeolocateWorkflowStatusItem()
geolocate.method = 'address_string'
geolocate.address_string = '[form_var_numero] [form_var_voie], [form_var_commune], France'
coords = geolocate.geolocate_address_string(None)
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"><script>geojson_data = %s;</script>%s</div>
''' % (portal_user_url,
json.dumps(features),
map_widget.render())